// THIS IS AUTO-GENERATED BY create.rb
var SimplePayload = [
    {name: "bigfib.cpp", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 134217728;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\nvar __ZTVN10__cxxabiv117__class_type_infoE = 13216;\nvar __ZTVN10__cxxabiv120__si_class_type_infoE = 13256;\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(14083);\n/* global initializers */ __ATINIT__.push({ func: function() { __GLOBAL__I_a() } });\n\n\n/* memory initializer */ allocate([70,105,98,32,91,0,0,0,93,32,61,32,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,108,108,0,0,0,0,0,116,104,0,0,0,0,0,0,115,111,109,101,0,0,0,0,114,97,110,100,0,0,0,0,56,0,0,0,0,0,0,0,184,0,0,0,1,0,0,0,2,0,0,0,200,255,255,255,200,255,255,255,184,0,0,0,3,0,0,0,4,0,0,0,78,83,116,51,95,95,49,49,57,98,97,115,105,99,95,111,115,116,114,105,110,103,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,0,0,208,51,0,0,112,0,0,0,8,13,0,0,0,0,0,0,56,0,0,0,0,0,0,0,8,13,0,0,5,0,0,0,6,0,0,0,200,255,255,255,200,255,255,255,8,13,0,0,7,0,0,0,8,0,0,0,0,0,0,0,120,1,0,0,9,0,0,0,10,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,105,110,103,98,117,102,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,0,0,0,0,0,0,208,51,0,0,48,1,0,0,0,12], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n/* memory initializer */ allocate([16,6,0,0,11,0,0,0,12,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,8,0,0,0,3,0,0,0,6,0,0,0,4,0,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,119,69,69,0,0,0,0,0,0,0,0,208,51,0,0,240,5,0,0,64,12,0,0,0,0,0,0,0,0,0,0,120,6,0,0,13,0,0,0,14,0,0,0,3,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,9,0,0,0,6,0,0,0,5,0,0,0,10,0,0,0,11,0,0,0,5,0,0,0,7,0,0,0,6,0,0,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,119,69,69,0,208,51,0,0,96,6,0,0,64,12,0,0,0,0,0,0,117,110,115,117,112,112,111,114,116,101,100,32,108,111,99,97,108,101,32,102,111,114,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,0,0,0,0,0,0,0,16,7,0,0,15,0,0,0,16,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,12,0,0,0,2,0,0,0,2,0,0,0,13,0,0,0,4,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,99,69,69,0,0,0,0,0,0,0,0,208,51,0,0,240,6,0,0,0,12,0,0,0,0,0,0,0,0,0,0,120,7,0,0,17,0,0,0,18,0,0,0,5,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,14,0,0,0,15,0,0,0,9,0,0,0,3,0,0,0,10,0,0,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,99,69,69,0,208,51,0,0,96,7,0,0,0,12,0,0,0,0,0,0,78,83,116,51,95,95,49,49,52,95,95,115,104,97,114,101,100,95,99,111,117,110,116,69,0,0,0,0,0,0,0,0,168,51,0,0,136,7,0,0,0,0,0,0,240,7,0,0,19,0,0,0,20,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,88,8,0,0,21,0,0,0,22,0,0,0,17,0,0,0,0,0,0,0,83,116,49,49,108,111,103,105,99,95,101,114,114,111,114,0,208,51,0,0,224,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,8,0,0,19,0,0,0,23,0,0,0,16,0,0,0,0,0,0,0,83,116,49,50,108,101,110,103,116,104,95,101,114,114,111,114,0,0,0,0,0,0,0,0,208,51,0,0,24,8,0,0,240,7,0,0,0,0,0,0,83,116,49,51,114,117,110,116,105,109,101,95,101,114,114,111,114,0,0,0,0,0,0,0,208,51,0,0,64,8,0,0,0,0,0,0,0,0,0,0,58,32,0,0,0,0,0,0,0,0,0,0,160,8,0,0,24,0,0,0,25,0,0,0,17,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,50,115,121,115,116,101,109,95,101,114,114,111,114,69,0,0,208,51,0,0,136,8,0,0,88,8,0,0,0,0,0,0,78,83,116,51,95,95,49,49,52,101,114,114,111,114,95,99,97,116,101,103,111,114,121,69,0,0,0,0,0,0,0,0,168,51,0,0,176,8,0,0,78,83,116,51,95,95,49,49,50,95,95,100,111,95,109,101,115,115,97,103,101,69,0,0,208,51,0,0,216,8,0,0,208,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,97,115,105,99,95,115,116,114,105,110,103,0,0,0,0,0,0,0,0,0,12,0,0,26,0,0,0,27,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,13,0,0,0,4,0,0,0,7,0,0,0,3,0,0,0,10,0,0,0,0,0,0,0,64,12,0,0,28,0,0,0,29,0,0,0,6,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,9,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,8,0,0,0,3,0,0,0,7,0,0,0,6,0,0,0,8,0,0,0,0,0,0,0,120,12,0,0,30,0,0,0,31,0,0,0,248,255,255,255,248,255,255,255,120,12,0,0,32,0,0,0,33,0,0,0,8,0,0,0,0,0,0,0,192,12,0,0,34,0,0,0,35,0,0,0,248,255,255,255,248,255,255,255,192,12,0,0,36,0,0,0,37,0,0,0,4,0,0,0,0,0,0,0,8,13,0,0,5,0,0,0,6,0,0,0,252,255,255,255,252,255,255,255,8,13,0,0,7,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,80,13,0,0,38,0,0,0,39,0,0,0,252,255,255,255,252,255,255,255,80,13,0,0,40,0,0,0,41,0,0,0,105,111,115,116,114,101,97,109,0,0,0,0,0,0,0,0,117,110,115,112,101,99,105,102,105,101,100,32,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,32,101,114,114,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,11,0,0,42,0,0,0,43,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,64,11,0,0,44,0,0,0,45,0,0,0,105,111,115,95,98,97,115,101,58,58,99,108,101,97,114,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,55,102,97,105,108,117,114,101,69,0,0,0,0,0,0,0,208,51,0,0,248,10,0,0,160,8,0,0,0,0,0,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,69,0,0,0,0,0,0,0,168,51,0,0,40,11,0,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,0,0,0,0,0,208,51,0,0,72,11,0,0,64,11,0,0,0,0,0,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,0,0,0,0,0,208,51,0,0,136,11,0,0,64,11,0,0,0,0,0,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,0,0,0,0,0,0,168,51,0,0,200,11,0,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,0,0,0,0,0,0,168,51,0,0,8,12,0,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,48,52,0,0,72,12,0,0,0,0,0,0,1,0,0,0,120,11,0,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,48,52,0,0,144,12,0,0,0,0,0,0,1,0,0,0,184,11,0,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,48,52,0,0,216,12,0,0,0,0,0,0,1,0,0,0,120,11,0,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,48,52,0,0,32,13,0,0,0,0,0,0,1,0,0,0,184,11,0,0,3,244,255,255,0,0,0,0,176,13,0,0,46,0,0,0,47,0,0,0,18,0,0,0,1,0,0,0,9,0,0,0,10,0,0,0,2,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,57,95,95,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,69,0,0,0,208,51,0,0,144,13,0,0,240,8,0,0,0,0,0,0,0,0,0,0,216,27,0,0,48,0,0,0,49,0,0,0,50,0,0,0,1,0,0,0,4,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,51,0,0,0,52,0,0,0,50,0,0,0,2,0,0,0,5,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,32,0,0,53,0,0,0,54,0,0,0,50,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102,65,66,67,68,69,70,120,88,43,45,112,80,105,73,110,78,0,0,0,0,0,0,0,0,37,112,0,0,0,0,0,0,0,0,0,0,72,33,0,0,55,0,0,0,56,0,0,0,50,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,34,0,0,57,0,0,0,58,0,0,0,50,0,0,0,4,0,0,0,5,0,0,0,23,0,0,0,6,0,0,0,24,0,0,0,1,0,0,0,2,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,34,0,0,59,0,0,0,60,0,0,0,50,0,0,0,8,0,0,0,9,0,0,0,25,0,0,0,10,0,0,0,26,0,0,0,3,0,0,0,4,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,37,112,0,0,0,0,0,0,0,0,0,0,200,29,0,0,61,0,0,0,62,0,0,0,50,0,0,0,19,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,1,0,0,0,248,255,255,255,200,29,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,58,37,77,58,37,83,37,109,47,37,100,47,37,121,37,89,45,37,109,45,37,100,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,37,72,58,37,77,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,104,30,0,0,63,0,0,0,64,0,0,0,50,0,0,0,27,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,2,0,0,0,248,255,255,255,104,30,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,37,0,0,0,89,0,0,0,45,0,0,0,37,0,0,0,109,0,0,0,45,0,0,0,37,0,0,0,100,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,248,30,0,0,65,0,0,0,66,0,0,0,50,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,31,0,0,67,0,0,0,68,0,0,0,50,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,28,0,0,69,0,0,0,70,0,0,0,50,0,0,0,35,0,0,0,36,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,37,0,0,0,11,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,28,0,0,71,0,0,0,72,0,0,0,50,0,0,0,38,0,0,0,39,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,40,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,28,0,0,73,0,0,0,74,0,0,0,50,0,0,0,41,0,0,0,42,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,43,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,29,0,0,75,0,0,0,76,0,0,0,50,0,0,0,44,0,0,0,45,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,46,0,0,0,29,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,35,0,0,77,0,0,0,78,0,0,0,50,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,0,0,0,0,0,37,76,102,0,0,0,0,0,109,111,110,101,121,95,103,101,116,32,101,114,114,111,114,0,0,0,0,0,192,35,0,0,79,0,0,0,80,0,0,0,50,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,0,0,0,0,0,0,0,0,0,80,36,0,0,81,0,0,0,82,0,0,0,50,0,0,0,1,0,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,46,48,76,102,0,0,0,0,0,0,0,224,36,0,0,83,0,0,0,84,0,0,0,50,0,0,0,2,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,31,0,0,85,0,0,0,86,0,0,0,50,0,0,0,13,0,0,0,12,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,31,0,0,87,0,0,0,88,0,0,0,50,0,0,0,14,0,0,0,13,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,118,101,99,116,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,176,27,0,0,89,0,0,0,90,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,24,0,0,91,0,0,0,92,0,0,0,50,0,0,0,11,0,0,0,15,0,0,0,12,0,0,0,16,0,0,0,13,0,0,0,1,0,0,0,17,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,25,0,0,93,0,0,0,94,0,0,0,50,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,47,0,0,0,48,0,0,0,5,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,27,0,0,95,0,0,0,96,0,0,0,50,0,0,0,50,0,0,0,51,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,0,0,0,0,136,27,0,0,97,0,0,0,98,0,0,0,50,0,0,0,52,0,0,0,53,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,116,114,117,101,0,0,0,0,116,0,0,0,114,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,102,0,0,0,97,0,0,0,108,0,0,0,115,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,109,47,37,100,47,37,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,97,32,37,98,32,37,100,32,37,72,58,37,77,58,37,83,32,37,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,97,0,0,0,32,0,0,0,37,0,0,0,98,0,0,0,32,0,0,0,37,0,0,0,100,0,0,0,32,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,108,111,99,97,108,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,0,0,0,0,0,0,0,192,23,0,0,99,0,0,0,100,0,0,0,50,0,0,0,0,0,0,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,102,97,99,101,116,69,0,0,0,208,51,0,0,168,23,0,0,168,7,0,0,0,0,0,0,0,0,0,0,80,24,0,0,99,0,0,0,101,0,0,0,50,0,0,0,18,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,14,0,0,0,19,0,0,0,15,0,0,0,20,0,0,0,16,0,0,0,5,0,0,0,21,0,0,0,6,0,0,0,0,0,0,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,119,69,69,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,48,99,116,121,112,101,95,98,97,115,101,69,0,0,0,0,168,51,0,0,48,24,0,0,48,52,0,0,24,24,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,24,0,0,2,0,0,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,99,69,69,0,0,0,0,0,0,0,48,52,0,0,112,24,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,24,0,0,2,0,0,0,0,0,0,0,32,25,0,0,99,0,0,0,102,0,0,0,50,0,0,0,3,0,0,0,4,0,0,0,7,0,0,0,54,0,0,0,55,0,0,0,8,0,0,0,56,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,99,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,50,99,111,100,101,99,118,116,95,98,97,115,101,69,0,0,168,51,0,0,0,25,0,0,48,52,0,0,216,24,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,24,25,0,0,2,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,119,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,0,48,52,0,0,64,25,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,24,25,0,0,2,0,0,0,0,0,0,0,224,25,0,0,99,0,0,0,103,0,0,0,50,0,0,0,5,0,0,0,6,0,0,0,9,0,0,0,57,0,0,0,58,0,0,0,10,0,0,0,59,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,115,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,48,52,0,0,184,25,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,24,25,0,0,2,0,0,0,0,0,0,0,88,26,0,0,99,0,0,0,104,0,0,0,50,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,60,0,0,0,61,0,0,0,12,0,0,0,62,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,105,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,48,52,0,0,48,26,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,24,25,0,0,2,0,0,0,0,0,0,0,208,26,0,0,99,0,0,0,105,0,0,0,50,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,60,0,0,0,61,0,0,0,12,0,0,0,62,0,0,0,78,83,116,51,95,95,49,49,54,95,95,110,97,114,114,111,119,95,116,111,95,117,116,102,56,73,76,106,51,50,69,69,69,0,0,0,0,0,0,0,208,51,0,0,168,26,0,0,88,26,0,0,0,0,0,0,0,0,0,0,56,27,0,0,99,0,0,0,106,0,0,0,50,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,60,0,0,0,61,0,0,0,12,0,0,0,62,0,0,0,78,83,116,51,95,95,49,49,55,95,95,119,105,100,101,110,95,102,114,111,109,95,117,116,102,56,73,76,106,51,50,69,69,69,0,0,0,0,0,0,208,51,0,0,16,27,0,0,88,26,0,0,0,0,0,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,99,69,69,0,0,0,0,208,51,0,0,72,27,0,0,192,23,0,0,0,0,0,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,119,69,69,0,0,0,0,208,51,0,0,112,27,0,0,192,23,0,0,0,0,0,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,95,95,105,109,112,69,0,0,0,208,51,0,0,152,27,0,0,192,23,0,0,0,0,0,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,99,69,69,0,0,0,0,0,208,51,0,0,192,27,0,0,192,23,0,0,0,0,0,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,119,69,69,0,0,0,0,0,208,51,0,0,232,27,0,0,192,23,0,0,0,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,48,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,95,98,97,115,101,69,0,0,0,0,168,51,0,0,48,28,0,0,48,52,0,0,16,28,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,28,0,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,49,69,69,69,0,0,0,0,0,48,52,0,0,112,28,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,28,0,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,48,69,69,69,0,0,0,0,0,48,52,0,0,176,28,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,28,0,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,49,69,69,69,0,0,0,0,0,48,52,0,0,240,28,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,28,0,0,2,0,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,57,116,105,109,101,95,98,97,115,101,69,0,0,0,0,0,0,168,51,0,0,120,29,0,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,99,69,69,0,0,0,0,0,0,0,168,51,0,0,152,29,0,0,48,52,0,0,48,29,0,0,0,0,0,0,3,0,0,0,192,23,0,0,2,0,0,0,144,29,0,0,2,0,0,0,192,29,0,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,119,69,69,0,0,0,0,0,0,0,168,51,0,0,56,30,0,0,48,52,0,0,240,29,0,0,0,0,0,0,3,0,0,0,192,23,0,0,2,0,0,0,144,29,0,0,2,0,0,0,96,30,0,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,49,48,95,95,116,105,109,101,95,112,117,116,69,0,0,0,0,168,51,0,0,216,30,0,0,48,52,0,0,144,30,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,240,30,0,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,48,52,0,0,24,31,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,240,30,0,0,0,8,0,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,99,69,69,0,0,0,0,78,83,116,51,95,95,49,49,51,109,101,115,115,97,103,101,115,95,98,97,115,101,69,0,168,51,0,0,152,31,0,0,48,52,0,0,128,31,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,176,31,0,0,2,0,0,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,119,69,69,0,0,0,0,48,52,0,0,216,31,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,176,31,0,0,2,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,99,69,69,0,0,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,103,101,116,95,98,97,115,101,69,0,0,0,0,0,0,0,0,168,51,0,0,112,32,0,0,48,52,0,0,88,32,0,0,0,0,0,0,1,0,0,0,144,32,0,0,0,0,0,0,48,52,0,0,16,32,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,152,32,0,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,119,69,69,0,0,0,48,52,0,0,24,33,0,0,0,0,0,0,1,0,0,0,144,32,0,0,0,0,0,0,48,52,0,0,208,32,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,48,33,0,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,99,69,69,0,0,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,112,117,116,95,98,97,115,101,69,0,0,0,0,0,0,0,0,168,51,0,0,200,33,0,0,48,52,0,0,176,33,0,0,0,0,0,0,1,0,0,0,232,33,0,0,0,0,0,0,48,52,0,0,104,33,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,240,33,0,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,119,69,69,0,0,0,48,52,0,0,112,34,0,0,0,0,0,0,1,0,0,0,232,33,0,0,0,0,0,0,48,52,0,0,40,34,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,136,34,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,99,69,69,0,0,0,0,0,0,0,0,168,51,0,0,8,35,0,0,48,52,0,0,192,34,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,40,35,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,119,69,69,0,0,0,0,0,0,0,0,168,51,0,0,152,35,0,0,48,52,0,0,80,35,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,184,35,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,99,69,69,0,0,0,0,0,0,0,0,168,51,0,0,40,36,0,0,48,52,0,0,224,35,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,72,36,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,119,69,69,0,0,0,0,0,0,0,0,168,51,0,0,184,36,0,0,48,52,0,0,112,36,0,0,0,0,0,0,2,0,0,0,192,23,0,0,2,0,0,0,216,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,77,0,0,0,0,0,0,80,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,114,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,99,0,0,0,104,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,105,0,0,0,108,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,117,0,0,0,115,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,116,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,111,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+1452);\n/* memory initializer */ allocate([74,97,110,117,97,114,121,0,70,101,98,114,117,97,114,121,0,0,0,0,0,0,0,0,77,97,114,99,104,0,0,0,65,112,114,105,108,0,0,0,77,97,121,0,0,0,0,0,74,117,110,101,0,0,0,0,74,117,108,121,0,0,0,0,65,117,103,117,115,116,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,78,111,118,101,109,98,101,114,0,0,0,0,0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,0,0,0,0,74,97,110,0,0,0,0,0,70,101,98,0,0,0,0,0,77,97,114,0,0,0,0,0,65,112,114,0,0,0,0,0,74,117,110,0,0,0,0,0,74,117,108,0,0,0,0,0,65,117,103,0,0,0,0,0,83,101,112,0,0,0,0,0,79,99,116,0,0,0,0,0,78,111,118,0,0,0,0,0,68,101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,110,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,114,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,117,0,0,0,114,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,117,110,100,97,121,0,0,77,111,110,100,97,121,0,0,84,117,101,115,100,97,121,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,0,0,0,0,70,114,105,100,97,121,0,0,83,97,116,117,114,100,97,121,0,0,0,0,0,0,0,0,83,117,110,0,0,0,0,0,77,111,110,0,0,0,0,0,84,117,101,0,0,0,0,0,87,101,100,0,0,0,0,0,84,104,117,0,0,0,0,0,70,114,105,0,0,0,0,0,83,97,116,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,51,0,0,107,0,0,0,108,0,0,0,63,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,99,97,115,116,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,168,51,0,0,248,50,0,0,83,116,56,98,97,100,95,99,97,115,116,0,0,0,0,0,208,51,0,0,16,51,0,0,0,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,208,51,0,0,48,51,0,0,8,51,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,208,51,0,0,104,51,0,0,88,51,0,0,0,0,0,0,0,0,0,0,144,51,0,0,109,0,0,0,110,0,0,0,111,0,0,0,112,0,0,0,22,0,0,0,14,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,24,52,0,0,109,0,0,0,113,0,0,0,111,0,0,0,112,0,0,0,22,0,0,0,15,0,0,0,2,0,0,0,7,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,208,51,0,0,240,51,0,0,144,51,0,0,0,0,0,0,0,0,0,0,120,52,0,0,109,0,0,0,114,0,0,0,111,0,0,0,112,0,0,0,22,0,0,0,16,0,0,0,3,0,0,0,8,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,208,51,0,0,80,52,0,0,144,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,54,0,0,115,0,0,0,116,0,0,0,64,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,208,51,0,0,168,54,0,0,0,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,110,97,110,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+11712);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  function _llvm_lifetime_end() {}\n\n  \n   \n  Module[\"_rand_r\"] = _rand_r;\n  \n  var ___rand_seed=allocate([0x0273459b, 0, 0, 0], \"i32\", ALLOC_STATIC); \n  Module[\"_rand\"] = _rand;\n\n  \n   \n  Module[\"_memset\"] = _memset;var _llvm_memset_p0i8_i32=_memset;\n\n   \n  Module[\"_i64Subtract\"] = _i64Subtract;\n\n   \n  Module[\"_i64Add\"] = _i64Add;\n\n  \n  function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()\n      return !!__ZSt18uncaught_exceptionv.uncaught_exception;\n    }\n  \n  \n  \n  function ___cxa_is_number_type(type) {\n      var isNumber = false;\n      try { if (type == __ZTIi) isNumber = true } catch(e){}\n      try { if (type == __ZTIj) isNumber = true } catch(e){}\n      try { if (type == __ZTIl) isNumber = true } catch(e){}\n      try { if (type == __ZTIm) isNumber = true } catch(e){}\n      try { if (type == __ZTIx) isNumber = true } catch(e){}\n      try { if (type == __ZTIy) isNumber = true } catch(e){}\n      try { if (type == __ZTIf) isNumber = true } catch(e){}\n      try { if (type == __ZTId) isNumber = true } catch(e){}\n      try { if (type == __ZTIe) isNumber = true } catch(e){}\n      try { if (type == __ZTIc) isNumber = true } catch(e){}\n      try { if (type == __ZTIa) isNumber = true } catch(e){}\n      try { if (type == __ZTIh) isNumber = true } catch(e){}\n      try { if (type == __ZTIs) isNumber = true } catch(e){}\n      try { if (type == __ZTIt) isNumber = true } catch(e){}\n      return isNumber;\n    }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {\n      if (possibility == 0) return false;\n      if (possibilityType == 0 || possibilityType == definiteType)\n        return true;\n      var possibility_type_info;\n      if (___cxa_is_number_type(possibilityType)) {\n        possibility_type_info = possibilityType;\n      } else {\n        var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;\n        possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];\n      }\n      switch (possibility_type_info) {\n      case 0: // possibility is a pointer\n        // See if definite type is a pointer\n        var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;\n        var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];\n        if (definite_type_info == 0) {\n          // Also a pointer; compare base types of pointers\n          var defPointerBaseAddr = definiteType+8;\n          var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];\n          var possPointerBaseAddr = possibilityType+8;\n          var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];\n          return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility);\n        } else\n          return false; // one pointer and one non-pointer\n      case 1: // class with no base class\n        return false;\n      case 2: // class with base class\n        var parentTypeAddr = possibilityType + 8;\n        var parentType = HEAP32[((parentTypeAddr)>>2)];\n        return ___cxa_does_inherit(definiteType, parentType, possibility);\n      default:\n        return false; // some unencountered type\n      }\n    }\n  \n  \n  \n  var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) {\n      if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; }\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n  \n  var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) {\n      if (thrown == -1) thrown = ___cxa_last_thrown_exception;\n      header = thrown - ___cxa_exception_header_size;\n      if (throwntype == -1) throwntype = HEAP32[((header)>>2)];\n      var typeArray = Array.prototype.slice.call(arguments, 2);\n  \n      // If throwntype is a pointer, this means a pointer has been\n      // thrown. When a pointer is thrown, actually what's thrown\n      // is a pointer to the pointer. We'll dereference it.\n      if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {\n        var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;\n        var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];\n        if (throwntypeInfo == 0)\n          thrown = HEAP32[((thrown)>>2)];\n      }\n      // The different catch blocks are denoted by different types.\n      // Due to inheritance, those types may not precisely match the\n      // type of the thrown object. Find one which matches, and\n      // return the type of the catch block which should be called.\n      for (var i = 0; i < typeArray.length; i++) {\n        if (___cxa_does_inherit(typeArray[i], throwntype, thrown))\n          return ((asm[\"setTempRet0\"](typeArray[i]),thrown)|0);\n      }\n      // Shouldn't happen unless we have bogus data in typeArray\n      // or encounter a type for which emscripten doesn't have suitable\n      // typeinfo defined. Best-efforts match just in case.\n      return ((asm[\"setTempRet0\"](throwntype),thrown)|0);\n    }function ___cxa_throw(ptr, type, destructor) {\n      if (!___cxa_throw.initialized) {\n        try {\n          HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        try {\n          HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        try {\n          HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        ___cxa_throw.initialized = true;\n      }\n      var header = ptr - ___cxa_exception_header_size;\n      HEAP32[((header)>>2)]=type;\n      HEAP32[(((header)+(4))>>2)]=destructor;\n      ___cxa_last_thrown_exception = ptr;\n      if (!(\"uncaught_exception\" in __ZSt18uncaught_exceptionv)) {\n        __ZSt18uncaught_exceptionv.uncaught_exception = 1;\n      } else {\n        __ZSt18uncaught_exceptionv.uncaught_exception++;\n      }\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n\n  function _pthread_mutex_lock() {}\n\n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }\n\n  \n  \n  \n  function _isspace(chr) {\n      return (chr == 32) || (chr >= 9 && chr <= 13);\n    }\n  function __parseInt64(str, endptr, base, min, max, unsign) {\n      var isNegative = false;\n      // Skip space.\n      while (_isspace(HEAP8[(str)])) str++;\n  \n      // Check for a plus/minus sign.\n      if (HEAP8[(str)] == 45) {\n        str++;\n        isNegative = true;\n      } else if (HEAP8[(str)] == 43) {\n        str++;\n      }\n  \n      // Find base.\n      var ok = false;\n      var finalBase = base;\n      if (!finalBase) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            finalBase = 16;\n            str += 2;\n          } else {\n            finalBase = 8;\n            ok = true; // we saw an initial zero, perhaps the entire thing is just \"0\"\n          }\n        }\n      } else if (finalBase==16) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            str += 2;\n          }\n        }\n      }\n      if (!finalBase) finalBase = 10;\n      var start = str;\n  \n      // Get digits.\n      var chr;\n      while ((chr = HEAP8[(str)]) != 0) {\n        var digit = parseInt(String.fromCharCode(chr), finalBase);\n        if (isNaN(digit)) {\n          break;\n        } else {\n          str++;\n          ok = true;\n        }\n      }\n  \n      if (!ok) {\n        ___setErrNo(ERRNO_CODES.EINVAL);\n        return ((asm[\"setTempRet0\"](0),0)|0);\n      }\n  \n      // Set end pointer.\n      if (endptr) {\n        HEAP32[((endptr)>>2)]=str;\n      }\n  \n      try {\n        var numberString = isNegative ? '-'+Pointer_stringify(start, str - start) : Pointer_stringify(start, str - start);\n        i64Math.fromString(numberString, finalBase, min, max, unsign);\n      } catch(e) {\n        ___setErrNo(ERRNO_CODES.ERANGE); // not quite correct\n      }\n  \n      return ((asm[\"setTempRet0\"](((HEAP32[(((tempDoublePtr)+(4))>>2)])|0)),((HEAP32[((tempDoublePtr)>>2)])|0))|0);\n    }function _strtoull(str, endptr, base) {\n      return __parseInt64(str, endptr, base, 0, '18446744073709551615', true);  // ULONG_MAX.\n    }function _strtoull_l(str, endptr, base) {\n      return _strtoull(str, endptr, base); // no locale support yet\n    }\n\n  function _sysconf(name) {\n      // long sysconf(int name);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html\n      switch(name) {\n        case 30: return PAGE_SIZE;\n        case 132:\n        case 133:\n        case 12:\n        case 137:\n        case 138:\n        case 15:\n        case 235:\n        case 16:\n        case 17:\n        case 18:\n        case 19:\n        case 20:\n        case 149:\n        case 13:\n        case 10:\n        case 236:\n        case 153:\n        case 9:\n        case 21:\n        case 22:\n        case 159:\n        case 154:\n        case 14:\n        case 77:\n        case 78:\n        case 139:\n        case 80:\n        case 81:\n        case 79:\n        case 82:\n        case 68:\n        case 67:\n        case 164:\n        case 11:\n        case 29:\n        case 47:\n        case 48:\n        case 95:\n        case 52:\n        case 51:\n        case 46:\n          return 200809;\n        case 27:\n        case 246:\n        case 127:\n        case 128:\n        case 23:\n        case 24:\n        case 160:\n        case 161:\n        case 181:\n        case 182:\n        case 242:\n        case 183:\n        case 184:\n        case 243:\n        case 244:\n        case 245:\n        case 165:\n        case 178:\n        case 179:\n        case 49:\n        case 50:\n        case 168:\n        case 169:\n        case 175:\n        case 170:\n        case 171:\n        case 172:\n        case 97:\n        case 76:\n        case 32:\n        case 173:\n        case 35:\n          return -1;\n        case 176:\n        case 177:\n        case 7:\n        case 155:\n        case 8:\n        case 157:\n        case 125:\n        case 126:\n        case 92:\n        case 93:\n        case 129:\n        case 130:\n        case 131:\n        case 94:\n        case 91:\n          return 1;\n        case 74:\n        case 60:\n        case 69:\n        case 70:\n        case 4:\n          return 1024;\n        case 31:\n        case 42:\n        case 72:\n          return 32;\n        case 87:\n        case 26:\n        case 33:\n          return 2147483647;\n        case 34:\n        case 1:\n          return 47839;\n        case 38:\n        case 36:\n          return 99;\n        case 43:\n        case 37:\n          return 2048;\n        case 0: return 2097152;\n        case 3: return 65536;\n        case 28: return 32768;\n        case 44: return 32767;\n        case 75: return 16384;\n        case 39: return 1000;\n        case 89: return 700;\n        case 71: return 256;\n        case 40: return 255;\n        case 2: return 100;\n        case 180: return 64;\n        case 25: return 20;\n        case 5: return 16;\n        case 6: return 6;\n        case 73: return 4;\n        case 84: return 1;\n      }\n      ___setErrNo(ERRNO_CODES.EINVAL);\n      return -1;\n    }\n\n  \n  \n  \n  \n  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {\n        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createSocket:function (family, type, protocol) {\n        var streaming = type == 1;\n        if (protocol) {\n          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp\n        }\n  \n        // create our internal socket structure\n        var sock = {\n          family: family,\n          type: type,\n          protocol: protocol,\n          server: null,\n          peers: {},\n          pending: [],\n          recv_queue: [],\n          sock_ops: SOCKFS.websocket_sock_ops\n        };\n  \n        // create the filesystem node to store the socket structure\n        var name = SOCKFS.nextname();\n        var node = FS.createNode(SOCKFS.root, name, 49152, 0);\n        node.sock = sock;\n  \n        // and the wrapping stream that enables library functions such\n        // as read and write to indirectly interact with the socket\n        var stream = FS.createStream({\n          path: name,\n          node: node,\n          flags: FS.modeStringToFlags('r+'),\n          seekable: false,\n          stream_ops: SOCKFS.stream_ops\n        });\n  \n        // map the new stream to the socket structure (sockets have a 1:1\n        // relationship with a stream)\n        sock.stream = stream;\n  \n        return sock;\n      },getSocket:function (fd) {\n        var stream = FS.getStream(fd);\n        if (!stream || !FS.isSocket(stream.node.mode)) {\n          return null;\n        }\n        return stream.node.sock;\n      },stream_ops:{poll:function (stream) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.poll(sock);\n        },ioctl:function (stream, request, varargs) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.ioctl(sock, request, varargs);\n        },read:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          var msg = sock.sock_ops.recvmsg(sock, length);\n          if (!msg) {\n            // socket is closed\n            return 0;\n          }\n          buffer.set(msg.buffer, offset);\n          return msg.buffer.length;\n        },write:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.sendmsg(sock, buffer, offset, length);\n        },close:function (stream) {\n          var sock = stream.node.sock;\n          sock.sock_ops.close(sock);\n        }},nextname:function () {\n        if (!SOCKFS.nextname.current) {\n          SOCKFS.nextname.current = 0;\n        }\n        return 'socket[' + (SOCKFS.nextname.current++) + ']';\n      },websocket_sock_ops:{createPeer:function (sock, addr, port) {\n          var ws;\n  \n          if (typeof addr === 'object') {\n            ws = addr;\n            addr = null;\n            port = null;\n          }\n  \n          if (ws) {\n            // for sockets that've already connected (e.g. we're the server)\n            // we can inspect the _socket property for the address\n            if (ws._socket) {\n              addr = ws._socket.remoteAddress;\n              port = ws._socket.remotePort;\n            }\n            // if we're just now initializing a connection to the remote,\n            // inspect the url property\n            else {\n              var result = /ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);\n              if (!result) {\n                throw new Error('WebSocket URL must be in the format ws(s)://address:port');\n              }\n              addr = result[1];\n              port = parseInt(result[2], 10);\n            }\n          } else {\n            // create the actual websocket object and connect\n            try {\n              var url = 'ws://' + addr + ':' + port;\n              // the node ws library API is slightly different than the browser's\n              var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];\n              // If node we use the ws library.\n              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];\n              ws = new WebSocket(url, opts);\n              ws.binaryType = 'arraybuffer';\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);\n            }\n          }\n  \n  \n          var peer = {\n            addr: addr,\n            port: port,\n            socket: ws,\n            dgram_send_queue: []\n          };\n  \n          SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);\n  \n          // if this is a bound dgram socket, send the port number first to allow\n          // us to override the ephemeral port reported to us by remotePort on the\n          // remote end.\n          if (sock.type === 2 && typeof sock.sport !== 'undefined') {\n            peer.dgram_send_queue.push(new Uint8Array([\n                255, 255, 255, 255,\n                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),\n                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)\n            ]));\n          }\n  \n          return peer;\n        },getPeer:function (sock, addr, port) {\n          return sock.peers[addr + ':' + port];\n        },addPeer:function (sock, peer) {\n          sock.peers[peer.addr + ':' + peer.port] = peer;\n        },removePeer:function (sock, peer) {\n          delete sock.peers[peer.addr + ':' + peer.port];\n        },handlePeerEvents:function (sock, peer) {\n          var first = true;\n  \n          var handleOpen = function () {\n            try {\n              var queued = peer.dgram_send_queue.shift();\n              while (queued) {\n                peer.socket.send(queued);\n                queued = peer.dgram_send_queue.shift();\n              }\n            } catch (e) {\n              // not much we can do here in the way of proper error handling as we've already\n              // lied and said this data was sent. shut it down.\n              peer.socket.close();\n            }\n          };\n  \n          function handleMessage(data) {\n            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer\n            data = new Uint8Array(data);  // make a typed array view on the array buffer\n  \n  \n            // if this is the port message, override the peer's port with it\n            var wasfirst = first;\n            first = false;\n            if (wasfirst &&\n                data.length === 10 &&\n                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&\n                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {\n              // update the peer's port and it's key in the peer map\n              var newport = ((data[8] << 8) | data[9]);\n              SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n              peer.port = newport;\n              SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n              return;\n            }\n  \n            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });\n          };\n  \n          if (ENVIRONMENT_IS_NODE) {\n            peer.socket.on('open', handleOpen);\n            peer.socket.on('message', function(data, flags) {\n              if (!flags.binary) {\n                return;\n              }\n              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer\n            });\n            peer.socket.on('error', function() {\n              // don't throw\n            });\n          } else {\n            peer.socket.onopen = handleOpen;\n            peer.socket.onmessage = function peer_socket_onmessage(event) {\n              handleMessage(event.data);\n            };\n          }\n        },poll:function (sock) {\n          if (sock.type === 1 && sock.server) {\n            // listen sockets should only say they're available for reading\n            // if there are pending clients.\n            return sock.pending.length ? (64 | 1) : 0;\n          }\n  \n          var mask = 0;\n          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets\n            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :\n            null;\n  \n          if (sock.recv_queue.length ||\n              !dest ||  // connection-less sockets are always ready to read\n              (dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed\n            mask |= (64 | 1);\n          }\n  \n          if (!dest ||  // connection-less sockets are always ready to write\n              (dest && dest.socket.readyState === dest.socket.OPEN)) {\n            mask |= 4;\n          }\n  \n          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {\n            mask |= 16;\n          }\n  \n          return mask;\n        },ioctl:function (sock, request, arg) {\n          switch (request) {\n            case 21531:\n              var bytes = 0;\n              if (sock.recv_queue.length) {\n                bytes = sock.recv_queue[0].data.length;\n              }\n              HEAP32[((arg)>>2)]=bytes;\n              return 0;\n            default:\n              return ERRNO_CODES.EINVAL;\n          }\n        },close:function (sock) {\n          // if we've spawned a listen server, close it\n          if (sock.server) {\n            try {\n              sock.server.close();\n            } catch (e) {\n            }\n            sock.server = null;\n          }\n          // close any peer connections\n          var peers = Object.keys(sock.peers);\n          for (var i = 0; i < peers.length; i++) {\n            var peer = sock.peers[peers[i]];\n            try {\n              peer.socket.close();\n            } catch (e) {\n            }\n            SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n          }\n          return 0;\n        },bind:function (sock, addr, port) {\n          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound\n          }\n          sock.saddr = addr;\n          sock.sport = port || _mkport();\n          // in order to emulate dgram sockets, we need to launch a listen server when\n          // binding on a connection-less socket\n          // note: this is only required on the server side\n          if (sock.type === 2) {\n            // close the existing server if it exists\n            if (sock.server) {\n              sock.server.close();\n              sock.server = null;\n            }\n            // swallow error operation not supported error that occurs when binding in the\n            // browser where this isn't supported\n            try {\n              sock.sock_ops.listen(sock, 0);\n            } catch (e) {\n              if (!(e instanceof FS.ErrnoError)) throw e;\n              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;\n            }\n          }\n        },connect:function (sock, addr, port) {\n          if (sock.server) {\n            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);\n          }\n  \n          // TODO autobind\n          // if (!sock.addr && sock.type == 2) {\n          // }\n  \n          // early out if we're already connected / in the middle of connecting\n          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {\n            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n            if (dest) {\n              if (dest.socket.readyState === dest.socket.CONNECTING) {\n                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);\n              } else {\n                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);\n              }\n            }\n          }\n  \n          // add the socket to our peer list and set our\n          // destination address / port to match\n          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n          sock.daddr = peer.addr;\n          sock.dport = peer.port;\n  \n          // always \"fail\" in non-blocking mode\n          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);\n        },listen:function (sock, backlog) {\n          if (!ENVIRONMENT_IS_NODE) {\n            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n          }\n          if (sock.server) {\n             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening\n          }\n          var WebSocketServer = require('ws').Server;\n          var host = sock.saddr;\n          sock.server = new WebSocketServer({\n            host: host,\n            port: sock.sport\n            // TODO support backlog\n          });\n  \n          sock.server.on('connection', function(ws) {\n            if (sock.type === 1) {\n              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);\n  \n              // create a peer on the new socket\n              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);\n              newsock.daddr = peer.addr;\n              newsock.dport = peer.port;\n  \n              // push to queue for accept to pick up\n              sock.pending.push(newsock);\n            } else {\n              // create a peer on the listen socket so calling sendto\n              // with the listen socket and an address will resolve\n              // to the correct client\n              SOCKFS.websocket_sock_ops.createPeer(sock, ws);\n            }\n          });\n          sock.server.on('closed', function() {\n            sock.server = null;\n          });\n          sock.server.on('error', function() {\n            // don't throw\n          });\n        },accept:function (listensock) {\n          if (!listensock.server) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          var newsock = listensock.pending.shift();\n          newsock.stream.flags = listensock.stream.flags;\n          return newsock;\n        },getname:function (sock, peer) {\n          var addr, port;\n          if (peer) {\n            if (sock.daddr === undefined || sock.dport === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            }\n            addr = sock.daddr;\n            port = sock.dport;\n          } else {\n            // TODO saddr and sport will be set for bind()'d UDP sockets, but what\n            // should we be returning for TCP sockets that've been connect()'d?\n            addr = sock.saddr || 0;\n            port = sock.sport || 0;\n          }\n          return { addr: addr, port: port };\n        },sendmsg:function (sock, buffer, offset, length, addr, port) {\n          if (sock.type === 2) {\n            // connection-less sockets will honor the message address,\n            // and otherwise fall back to the bound destination address\n            if (addr === undefined || port === undefined) {\n              addr = sock.daddr;\n              port = sock.dport;\n            }\n            // if there was no address to fall back to, error out\n            if (addr === undefined || port === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);\n            }\n          } else {\n            // connection-based sockets will only use the bound\n            addr = sock.daddr;\n            port = sock.dport;\n          }\n  \n          // find the peer for the destination address\n          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);\n  \n          // early out if not connected with a connection-based socket\n          if (sock.type === 1) {\n            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            } else if (dest.socket.readyState === dest.socket.CONNECTING) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // create a copy of the incoming data to send, as the WebSocket API\n          // doesn't work entirely with an ArrayBufferView, it'll just send\n          // the entire underlying buffer\n          var data;\n          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {\n            data = buffer.slice(offset, offset + length);\n          } else {  // ArrayBufferView\n            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);\n          }\n  \n          // if we're emulating a connection-less dgram socket and don't have\n          // a cached connection, queue the buffer to send upon connect and\n          // lie, saying the data was sent now.\n          if (sock.type === 2) {\n            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {\n              // if we're not connected, open a new connection\n              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n              }\n              dest.dgram_send_queue.push(data);\n              return length;\n            }\n          }\n  \n          try {\n            // send the actual data\n            dest.socket.send(data);\n            return length;\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n        },recvmsg:function (sock, length) {\n          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html\n          if (sock.type === 1 && sock.server) {\n            // tcp servers should not be recv()'ing on the listen socket\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n          }\n  \n          var queued = sock.recv_queue.shift();\n          if (!queued) {\n            if (sock.type === 1) {\n              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n  \n              if (!dest) {\n                // if we have a destination address but are not connected, error out\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n              }\n              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                // return null if the socket has closed\n                return null;\n              }\n              else {\n                // else, our socket is in a valid state but truly has nothing available\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n            } else {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's\n          // requeued TCP data it'll be an ArrayBufferView\n          var queuedLength = queued.data.byteLength || queued.data.length;\n          var queuedOffset = queued.data.byteOffset || 0;\n          var queuedBuffer = queued.data.buffer || queued.data;\n          var bytesRead = Math.min(length, queuedLength);\n          var res = {\n            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),\n            addr: queued.addr,\n            port: queued.port\n          };\n  \n  \n          // push back any unread data for TCP connections\n          if (sock.type === 1 && bytesRead < queuedLength) {\n            var bytesRemaining = queuedLength - bytesRead;\n            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);\n            sock.recv_queue.unshift(queued);\n          }\n  \n          return res;\n        }}};function _send(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _write(fd, buf, len);\n    }\n  \n  function _pwrite(fildes, buf, nbyte, offset) {\n      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _write(fildes, buf, nbyte) {\n      // ssize_t write(int fildes, const void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }\n  \n  function _fileno(stream) {\n      // int fileno(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) return -1;\n      return stream.fd;\n    }function _fwrite(ptr, size, nitems, stream) {\n      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html\n      var bytesToWrite = nitems * size;\n      if (bytesToWrite == 0) return 0;\n      var fd = _fileno(stream);\n      var bytesWritten = _write(fd, ptr, bytesToWrite);\n      if (bytesWritten == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return 0;\n      } else {\n        return Math.floor(bytesWritten / size);\n      }\n    }\n\n  \n  function _strtoll(str, endptr, base) {\n      return __parseInt64(str, endptr, base, '-9223372036854775808', '9223372036854775807');  // LLONG_MIN, LLONG_MAX.\n    }function _strtoll_l(str, endptr, base) {\n      return _strtoll(str, endptr, base); // no locale support yet\n    }\n\n\n\n  function _pthread_cond_broadcast() {\n      return 0;\n    }\n\n  \n  \n  function __exit(status) {\n      // void _exit(int status);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html\n      Module['exit'](status);\n    }function _exit(status) {\n      __exit(status);\n    }function __ZSt9terminatev() {\n      _exit(-1234);\n    }\n\n  \n  \n  function __parseInt(str, endptr, base, min, max, bits, unsign) {\n      // Skip space.\n      while (_isspace(HEAP8[(str)])) str++;\n  \n      // Check for a plus/minus sign.\n      var multiplier = 1;\n      if (HEAP8[(str)] == 45) {\n        multiplier = -1;\n        str++;\n      } else if (HEAP8[(str)] == 43) {\n        str++;\n      }\n  \n      // Find base.\n      var finalBase = base;\n      if (!finalBase) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            finalBase = 16;\n            str += 2;\n          } else {\n            finalBase = 8;\n            str++;\n          }\n        }\n      } else if (finalBase==16) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            str += 2;\n          }\n        }\n      }\n      if (!finalBase) finalBase = 10;\n  \n      // Get digits.\n      var chr;\n      var ret = 0;\n      while ((chr = HEAP8[(str)]) != 0) {\n        var digit = parseInt(String.fromCharCode(chr), finalBase);\n        if (isNaN(digit)) {\n          break;\n        } else {\n          ret = ret * finalBase + digit;\n          str++;\n        }\n      }\n  \n      // Apply sign.\n      ret *= multiplier;\n  \n      // Set end pointer.\n      if (endptr) {\n        HEAP32[((endptr)>>2)]=str;\n      }\n  \n      // Unsign if needed.\n      if (unsign) {\n        if (Math.abs(ret) > max) {\n          ret = max;\n          ___setErrNo(ERRNO_CODES.ERANGE);\n        } else {\n          ret = unSign(ret, bits);\n        }\n      }\n  \n      // Validate range.\n      if (ret > max || ret < min) {\n        ret = ret > max ? max : min;\n        ___setErrNo(ERRNO_CODES.ERANGE);\n      }\n  \n      if (bits == 64) {\n        return ((asm[\"setTempRet0\"]((tempDouble=ret,(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)),ret>>>0)|0);\n      }\n  \n      return ret;\n    }function _strtol(str, endptr, base) {\n      return __parseInt(str, endptr, base, -2147483648, 2147483647, 32);  // LONG_MIN, LONG_MAX.\n    }function _atoi(ptr) {\n      return _strtol(ptr, null, 10);\n    }\n\n  function _pthread_mutex_unlock() {}\n\n  \n  function _isxdigit(chr) {\n      return (chr >= 48 && chr <= 57) ||\n             (chr >= 97 && chr <= 102) ||\n             (chr >= 65 && chr <= 70);\n    }function _isxdigit_l(chr) {\n      return _isxdigit(chr); // no locale support yet\n    }\n\n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;\n\n  function _sbrk(bytes) {\n      // Implement a Linux-like 'memory area' for our 'process'.\n      // Changes the size of the memory area by |bytes|; returns the\n      // address of the previous top ('break') of the memory area\n      // We control the \"dynamic\" memory - DYNAMIC_BASE to DYNAMICTOP\n      var self = _sbrk;\n      if (!self.called) {\n        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned\n        self.called = true;\n        assert(Runtime.dynamicAlloc);\n        self.alloc = Runtime.dynamicAlloc;\n        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };\n      }\n      var ret = DYNAMICTOP;\n      if (bytes != 0) self.alloc(bytes);\n      return ret;  // Previous break location.\n    }\n\n  function _atexit(func, arg) {\n      __ATEXIT__.unshift({ func: func, arg: arg });\n    }\n\n  \n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;function _newlocale(mask, locale, base) {\n      return _malloc(4);\n    }\n\n   \n  Module[\"_memmove\"] = _memmove;\n\n  function ___errno_location() {\n      return ___errno_state;\n    }\n\n  var _BItoD=true;\n\n  function _catclose(catd) {\n      // int catclose (nl_catd catd)\n      return 0;\n    }\n\n  \n  \n  \n  function _free() {\n  }\n  Module[\"_free\"] = _free;function ___cxa_free_exception(ptr) {\n      try {\n        return _free(ptr - ___cxa_exception_header_size);\n      } catch(e) { // XXX FIXME\n      }\n    }\n  \n  var ___cxa_caught_exceptions=[];function ___cxa_end_catch() {\n      if (___cxa_end_catch.rethrown) {\n        ___cxa_end_catch.rethrown = false;\n        return;\n      }\n      // Clear state flag.\n      asm['setThrew'](0);\n      // Call destructor if one is registered then clear it.\n      var ptr = ___cxa_caught_exceptions.pop();\n      if (ptr) {\n        header = ptr - ___cxa_exception_header_size;\n        var destructor = HEAP32[(((header)+(4))>>2)];\n        if (destructor) {\n          Runtime.dynCall('vi', destructor, [ptr]);\n          HEAP32[(((header)+(4))>>2)]=0;\n        }\n        ___cxa_free_exception(ptr);\n        ___cxa_last_thrown_exception = 0;\n      }\n    }function ___cxa_rethrow() {\n      ___cxa_end_catch.rethrown = true;\n      var ptr = ___cxa_caught_exceptions.pop();\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n\n  function _abort() {\n      Module['abort']();\n    }\n\n  function _fmod(x, y) {\n      return x % y;\n    }\n\n  function ___cxa_guard_release() {}\n\n  function _ungetc(c, stream) {\n      // int ungetc(int c, FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) {\n        return -1;\n      }\n      if (c === -1) {\n        // do nothing for EOF character\n        return c;\n      }\n      c = unSign(c & 0xFF);\n      stream.ungotten.push(c);\n      stream.eof = false;\n      return c;\n    }\n\n  function _uselocale(locale) {\n      return 0;\n    }\n\n  \n  \n  \n   \n  Module[\"_strlen\"] = _strlen;\n  \n  function __reallyNegative(x) {\n      return x < 0 || (x === 0 && (1/x) === -Infinity);\n    }function __formatString(format, varargs) {\n      var textIndex = format;\n      var argIndex = 0;\n      function getNextArg(type) {\n        // NOTE: Explicitly ignoring type safety. Otherwise this fails:\n        //       int x = 4; printf(\"%c\\n\", (char)x);\n        var ret;\n        if (type === 'double') {\n          ret = (HEAP32[((tempDoublePtr)>>2)]=HEAP32[(((varargs)+(argIndex))>>2)],HEAP32[(((tempDoublePtr)+(4))>>2)]=HEAP32[(((varargs)+((argIndex)+(4)))>>2)],(+(HEAPF64[(tempDoublePtr)>>3])));\n        } else if (type == 'i64') {\n          ret = [HEAP32[(((varargs)+(argIndex))>>2)],\n                 HEAP32[(((varargs)+(argIndex+4))>>2)]];\n  \n        } else {\n          type = 'i32'; // varargs are always i32, i64, or double\n          ret = HEAP32[(((varargs)+(argIndex))>>2)];\n        }\n        argIndex += Runtime.getNativeFieldSize(type);\n        return ret;\n      }\n  \n      var ret = [];\n      var curr, next, currArg;\n      while(1) {\n        var startTextIndex = textIndex;\n        curr = HEAP8[(textIndex)];\n        if (curr === 0) break;\n        next = HEAP8[((textIndex+1)|0)];\n        if (curr == 37) {\n          // Handle flags.\n          var flagAlwaysSigned = false;\n          var flagLeftAlign = false;\n          var flagAlternative = false;\n          var flagZeroPad = false;\n          var flagPadSign = false;\n          flagsLoop: while (1) {\n            switch (next) {\n              case 43:\n                flagAlwaysSigned = true;\n                break;\n              case 45:\n                flagLeftAlign = true;\n                break;\n              case 35:\n                flagAlternative = true;\n                break;\n              case 48:\n                if (flagZeroPad) {\n                  break flagsLoop;\n                } else {\n                  flagZeroPad = true;\n                  break;\n                }\n              case 32:\n                flagPadSign = true;\n                break;\n              default:\n                break flagsLoop;\n            }\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          }\n  \n          // Handle width.\n          var width = 0;\n          if (next == 42) {\n            width = getNextArg('i32');\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          } else {\n            while (next >= 48 && next <= 57) {\n              width = width * 10 + (next - 48);\n              textIndex++;\n              next = HEAP8[((textIndex+1)|0)];\n            }\n          }\n  \n          // Handle precision.\n          var precisionSet = false, precision = -1;\n          if (next == 46) {\n            precision = 0;\n            precisionSet = true;\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n            if (next == 42) {\n              precision = getNextArg('i32');\n              textIndex++;\n            } else {\n              while(1) {\n                var precisionChr = HEAP8[((textIndex+1)|0)];\n                if (precisionChr < 48 ||\n                    precisionChr > 57) break;\n                precision = precision * 10 + (precisionChr - 48);\n                textIndex++;\n              }\n            }\n            next = HEAP8[((textIndex+1)|0)];\n          }\n          if (precision < 0) {\n            precision = 6; // Standard default.\n            precisionSet = false;\n          }\n  \n          // Handle integer sizes. WARNING: These assume a 32-bit architecture!\n          var argSize;\n          switch (String.fromCharCode(next)) {\n            case 'h':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 104) {\n                textIndex++;\n                argSize = 1; // char (actually i32 in varargs)\n              } else {\n                argSize = 2; // short (actually i32 in varargs)\n              }\n              break;\n            case 'l':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 108) {\n                textIndex++;\n                argSize = 8; // long long\n              } else {\n                argSize = 4; // long\n              }\n              break;\n            case 'L': // long long\n            case 'q': // int64_t\n            case 'j': // intmax_t\n              argSize = 8;\n              break;\n            case 'z': // size_t\n            case 't': // ptrdiff_t\n            case 'I': // signed ptrdiff_t or unsigned size_t\n              argSize = 4;\n              break;\n            default:\n              argSize = null;\n          }\n          if (argSize) textIndex++;\n          next = HEAP8[((textIndex+1)|0)];\n  \n          // Handle type specifier.\n          switch (String.fromCharCode(next)) {\n            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {\n              // Integer.\n              var signed = next == 100 || next == 105;\n              argSize = argSize || 4;\n              var currArg = getNextArg('i' + (argSize * 8));\n              var origArg = currArg;\n              var argText;\n              // Flatten i64-1 [low, high] into a (slightly rounded) double\n              if (argSize == 8) {\n                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);\n              }\n              // Truncate to requested size.\n              if (argSize <= 4) {\n                var limit = Math.pow(256, argSize) - 1;\n                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);\n              }\n              // Format the number.\n              var currAbsArg = Math.abs(currArg);\n              var prefix = '';\n              if (next == 100 || next == 105) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else\n                argText = reSign(currArg, 8 * argSize, 1).toString(10);\n              } else if (next == 117) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else\n                argText = unSign(currArg, 8 * argSize, 1).toString(10);\n                currArg = Math.abs(currArg);\n              } else if (next == 111) {\n                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);\n              } else if (next == 120 || next == 88) {\n                prefix = (flagAlternative && currArg != 0) ? '0x' : '';\n                if (argSize == 8 && i64Math) {\n                  if (origArg[1]) {\n                    argText = (origArg[1]>>>0).toString(16);\n                    var lower = (origArg[0]>>>0).toString(16);\n                    while (lower.length < 8) lower = '0' + lower;\n                    argText += lower;\n                  } else {\n                    argText = (origArg[0]>>>0).toString(16);\n                  }\n                } else\n                if (currArg < 0) {\n                  // Represent negative numbers in hex as 2's complement.\n                  currArg = -currArg;\n                  argText = (currAbsArg - 1).toString(16);\n                  var buffer = [];\n                  for (var i = 0; i < argText.length; i++) {\n                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));\n                  }\n                  argText = buffer.join('');\n                  while (argText.length < argSize * 2) argText = 'f' + argText;\n                } else {\n                  argText = currAbsArg.toString(16);\n                }\n                if (next == 88) {\n                  prefix = prefix.toUpperCase();\n                  argText = argText.toUpperCase();\n                }\n              } else if (next == 112) {\n                if (currAbsArg === 0) {\n                  argText = '(nil)';\n                } else {\n                  prefix = '0x';\n                  argText = currAbsArg.toString(16);\n                }\n              }\n              if (precisionSet) {\n                while (argText.length < precision) {\n                  argText = '0' + argText;\n                }\n              }\n  \n              // Add sign if needed\n              if (currArg >= 0) {\n                if (flagAlwaysSigned) {\n                  prefix = '+' + prefix;\n                } else if (flagPadSign) {\n                  prefix = ' ' + prefix;\n                }\n              }\n  \n              // Move sign to prefix so we zero-pad after the sign\n              if (argText.charAt(0) == '-') {\n                prefix = '-' + prefix;\n                argText = argText.substr(1);\n              }\n  \n              // Add padding.\n              while (prefix.length + argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad) {\n                    argText = '0' + argText;\n                  } else {\n                    prefix = ' ' + prefix;\n                  }\n                }\n              }\n  \n              // Insert the result into the buffer.\n              argText = prefix + argText;\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {\n              // Float.\n              var currArg = getNextArg('double');\n              var argText;\n              if (isNaN(currArg)) {\n                argText = 'nan';\n                flagZeroPad = false;\n              } else if (!isFinite(currArg)) {\n                argText = (currArg < 0 ? '-' : '') + 'inf';\n                flagZeroPad = false;\n              } else {\n                var isGeneral = false;\n                var effectivePrecision = Math.min(precision, 20);\n  \n                // Convert g/G to f/F or e/E, as per:\n                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html\n                if (next == 103 || next == 71) {\n                  isGeneral = true;\n                  precision = precision || 1;\n                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);\n                  if (precision > exponent && exponent >= -4) {\n                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);\n                    precision -= exponent + 1;\n                  } else {\n                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);\n                    precision--;\n                  }\n                  effectivePrecision = Math.min(precision, 20);\n                }\n  \n                if (next == 101 || next == 69) {\n                  argText = currArg.toExponential(effectivePrecision);\n                  // Make sure the exponent has at least 2 digits.\n                  if (/[eE][-+]\\d$/.test(argText)) {\n                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);\n                  }\n                } else if (next == 102 || next == 70) {\n                  argText = currArg.toFixed(effectivePrecision);\n                  if (currArg === 0 && __reallyNegative(currArg)) {\n                    argText = '-' + argText;\n                  }\n                }\n  \n                var parts = argText.split('e');\n                if (isGeneral && !flagAlternative) {\n                  // Discard trailing zeros and periods.\n                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&\n                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {\n                    parts[0] = parts[0].slice(0, -1);\n                  }\n                } else {\n                  // Make sure we have a period in alternative mode.\n                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';\n                  // Zero pad until required precision.\n                  while (precision > effectivePrecision++) parts[0] += '0';\n                }\n                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');\n  \n                // Capitalize 'E' if needed.\n                if (next == 69) argText = argText.toUpperCase();\n  \n                // Add sign.\n                if (currArg >= 0) {\n                  if (flagAlwaysSigned) {\n                    argText = '+' + argText;\n                  } else if (flagPadSign) {\n                    argText = ' ' + argText;\n                  }\n                }\n              }\n  \n              // Add padding.\n              while (argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {\n                    argText = argText[0] + '0' + argText.slice(1);\n                  } else {\n                    argText = (flagZeroPad ? '0' : ' ') + argText;\n                  }\n                }\n              }\n  \n              // Adjust case.\n              if (next < 97) argText = argText.toUpperCase();\n  \n              // Insert the result into the buffer.\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 's': {\n              // String.\n              var arg = getNextArg('i8*');\n              var argLength = arg ? _strlen(arg) : '(null)'.length;\n              if (precisionSet) argLength = Math.min(argLength, precision);\n              if (!flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              if (arg) {\n                for (var i = 0; i < argLength; i++) {\n                  ret.push(HEAPU8[((arg++)|0)]);\n                }\n              } else {\n                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));\n              }\n              if (flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              break;\n            }\n            case 'c': {\n              // Character.\n              if (flagLeftAlign) ret.push(getNextArg('i8'));\n              while (--width > 0) {\n                ret.push(32);\n              }\n              if (!flagLeftAlign) ret.push(getNextArg('i8'));\n              break;\n            }\n            case 'n': {\n              // Write the length written so far to the next parameter.\n              var ptr = getNextArg('i32*');\n              HEAP32[((ptr)>>2)]=ret.length;\n              break;\n            }\n            case '%': {\n              // Literal percent sign.\n              ret.push(curr);\n              break;\n            }\n            default: {\n              // Unknown specifiers remain untouched.\n              for (var i = startTextIndex; i < textIndex + 2; i++) {\n                ret.push(HEAP8[(i)]);\n              }\n            }\n          }\n          textIndex += 2;\n          // TODO: Support a/A (hex float) and m (last error) specifiers.\n          // TODO: Support %1${specifier} for arg selection.\n        } else {\n          ret.push(curr);\n          textIndex += 1;\n        }\n      }\n      return ret;\n    }function _snprintf(s, n, format, varargs) {\n      // int snprintf(char *restrict s, size_t n, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var result = __formatString(format, varargs);\n      var limit = (n === undefined) ? result.length\n                                    : Math.min(result.length, Math.max(n - 1, 0));\n      if (s < 0) {\n        s = -s;\n        var buf = _malloc(limit+1);\n        HEAP32[((s)>>2)]=buf;\n        s = buf;\n      }\n      for (var i = 0; i < limit; i++) {\n        HEAP8[(((s)+(i))|0)]=result[i];\n      }\n      if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0;\n      return result.length;\n    }function _vsnprintf(s, n, format, va_arg) {\n      return _snprintf(s, n, format, HEAP32[((va_arg)>>2)]);\n    }\n\n  \n  \n  \n  function __getFloat(text) {\n      return /^[+-]?[0-9]*\\.?[0-9]+([eE][+-]?[0-9]+)?/.exec(text);\n    }function __scanString(format, get, unget, varargs) {\n      if (!__scanString.whiteSpace) {\n        __scanString.whiteSpace = {};\n        __scanString.whiteSpace[32] = 1;\n        __scanString.whiteSpace[9] = 1;\n        __scanString.whiteSpace[10] = 1;\n        __scanString.whiteSpace[11] = 1;\n        __scanString.whiteSpace[12] = 1;\n        __scanString.whiteSpace[13] = 1;\n      }\n      // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf.\n      // TODO: Support all format specifiers.\n      format = Pointer_stringify(format);\n      var soFar = 0;\n      if (format.indexOf('%n') >= 0) {\n        // need to track soFar\n        var _get = get;\n        get = function get() {\n          soFar++;\n          return _get();\n        }\n        var _unget = unget;\n        unget = function unget() {\n          soFar--;\n          return _unget();\n        }\n      }\n      var formatIndex = 0;\n      var argsi = 0;\n      var fields = 0;\n      var argIndex = 0;\n      var next;\n  \n      mainLoop:\n      for (var formatIndex = 0; formatIndex < format.length;) {\n        if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') {\n          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n          argIndex += Runtime.getAlignSize('void*', null, true);\n          HEAP32[((argPtr)>>2)]=soFar;\n          formatIndex += 2;\n          continue;\n        }\n  \n        if (format[formatIndex] === '%') {\n          var nextC = format.indexOf('c', formatIndex+1);\n          if (nextC > 0) {\n            var maxx = 1;\n            if (nextC > formatIndex+1) {\n              var sub = format.substring(formatIndex+1, nextC);\n              maxx = parseInt(sub);\n              if (maxx != sub) maxx = 0;\n            }\n            if (maxx) {\n              var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n              argIndex += Runtime.getAlignSize('void*', null, true);\n              fields++;\n              for (var i = 0; i < maxx; i++) {\n                next = get();\n                HEAP8[((argPtr++)|0)]=next;\n                if (next === 0) return i > 0 ? fields : fields-1; // we failed to read the full length of this field\n              }\n              formatIndex += nextC - formatIndex + 1;\n              continue;\n            }\n          }\n        }\n  \n        // handle %[...]\n        if (format[formatIndex] === '%' && format.indexOf('[', formatIndex+1) > 0) {\n          var match = /\\%([0-9]*)\\[(\\^)?(\\]?[^\\]]*)\\]/.exec(format.substring(formatIndex));\n          if (match) {\n            var maxNumCharacters = parseInt(match[1]) || Infinity;\n            var negateScanList = (match[2] === '^');\n            var scanList = match[3];\n  \n            // expand \"middle\" dashs into character sets\n            var middleDashMatch;\n            while ((middleDashMatch = /([^\\-])\\-([^\\-])/.exec(scanList))) {\n              var rangeStartCharCode = middleDashMatch[1].charCodeAt(0);\n              var rangeEndCharCode = middleDashMatch[2].charCodeAt(0);\n              for (var expanded = ''; rangeStartCharCode <= rangeEndCharCode; expanded += String.fromCharCode(rangeStartCharCode++));\n              scanList = scanList.replace(middleDashMatch[1] + '-' + middleDashMatch[2], expanded);\n            }\n  \n            var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n            argIndex += Runtime.getAlignSize('void*', null, true);\n            fields++;\n  \n            for (var i = 0; i < maxNumCharacters; i++) {\n              next = get();\n              if (negateScanList) {\n                if (scanList.indexOf(String.fromCharCode(next)) < 0) {\n                  HEAP8[((argPtr++)|0)]=next;\n                } else {\n                  unget();\n                  break;\n                }\n              } else {\n                if (scanList.indexOf(String.fromCharCode(next)) >= 0) {\n                  HEAP8[((argPtr++)|0)]=next;\n                } else {\n                  unget();\n                  break;\n                }\n              }\n            }\n  \n            // write out null-terminating character\n            HEAP8[((argPtr++)|0)]=0;\n            formatIndex += match[0].length;\n            \n            continue;\n          }\n        }      \n        // remove whitespace\n        while (1) {\n          next = get();\n          if (next == 0) return fields;\n          if (!(next in __scanString.whiteSpace)) break;\n        }\n        unget();\n  \n        if (format[formatIndex] === '%') {\n          formatIndex++;\n          var suppressAssignment = false;\n          if (format[formatIndex] == '*') {\n            suppressAssignment = true;\n            formatIndex++;\n          }\n          var maxSpecifierStart = formatIndex;\n          while (format[formatIndex].charCodeAt(0) >= 48 &&\n                 format[formatIndex].charCodeAt(0) <= 57) {\n            formatIndex++;\n          }\n          var max_;\n          if (formatIndex != maxSpecifierStart) {\n            max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10);\n          }\n          var long_ = false;\n          var half = false;\n          var longLong = false;\n          if (format[formatIndex] == 'l') {\n            long_ = true;\n            formatIndex++;\n            if (format[formatIndex] == 'l') {\n              longLong = true;\n              formatIndex++;\n            }\n          } else if (format[formatIndex] == 'h') {\n            half = true;\n            formatIndex++;\n          }\n          var type = format[formatIndex];\n          formatIndex++;\n          var curr = 0;\n          var buffer = [];\n          // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later\n          if (type == 'f' || type == 'e' || type == 'g' ||\n              type == 'F' || type == 'E' || type == 'G') {\n            next = get();\n            while (next > 0 && (!(next in __scanString.whiteSpace)))  {\n              buffer.push(String.fromCharCode(next));\n              next = get();\n            }\n            var m = __getFloat(buffer.join(''));\n            var last = m ? m[0].length : 0;\n            for (var i = 0; i < buffer.length - last + 1; i++) {\n              unget();\n            }\n            buffer.length = last;\n          } else {\n            next = get();\n            var first = true;\n            \n            // Strip the optional 0x prefix for %x.\n            if ((type == 'x' || type == 'X') && (next == 48)) {\n              var peek = get();\n              if (peek == 120 || peek == 88) {\n                next = get();\n              } else {\n                unget();\n              }\n            }\n            \n            while ((curr < max_ || isNaN(max_)) && next > 0) {\n              if (!(next in __scanString.whiteSpace) && // stop on whitespace\n                  (type == 's' ||\n                   ((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) ||\n                                                                     (first && next == 45))) ||\n                   ((type === 'x' || type === 'X') && (next >= 48 && next <= 57 ||\n                                     next >= 97 && next <= 102 ||\n                                     next >= 65 && next <= 70))) &&\n                  (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up\n                buffer.push(String.fromCharCode(next));\n                next = get();\n                curr++;\n                first = false;\n              } else {\n                break;\n              }\n            }\n            unget();\n          }\n          if (buffer.length === 0) return 0;  // Failure.\n          if (suppressAssignment) continue;\n  \n          var text = buffer.join('');\n          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n          argIndex += Runtime.getAlignSize('void*', null, true);\n          switch (type) {\n            case 'd': case 'u': case 'i':\n              if (half) {\n                HEAP16[((argPtr)>>1)]=parseInt(text, 10);\n              } else if (longLong) {\n                (tempI64 = [parseInt(text, 10)>>>0,(tempDouble=parseInt(text, 10),(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]);\n              } else {\n                HEAP32[((argPtr)>>2)]=parseInt(text, 10);\n              }\n              break;\n            case 'X':\n            case 'x':\n              HEAP32[((argPtr)>>2)]=parseInt(text, 16);\n              break;\n            case 'F':\n            case 'f':\n            case 'E':\n            case 'e':\n            case 'G':\n            case 'g':\n            case 'E':\n              // fallthrough intended\n              if (long_) {\n                HEAPF64[((argPtr)>>3)]=parseFloat(text);\n              } else {\n                HEAPF32[((argPtr)>>2)]=parseFloat(text);\n              }\n              break;\n            case 's':\n              var array = intArrayFromString(text);\n              for (var j = 0; j < array.length; j++) {\n                HEAP8[(((argPtr)+(j))|0)]=array[j];\n              }\n              break;\n          }\n          fields++;\n        } else if (format[formatIndex].charCodeAt(0) in __scanString.whiteSpace) {\n          next = get();\n          while (next in __scanString.whiteSpace) {\n            if (next <= 0) break mainLoop;  // End of input.\n            next = get();\n          }\n          unget(next);\n          formatIndex++;\n        } else {\n          // Not a specifier.\n          next = get();\n          if (format[formatIndex].charCodeAt(0) !== next) {\n            unget(next);\n            break mainLoop;\n          }\n          formatIndex++;\n        }\n      }\n      return fields;\n    }function _sscanf(s, format, varargs) {\n      // int sscanf(const char *restrict s, const char *restrict format, ... );\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html\n      var index = 0;\n      function get() { return HEAP8[(((s)+(index++))|0)]; };\n      function unget() { index--; };\n      return __scanString(format, get, unget, varargs);\n    }function _vsscanf(s, format, va_arg) {\n      return _sscanf(s, format, HEAP32[((va_arg)>>2)]);\n    }\n\n\n\n  \n  \n  \n  function _recv(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _read(fd, buf, len);\n    }\n  \n  function _pread(fildes, buf, nbyte, offset) {\n      // ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.read(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _read(fildes, buf, nbyte) {\n      // ssize_t read(int fildes, void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.read(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _fread(ptr, size, nitems, stream) {\n      // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html\n      var bytesToRead = nitems * size;\n      if (bytesToRead == 0) {\n        return 0;\n      }\n      var bytesRead = 0;\n      var streamObj = FS.getStreamFromPtr(stream);\n      if (!streamObj) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return 0;\n      }\n      while (streamObj.ungotten.length && bytesToRead > 0) {\n        HEAP8[((ptr++)|0)]=streamObj.ungotten.pop();\n        bytesToRead--;\n        bytesRead++;\n      }\n      var err = _read(streamObj.fd, ptr, bytesToRead);\n      if (err == -1) {\n        if (streamObj) streamObj.error = true;\n        return 0;\n      }\n      bytesRead += err;\n      if (bytesRead < bytesToRead) streamObj.eof = true;\n      return Math.floor(bytesRead / size);\n    }function _fgetc(stream) {\n      // int fgetc(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html\n      var streamObj = FS.getStreamFromPtr(stream);\n      if (!streamObj) return -1;\n      if (streamObj.eof || streamObj.error) return -1;\n      var ret = _fread(_fgetc.ret, 1, 1, stream);\n      if (ret == 0) {\n        return -1;\n      } else if (ret == -1) {\n        streamObj.error = true;\n        return -1;\n      } else {\n        return HEAPU8[((_fgetc.ret)|0)];\n      }\n    }\n\n  var _llvm_memmove_p0i8_p0i8_i32=_memmove;\n\n  var ___cxa_atexit=_atexit;\n\n  \n  function _strerror_r(errnum, strerrbuf, buflen) {\n      if (errnum in ERRNO_MESSAGES) {\n        if (ERRNO_MESSAGES[errnum].length > buflen - 1) {\n          return ___setErrNo(ERRNO_CODES.ERANGE);\n        } else {\n          var msg = ERRNO_MESSAGES[errnum];\n          writeAsciiToMemory(msg, strerrbuf);\n          return 0;\n        }\n      } else {\n        return ___setErrNo(ERRNO_CODES.EINVAL);\n      }\n    }function _strerror(errnum) {\n      if (!_strerror.buffer) _strerror.buffer = _malloc(256);\n      _strerror_r(errnum, _strerror.buffer, 256);\n      return _strerror.buffer;\n    }\n\n  \n  \n  function __isLeapYear(year) {\n        return year%4 === 0 && (year%100 !== 0 || year%400 === 0);\n    }\n  \n  function __arraySum(array, index) {\n      var sum = 0;\n      for (var i = 0; i <= index; sum += array[i++]);\n      return sum;\n    }\n  \n  \n  var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];\n  \n  var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) {\n      var newDate = new Date(date.getTime());\n      while(days > 0) {\n        var leap = __isLeapYear(newDate.getFullYear());\n        var currentMonth = newDate.getMonth();\n        var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];\n  \n        if (days > daysInCurrentMonth-newDate.getDate()) {\n          // we spill over to next month\n          days -= (daysInCurrentMonth-newDate.getDate()+1);\n          newDate.setDate(1);\n          if (currentMonth < 11) {\n            newDate.setMonth(currentMonth+1)\n          } else {\n            newDate.setMonth(0);\n            newDate.setFullYear(newDate.getFullYear()+1);\n          }\n        } else {\n          // we stay in current month \n          newDate.setDate(newDate.getDate()+days);\n          return newDate;\n        }\n      }\n  \n      return newDate;\n    }function _strftime(s, maxsize, format, tm) {\n      // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html\n      \n      var date = {\n        tm_sec: HEAP32[((tm)>>2)],\n        tm_min: HEAP32[(((tm)+(4))>>2)],\n        tm_hour: HEAP32[(((tm)+(8))>>2)],\n        tm_mday: HEAP32[(((tm)+(12))>>2)],\n        tm_mon: HEAP32[(((tm)+(16))>>2)],\n        tm_year: HEAP32[(((tm)+(20))>>2)],\n        tm_wday: HEAP32[(((tm)+(24))>>2)],\n        tm_yday: HEAP32[(((tm)+(28))>>2)],\n        tm_isdst: HEAP32[(((tm)+(32))>>2)]\n      };\n  \n      var pattern = Pointer_stringify(format);\n  \n      // expand format\n      var EXPANSION_RULES_1 = {\n        '%c': '%a %b %d %H:%M:%S %Y',     // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug  3 14:02:01 2013\n        '%D': '%m/%d/%y',                 // Equivalent to %m / %d / %y\n        '%F': '%Y-%m-%d',                 // Equivalent to %Y - %m - %d\n        '%h': '%b',                       // Equivalent to %b\n        '%r': '%I:%M:%S %p',              // Replaced by the time in a.m. and p.m. notation\n        '%R': '%H:%M',                    // Replaced by the time in 24-hour notation\n        '%T': '%H:%M:%S',                 // Replaced by the time\n        '%x': '%m/%d/%y',                 // Replaced by the locale's appropriate date representation\n        '%X': '%H:%M:%S',                 // Replaced by the locale's appropriate date representation\n      };\n      for (var rule in EXPANSION_RULES_1) {\n        pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);\n      }\n  \n      var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n      var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n  \n      function leadingSomething(value, digits, character) {\n        var str = typeof value === 'number' ? value.toString() : (value || '');\n        while (str.length < digits) {\n          str = character[0]+str;\n        }\n        return str;\n      };\n  \n      function leadingNulls(value, digits) {\n        return leadingSomething(value, digits, '0');\n      };\n  \n      function compareByDay(date1, date2) {\n        function sgn(value) {\n          return value < 0 ? -1 : (value > 0 ? 1 : 0);\n        };\n  \n        var compare;\n        if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) {\n          if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) {\n            compare = sgn(date1.getDate()-date2.getDate());\n          }\n        }\n        return compare;\n      };\n  \n      function getFirstWeekStartDate(janFourth) {\n          switch (janFourth.getDay()) {\n            case 0: // Sunday\n              return new Date(janFourth.getFullYear()-1, 11, 29);\n            case 1: // Monday\n              return janFourth;\n            case 2: // Tuesday\n              return new Date(janFourth.getFullYear(), 0, 3);\n            case 3: // Wednesday\n              return new Date(janFourth.getFullYear(), 0, 2);\n            case 4: // Thursday\n              return new Date(janFourth.getFullYear(), 0, 1);\n            case 5: // Friday\n              return new Date(janFourth.getFullYear()-1, 11, 31);\n            case 6: // Saturday\n              return new Date(janFourth.getFullYear()-1, 11, 30);\n          }\n      };\n  \n      function getWeekBasedYear(date) {\n          var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);\n  \n          var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);\n          var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4);\n  \n          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n  \n          if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {\n            // this date is after the start of the first week of this year\n            if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {\n              return thisDate.getFullYear()+1;\n            } else {\n              return thisDate.getFullYear();\n            }\n          } else { \n            return thisDate.getFullYear()-1;\n          }\n      };\n  \n      var EXPANSION_RULES_2 = {\n        '%a': function(date) {\n          return WEEKDAYS[date.tm_wday].substring(0,3);\n        },\n        '%A': function(date) {\n          return WEEKDAYS[date.tm_wday];\n        },\n        '%b': function(date) {\n          return MONTHS[date.tm_mon].substring(0,3);\n        },\n        '%B': function(date) {\n          return MONTHS[date.tm_mon];\n        },\n        '%C': function(date) {\n          var year = date.tm_year+1900;\n          return leadingNulls(Math.floor(year/100),2);\n        },\n        '%d': function(date) {\n          return leadingNulls(date.tm_mday, 2);\n        },\n        '%e': function(date) {\n          return leadingSomething(date.tm_mday, 2, ' ');\n        },\n        '%g': function(date) {\n          // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. \n          // In this system, weeks begin on a Monday and week 1 of the year is the week that includes \n          // January 4th, which is also the week that includes the first Thursday of the year, and \n          // is also the first week that contains at least four days in the year. \n          // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of \n          // the last week of the preceding year; thus, for Saturday 2nd January 1999, \n          // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, \n          // or 31st is a Monday, it and any following days are part of week 1 of the following year. \n          // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01.\n          \n          return getWeekBasedYear(date).toString().substring(2);\n        },\n        '%G': function(date) {\n          return getWeekBasedYear(date);\n        },\n        '%H': function(date) {\n          return leadingNulls(date.tm_hour, 2);\n        },\n        '%I': function(date) {\n          return leadingNulls(date.tm_hour < 13 ? date.tm_hour : date.tm_hour-12, 2);\n        },\n        '%j': function(date) {\n          // Day of the year (001-366)\n          return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3);\n        },\n        '%m': function(date) {\n          return leadingNulls(date.tm_mon+1, 2);\n        },\n        '%M': function(date) {\n          return leadingNulls(date.tm_min, 2);\n        },\n        '%n': function() {\n          return '\\n';\n        },\n        '%p': function(date) {\n          if (date.tm_hour > 0 && date.tm_hour < 13) {\n            return 'AM';\n          } else {\n            return 'PM';\n          }\n        },\n        '%S': function(date) {\n          return leadingNulls(date.tm_sec, 2);\n        },\n        '%t': function() {\n          return '\\t';\n        },\n        '%u': function(date) {\n          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);\n          return day.getDay() || 7;\n        },\n        '%U': function(date) {\n          // Replaced by the week number of the year as a decimal number [00,53]. \n          // The first Sunday of January is the first day of week 1; \n          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]\n          var janFirst = new Date(date.tm_year+1900, 0, 1);\n          var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay());\n          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);\n          \n          // is target date after the first Sunday?\n          if (compareByDay(firstSunday, endDate) < 0) {\n            // calculate difference in days between first Sunday and endDate\n            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;\n            var firstSundayUntilEndJanuary = 31-firstSunday.getDate();\n            var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();\n            return leadingNulls(Math.ceil(days/7), 2);\n          }\n  \n          return compareByDay(firstSunday, janFirst) === 0 ? '01': '00';\n        },\n        '%V': function(date) {\n          // Replaced by the week number of the year (Monday as the first day of the week) \n          // as a decimal number [01,53]. If the week containing 1 January has four \n          // or more days in the new year, then it is considered week 1. \n          // Otherwise, it is the last week of the previous year, and the next week is week 1. \n          // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday]\n          var janFourthThisYear = new Date(date.tm_year+1900, 0, 4);\n          var janFourthNextYear = new Date(date.tm_year+1901, 0, 4);\n  \n          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n  \n          var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);\n  \n          if (compareByDay(endDate, firstWeekStartThisYear) < 0) {\n            // if given date is before this years first week, then it belongs to the 53rd week of last year\n            return '53';\n          } \n  \n          if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {\n            // if given date is after next years first week, then it belongs to the 01th week of next year\n            return '01';\n          }\n  \n          // given date is in between CW 01..53 of this calendar year\n          var daysDifference;\n          if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) {\n            // first CW of this year starts last year\n            daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate()\n          } else {\n            // first CW of this year starts this year\n            daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate();\n          }\n          return leadingNulls(Math.ceil(daysDifference/7), 2);\n        },\n        '%w': function(date) {\n          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);\n          return day.getDay();\n        },\n        '%W': function(date) {\n          // Replaced by the week number of the year as a decimal number [00,53]. \n          // The first Monday of January is the first day of week 1; \n          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]\n          var janFirst = new Date(date.tm_year, 0, 1);\n          var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1);\n          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);\n  \n          // is target date after the first Monday?\n          if (compareByDay(firstMonday, endDate) < 0) {\n            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;\n            var firstMondayUntilEndJanuary = 31-firstMonday.getDate();\n            var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();\n            return leadingNulls(Math.ceil(days/7), 2);\n          }\n          return compareByDay(firstMonday, janFirst) === 0 ? '01': '00';\n        },\n        '%y': function(date) {\n          // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year]\n          return (date.tm_year+1900).toString().substring(2);\n        },\n        '%Y': function(date) {\n          // Replaced by the year as a decimal number (for example, 1997). [ tm_year]\n          return date.tm_year+1900;\n        },\n        '%z': function(date) {\n          // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ),\n          // or by no characters if no timezone is determinable. \n          // For example, \"-0430\" means 4 hours 30 minutes behind UTC (west of Greenwich). \n          // If tm_isdst is zero, the standard time offset is used. \n          // If tm_isdst is greater than zero, the daylight savings time offset is used. \n          // If tm_isdst is negative, no characters are returned. \n          // FIXME: we cannot determine time zone (or can we?)\n          return '';\n        },\n        '%Z': function(date) {\n          // Replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. [ tm_isdst]\n          // FIXME: we cannot determine time zone (or can we?)\n          return '';\n        },\n        '%%': function() {\n          return '%';\n        }\n      };\n      for (var rule in EXPANSION_RULES_2) {\n        if (pattern.indexOf(rule) >= 0) {\n          pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));\n        }\n      }\n  \n      var bytes = intArrayFromString(pattern, false);\n      if (bytes.length > maxsize) {\n        return 0;\n      } \n  \n      writeArrayToMemory(bytes, s);\n      return bytes.length-1;\n    }function _strftime_l(s, maxsize, format, tm) {\n      return _strftime(s, maxsize, format, tm); // no locale support yet\n    }\n\n  var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;\n\n\n  function _pthread_cond_wait() {\n      return 0;\n    }\n\n  \n  function _isdigit(chr) {\n      return chr >= 48 && chr <= 57;\n    }function _isdigit_l(chr) {\n      return _isdigit(chr); // no locale support yet\n    }\n\n  var _fabs=Math_abs;\n\n  function _llvm_lifetime_start() {}\n\n  var _getc=_fgetc;\n\n  var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  function ___ctype_b_loc() {\n      // http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/baselib---ctype-b-loc.html\n      var me = ___ctype_b_loc;\n      if (!me.ret) {\n        var values = [\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,8195,8194,8194,8194,8194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,24577,49156,49156,49156,\n          49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,55304,55304,55304,55304,55304,55304,55304,55304,\n          55304,55304,49156,49156,49156,49156,49156,49156,49156,54536,54536,54536,54536,54536,54536,50440,50440,50440,50440,50440,\n          50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,49156,49156,49156,49156,49156,\n          49156,54792,54792,54792,54792,54792,54792,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,\n          50696,50696,50696,50696,50696,50696,50696,49156,49156,49156,49156,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n        ];\n        var i16size = 2;\n        var arr = _malloc(values.length * i16size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP16[(((arr)+(i * i16size))>>1)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i16size], 'i16*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function _freelocale(locale) {\n      _free(locale);\n    }\n\n  function ___cxa_allocate_exception(size) {\n      var ptr = _malloc(size + ___cxa_exception_header_size);\n      return ptr + ___cxa_exception_header_size;\n    }\n\n  var _fmodl=_fmod;\n\n  function _catopen(name, oflag) {\n      // nl_catd catopen (const char *name, int oflag)\n      return -1;\n    }\n\n  function _catgets(catd, set_id, msg_id, s) {\n      // char *catgets (nl_catd catd, int set_id, int msg_id, const char *s)\n      return s;\n    }\n\n  \n  \n  function _sprintf(s, format, varargs) {\n      // int sprintf(char *restrict s, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      return _snprintf(s, undefined, format, varargs);\n    }function _asprintf(s, format, varargs) {\n      return _sprintf(-s, format, varargs);\n    }function _vasprintf(s, format, va_arg) {\n      return _asprintf(s, format, HEAP32[((va_arg)>>2)]);\n    }\n\n  function _time(ptr) {\n      var ret = Math.floor(Date.now()/1000);\n      if (ptr) {\n        HEAP32[((ptr)>>2)]=ret;\n      }\n      return ret;\n    }\n\n  function _copysign(a, b) {\n      return __reallyNegative(a) === __reallyNegative(b) ? a : -a;\n    }\n\n  function ___ctype_toupper_loc() {\n      // http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/libutil---ctype-toupper-loc.html\n      var me = ___ctype_toupper_loc;\n      if (!me.ret) {\n        var values = [\n          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,\n          158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n          188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,\n          218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,\n          248,249,250,251,252,253,254,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n          33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,\n          73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,\n          81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,\n          145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,\n          175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,\n          205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,\n          235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255\n        ];\n        var i32size = 4;\n        var arr = _malloc(values.length * i32size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP32[(((arr)+(i * i32size))>>2)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i32size], 'i32*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function ___cxa_guard_acquire(variable) {\n      if (!HEAP8[(variable)]) { // ignore SAFE_HEAP stuff because llvm mixes i64 and i8 here\n        HEAP8[(variable)]=1;\n        return 1;\n      }\n      return 0;\n    }\n\n  function ___ctype_tolower_loc() {\n      // http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/libutil---ctype-tolower-loc.html\n      var me = ___ctype_tolower_loc;\n      if (!me.ret) {\n        var values = [\n          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,\n          158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n          188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,\n          218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,\n          248,249,250,251,252,253,254,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n          33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,100,101,102,103,\n          104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,96,97,98,99,100,101,102,103,\n          104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,\n          134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,\n          164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,\n          194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,\n          224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,\n          254,255\n        ];\n        var i32size = 4;\n        var arr = _malloc(values.length * i32size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP32[(((arr)+(i * i32size))>>2)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i32size], 'i32*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function ___cxa_begin_catch(ptr) {\n      __ZSt18uncaught_exceptionv.uncaught_exception--;\n      ___cxa_caught_exceptions.push(___cxa_last_thrown_exception);\n      return ptr;\n    }\n\n   \n  Module[\"_bitshift64Shl\"] = _bitshift64Shl;\n\n\n  function __ZNSt9exceptionD2Ev() {}\n\n  var _copysignl=_copysign;\n\n  var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], \"i8\", ALLOC_STATIC)+8, 0], \"i32\", ALLOC_STATIC);\n\n  var ___dso_handle=allocate(1, \"i32*\", ALLOC_STATIC);\n\n\n\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\n__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });\n_fgetc.ret = allocate([0], \"i8\", ALLOC_STATIC);\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n var ctlz_i8 = allocate([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], \"i8\", ALLOC_DYNAMIC);\n var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], \"i8\", ALLOC_DYNAMIC);\n\nvar Math_min = Math.min;\nfunction invoke_iiii(index,a1,a2,a3) {\n  try {\n    return Module[\"dynCall_iiii\"](index,a1,a2,a3);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {\n  try {\n    Module[\"dynCall_viiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiii(index,a1,a2,a3,a4,a5) {\n  try {\n    Module[\"dynCall_viiiii\"](index,a1,a2,a3,a4,a5);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_vi(index,a1) {\n  try {\n    Module[\"dynCall_vi\"](index,a1);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_vii(index,a1,a2) {\n  try {\n    Module[\"dynCall_vii\"](index,a1,a2);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {\n  try {\n    Module[\"dynCall_viiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_ii(index,a1) {\n  try {\n    return Module[\"dynCall_ii\"](index,a1);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiid(index,a1,a2,a3,a4,a5,a6,a7) {\n  try {\n    Module[\"dynCall_viiiiiid\"](index,a1,a2,a3,a4,a5,a6,a7);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viii(index,a1,a2,a3) {\n  try {\n    Module[\"dynCall_viii\"](index,a1,a2,a3);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiid(index,a1,a2,a3,a4,a5,a6) {\n  try {\n    Module[\"dynCall_viiiiid\"](index,a1,a2,a3,a4,a5,a6);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_v(index) {\n  try {\n    Module[\"dynCall_v\"](index);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {\n  try {\n    return Module[\"dynCall_iiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiii(index,a1,a2,a3,a4) {\n  try {\n    return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {\n  try {\n    Module[\"dynCall_viiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {\n  try {\n    Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iii(index,a1,a2) {\n  try {\n    return Module[\"dynCall_iii\"](index,a1,a2);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiiii(index,a1,a2,a3,a4,a5) {\n  try {\n    return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiii(index,a1,a2,a3,a4) {\n  try {\n    Module[\"dynCall_viiii\"](index,a1,a2,a3,a4);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=env.___rand_seed|0;var p=env.__ZTISt9exception|0;var q=env.___dso_handle|0;var r=env._stderr|0;var s=env._stdin|0;var t=env._stdout|0;var u=0;var v=0;var w=0;var x=0;var y=+env.NaN,z=+env.Infinity;var A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0.0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=0;var S=0;var T=global.Math.floor;var U=global.Math.abs;var V=global.Math.sqrt;var W=global.Math.pow;var X=global.Math.cos;var Y=global.Math.sin;var Z=global.Math.tan;var _=global.Math.acos;var $=global.Math.asin;var aa=global.Math.atan;var ba=global.Math.atan2;var ca=global.Math.exp;var da=global.Math.log;var ea=global.Math.ceil;var fa=global.Math.imul;var ga=env.abort;var ha=env.assert;var ia=env.asmPrintInt;var ja=env.asmPrintFloat;var ka=env.min;var la=env.invoke_iiii;var ma=env.invoke_viiiiiii;var na=env.invoke_viiiii;var oa=env.invoke_vi;var pa=env.invoke_vii;var qa=env.invoke_viiiiiiiii;var ra=env.invoke_ii;var sa=env.invoke_viiiiiid;var ta=env.invoke_viii;var ua=env.invoke_viiiiid;var va=env.invoke_v;var wa=env.invoke_iiiiiiiii;var xa=env.invoke_iiiii;var ya=env.invoke_viiiiiiii;var za=env.invoke_viiiiii;var Aa=env.invoke_iii;var Ba=env.invoke_iiiiii;var Ca=env.invoke_viiii;var Da=env._fabs;var Ea=env._vsscanf;var Fa=env.__ZSt9terminatev;var Ga=env.___cxa_guard_acquire;var Ha=env.__reallyNegative;var Ia=env.__ZSt18uncaught_exceptionv;var Ja=env.___ctype_toupper_loc;var Ka=env.__addDays;var La=env._sbrk;var Ma=env.___cxa_begin_catch;var Na=env._emscripten_memcpy_big;var Oa=env._sysconf;var Pa=env._fileno;var Qa=env._fread;var Ra=env._write;var Sa=env.__isLeapYear;var Ta=env.__ZNSt9exceptionD2Ev;var Ua=env.___cxa_does_inherit;var Va=env.__exit;var Wa=env.___cxa_rethrow;var Xa=env._catclose;var Ya=env._llvm_lifetime_end;var Za=env._send;var _a=env.___cxa_is_number_type;var $a=env.___cxa_free_exception;var ab=env.___cxa_find_matching_catch;var bb=env._isxdigit_l;var cb=env.___cxa_guard_release;var db=env._strtol;var eb=env.___setErrNo;var fb=env._newlocale;var gb=env._isdigit_l;var hb=env.___resumeException;var ib=env._freelocale;var jb=env._sprintf;var kb=env._vasprintf;var lb=env._vsnprintf;var mb=env._strtoull_l;var nb=env._read;var ob=env._fwrite;var pb=env._time;var qb=env._pthread_mutex_lock;var rb=env._catopen;var sb=env._exit;var tb=env.___ctype_b_loc;var ub=env._fmod;var vb=env.___cxa_allocate_exception;var wb=env._atoi;var xb=env._strtoll;var yb=env._pwrite;var zb=env._uselocale;var Ab=env._snprintf;var Bb=env.__scanString;var Cb=env.___cxa_end_catch;var Db=env._strtoull;var Eb=env._strftime;var Fb=env._isxdigit;var Gb=env.__parseInt;var Hb=env._pthread_cond_broadcast;var Ib=env._recv;var Jb=env._fgetc;var Kb=env.__parseInt64;var Lb=env.__getFloat;var Mb=env._abort;var Nb=env._isspace;var Ob=env._pthread_cond_wait;var Pb=env._llvm_lifetime_start;var Qb=env._ungetc;var Rb=env._fflush;var Sb=env._strftime_l;var Tb=env._sscanf;var Ub=env._catgets;var Vb=env._asprintf;var Wb=env._strtoll_l;var Xb=env.__arraySum;var Yb=env.___ctype_tolower_loc;var Zb=env._pthread_mutex_unlock;var _b=env._pread;var $b=env._mkport;var ac=env.___errno_location;var bc=env._copysign;var cc=env.___cxa_throw;var dc=env._isdigit;var ec=env._strerror;var fc=env.__formatString;var gc=env._atexit;var hc=env._strerror_r;var ic=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction Yg(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;fh(n,g,v,l,m);g=o;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(o,10,0);if((a[g]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=pc[c[(c[m>>2]|0)+36>>2]&127](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=pc[c[(c[z>>2]|0)+36>>2]&127](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[g]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}ye(o,P<<1,0);if((a[g]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}ye(o,Q,0);if((a[g]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=pc[c[(c[E>>2]|0)+36>>2]&127](E)|0}else{U=c[I>>2]|0}if((gh(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){pc[c[(c[E>>2]|0)+40>>2]&127](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);h[k>>3]=+Ol(M,c[p>>2]|0,j);mj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=pc[c[(c[E>>2]|0)+36>>2]&127](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=pc[c[(c[L>>2]|0)+36>>2]&127](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}function Zg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];_g(a,0,k,j,f,g,h);i=b;return}function _g(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;fh(n,g,v,l,m);g=o;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(o,10,0);if((a[g]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=pc[c[(c[m>>2]|0)+36>>2]&127](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=pc[c[(c[z>>2]|0)+36>>2]&127](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[g]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}ye(o,P<<1,0);if((a[g]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}ye(o,Q,0);if((a[g]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=pc[c[(c[E>>2]|0)+36>>2]&127](E)|0}else{U=c[I>>2]|0}if((gh(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){pc[c[(c[E>>2]|0)+40>>2]&127](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);h[k>>3]=+Nl(M,c[p>>2]|0,j);mj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=pc[c[(c[E>>2]|0)+36>>2]&127](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=pc[c[(c[L>>2]|0)+36>>2]&127](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}function $g(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+8|0;k=d;l=i;i=i+16|0;m=i;i=i+104|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+160|0;r=n;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;Qe(o,g);g=o;o=c[g>>2]|0;if(!((c[1280]|0)==-1)){c[l>>2]=5120;c[l+4>>2]=118;c[l+8>>2]=0;qe(5120,l,119)}l=(c[5124>>2]|0)+ -1|0;s=c[o+8>>2]|0;if(!((c[o+12>>2]|0)-s>>2>>>0>l>>>0)){t=vb(4)|0;u=t;pm(u);cc(t|0,13088,107)}o=c[s+(l<<2)>>2]|0;if((o|0)==0){t=vb(4)|0;u=t;pm(u);cc(t|0,13088,107)}t=m;vc[c[(c[o>>2]|0)+48>>2]&7](o,3672,3698|0,t)|0;Yd(c[g>>2]|0)|0;g=p;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(p,10,0);if((a[g]&1)==0){o=p+1|0;v=o;w=p+8|0;x=o}else{o=p+8|0;v=p+1|0;w=o;x=c[o>>2]|0}o=e;e=f;f=p;u=p+4|0;l=m+96|0;s=m+100|0;y=q;z=m+104|0;A=m;m=n+4|0;B=c[o>>2]|0;C=x;D=q;q=0;E=x;a:while(1){do{if((B|0)==0){F=0;G=1}else{x=c[B+12>>2]|0;if((x|0)==(c[B+16>>2]|0)){H=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{H=c[x>>2]|0}if(!((H|0)==-1)){F=B;G=0;break}c[o>>2]=0;F=0;G=1}}while(0);x=c[e>>2]|0;do{if((x|0)==0){I=22}else{J=c[x+12>>2]|0;if((J|0)==(c[x+16>>2]|0)){K=pc[c[(c[x>>2]|0)+36>>2]&127](x)|0}else{K=c[J>>2]|0}if((K|0)==-1){c[e>>2]=0;I=22;break}else{if(G){break}else{L=E;break a}}}}while(0);if((I|0)==22){I=0;if(G){L=E;break}}x=a[g]|0;J=(x&1)==0;if(J){M=(x&255)>>>1}else{M=c[u>>2]|0}if((C-E|0)==(M|0)){if(J){N=(x&255)>>>1;O=(x&255)>>>1}else{x=c[u>>2]|0;N=x;O=x}ye(p,O<<1,0);if((a[g]&1)==0){P=10}else{P=(c[f>>2]&-2)+ -1|0}ye(p,P,0);if((a[g]&1)==0){Q=v}else{Q=c[w>>2]|0}R=Q+N|0;S=Q}else{R=C;S=E}x=c[F+12>>2]|0;if((x|0)==(c[F+16>>2]|0)){T=pc[c[(c[F>>2]|0)+36>>2]&127](F)|0}else{T=c[x>>2]|0}x=(R|0)==(S|0);do{if(x){J=(c[l>>2]|0)==(T|0);if(!J){if((c[s>>2]|0)!=(T|0)){I=43;break}}a[R]=J?43:45;U=R+1|0;V=D;W=0}else{I=43}}while(0);do{if((I|0)==43){I=0;J=a[r]|0;if((J&1)==0){X=(J&255)>>>1}else{X=c[m>>2]|0}if((X|0)!=0&(T|0)==0){if((D-y|0)>=160){U=R;V=D;W=q;break}c[D>>2]=q;U=R;V=D+4|0;W=0;break}else{Y=t}while(1){J=Y+4|0;if((c[Y>>2]|0)==(T|0)){Z=Y;break}if((J|0)==(z|0)){Z=z;break}else{Y=J}}J=Z-A|0;_=J>>2;if((J|0)>92){L=S;break a}if((J|0)<88){a[R]=a[3672+_|0]|0;U=R+1|0;V=D;W=q+1|0;break}if(x){L=R;break a}if((R-S|0)>=3){L=S;break a}if((a[R+ -1|0]|0)!=48){L=S;break a}a[R]=a[3672+_|0]|0;U=R+1|0;V=D;W=0}}while(0);x=c[o>>2]|0;_=x+12|0;J=c[_>>2]|0;if((J|0)==(c[x+16>>2]|0)){pc[c[(c[x>>2]|0)+40>>2]&127](x)|0;B=x;C=U;D=V;q=W;E=S;continue}else{c[_>>2]=J+4;B=x;C=U;D=V;q=W;E=S;continue}}a[L+3|0]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);S=c[1254]|0;c[k>>2]=j;if((Eg(L,S,3712,k)|0)!=1){c[h>>2]=4}k=c[o>>2]|0;do{if((k|0)==0){$=0;aa=1}else{S=c[k+12>>2]|0;if((S|0)==(c[k+16>>2]|0)){ba=pc[c[(c[k>>2]|0)+36>>2]&127](k)|0}else{ba=c[S>>2]|0}if(!((ba|0)==-1)){$=k;aa=0;break}c[o>>2]=0;$=0;aa=1}}while(0);o=c[e>>2]|0;do{if((o|0)==0){I=78}else{k=c[o+12>>2]|0;if((k|0)==(c[o+16>>2]|0)){ca=pc[c[(c[o>>2]|0)+36>>2]&127](o)|0}else{ca=c[k>>2]|0}if((ca|0)==-1){c[e>>2]=0;I=78;break}if(!aa){break}da=b;c[da>>2]=$;ve(p);ve(n);i=d;return}}while(0);do{if((I|0)==78){if(aa){break}da=b;c[da>>2]=$;ve(p);ve(n);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;da=b;c[da>>2]=$;ve(p);ve(n);i=d;return}function ah(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;o=c[f>>2]|0;p=(o|0)==(e|0);do{if(p){q=(c[m+96>>2]|0)==(b|0);if(!q){if((c[m+100>>2]|0)!=(b|0)){break}}c[f>>2]=e+1;a[e]=q?43:45;c[g>>2]=0;r=0;i=n;return r|0}}while(0);q=a[j]|0;if((q&1)==0){s=(q&255)>>>1}else{s=c[j+4>>2]|0}if((s|0)!=0&(b|0)==(h|0)){h=c[l>>2]|0;if((h-k|0)>=160){r=0;i=n;return r|0}k=c[g>>2]|0;c[l>>2]=h+4;c[h>>2]=k;c[g>>2]=0;r=0;i=n;return r|0}k=m+104|0;h=m;while(1){l=h+4|0;if((c[h>>2]|0)==(b|0)){t=h;break}if((l|0)==(k|0)){t=k;break}else{h=l}}h=t-m|0;m=h>>2;if((h|0)>92){r=-1;i=n;return r|0}do{if((d|0)==10|(d|0)==8){if((m|0)<(d|0)){break}else{r=-1}i=n;return r|0}else if((d|0)==16){if((h|0)<88){break}if(p){r=-1;i=n;return r|0}if((o-e|0)>=3){r=-1;i=n;return r|0}if((a[o+ -1|0]|0)!=48){r=-1;i=n;return r|0}c[g>>2]=0;t=a[3672+m|0]|0;c[f>>2]=o+1;a[o]=t;r=0;i=n;return r|0}}while(0);e=a[3672+m|0]|0;c[f>>2]=o+1;a[o]=e;c[g>>2]=(c[g>>2]|0)+1;r=0;i=n;return r|0}function bh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+40|0;h=g;j=g+16|0;k=g+32|0;Qe(k,d);d=k;k=c[d>>2]|0;if(!((c[1282]|0)==-1)){c[j>>2]=5128;c[j+4>>2]=118;c[j+8>>2]=0;qe(5128,j,119)}j=(c[5132>>2]|0)+ -1|0;l=c[k+8>>2]|0;if(!((c[k+12>>2]|0)-l>>2>>>0>j>>>0)){m=vb(4)|0;n=m;pm(n);cc(m|0,13088,107)}k=c[l+(j<<2)>>2]|0;if((k|0)==0){m=vb(4)|0;n=m;pm(n);cc(m|0,13088,107)}vc[c[(c[k>>2]|0)+32>>2]&7](k,3672,3698|0,e)|0;e=c[d>>2]|0;if(!((c[1318]|0)==-1)){c[h>>2]=5272;c[h+4>>2]=118;c[h+8>>2]=0;qe(5272,h,119)}h=(c[5276>>2]|0)+ -1|0;k=c[e+8>>2]|0;if(!((c[e+12>>2]|0)-k>>2>>>0>h>>>0)){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}e=c[k+(h<<2)>>2]|0;if((e|0)==0){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}else{o=e;a[f]=pc[c[(c[e>>2]|0)+16>>2]&127](o)|0;nc[c[(c[e>>2]|0)+20>>2]&63](b,o);Yd(c[d>>2]|0)|0;i=g;return}}function ch(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+40|0;j=h;k=h+16|0;l=h+32|0;Qe(l,d);d=l;l=c[d>>2]|0;if(!((c[1282]|0)==-1)){c[k>>2]=5128;c[k+4>>2]=118;c[k+8>>2]=0;qe(5128,k,119)}k=(c[5132>>2]|0)+ -1|0;m=c[l+8>>2]|0;if(!((c[l+12>>2]|0)-m>>2>>>0>k>>>0)){n=vb(4)|0;o=n;pm(o);cc(n|0,13088,107)}l=c[m+(k<<2)>>2]|0;if((l|0)==0){n=vb(4)|0;o=n;pm(o);cc(n|0,13088,107)}vc[c[(c[l>>2]|0)+32>>2]&7](l,3672,3704|0,e)|0;e=c[d>>2]|0;if(!((c[1318]|0)==-1)){c[j>>2]=5272;c[j+4>>2]=118;c[j+8>>2]=0;qe(5272,j,119)}j=(c[5276>>2]|0)+ -1|0;l=c[e+8>>2]|0;if(!((c[e+12>>2]|0)-l>>2>>>0>j>>>0)){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}e=c[l+(j<<2)>>2]|0;if((e|0)==0){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}else{p=e;q=e;a[f]=pc[c[(c[q>>2]|0)+12>>2]&127](p)|0;a[g]=pc[c[(c[q>>2]|0)+16>>2]&127](p)|0;nc[c[(c[e>>2]|0)+20>>2]&63](b,p);Yd(c[d>>2]|0)|0;i=h;return}}function dh(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0;p=i;if(b<<24>>24==h<<24>>24){if((a[d]|0)==0){q=-1;i=p;return q|0}a[d]=0;h=c[g>>2]|0;c[g>>2]=h+1;a[h]=46;h=a[k]|0;if((h&1)==0){r=(h&255)>>>1}else{r=c[k+4>>2]|0}if((r|0)==0){q=0;i=p;return q|0}r=c[m>>2]|0;if((r-l|0)>=160){q=0;i=p;return q|0}h=c[n>>2]|0;c[m>>2]=r+4;c[r>>2]=h;q=0;i=p;return q|0}do{if(b<<24>>24==j<<24>>24){h=a[k]|0;if((h&1)==0){s=(h&255)>>>1}else{s=c[k+4>>2]|0}if((s|0)==0){break}if((a[d]|0)==0){q=-1;i=p;return q|0}h=c[m>>2]|0;if((h-l|0)>=160){q=0;i=p;return q|0}r=c[n>>2]|0;c[m>>2]=h+4;c[h>>2]=r;c[n>>2]=0;q=0;i=p;return q|0}}while(0);s=o+32|0;j=o;while(1){r=j+1|0;if((a[j]|0)==b<<24>>24){t=j;break}if((r|0)==(s|0)){t=s;break}else{j=r}}j=t-o|0;if((j|0)>31){q=-1;i=p;return q|0}o=a[3672+j|0]|0;if((j|0)==24|(j|0)==25){t=c[g>>2]|0;do{if((t|0)!=(f|0)){if((a[t+ -1|0]&95|0)==(a[e]&127|0)){break}else{q=-1}i=p;return q|0}}while(0);c[g>>2]=t+1;a[t]=o;q=0;i=p;return q|0}else if((j|0)==23|(j|0)==22){a[e]=80;t=c[g>>2]|0;c[g>>2]=t+1;a[t]=o;q=0;i=p;return q|0}else{t=o&95;do{if((t|0)==(a[e]|0)){a[e]=t|128;if((a[d]|0)==0){break}a[d]=0;f=a[k]|0;if((f&1)==0){u=(f&255)>>>1}else{u=c[k+4>>2]|0}if((u|0)==0){break}f=c[m>>2]|0;if((f-l|0)>=160){break}s=c[n>>2]|0;c[m>>2]=f+4;c[f>>2]=s}}while(0);m=c[g>>2]|0;c[g>>2]=m+1;a[m]=o;if((j|0)>21){q=0;i=p;return q|0}c[n>>2]=(c[n>>2]|0)+1;q=0;i=p;return q|0}return 0}function eh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+40|0;g=f;h=f+16|0;j=f+32|0;Qe(j,b);b=j;j=c[b>>2]|0;if(!((c[1280]|0)==-1)){c[h>>2]=5120;c[h+4>>2]=118;c[h+8>>2]=0;qe(5120,h,119)}h=(c[5124>>2]|0)+ -1|0;k=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-k>>2>>>0>h>>>0)){l=vb(4)|0;m=l;pm(m);cc(l|0,13088,107)}j=c[k+(h<<2)>>2]|0;if((j|0)==0){l=vb(4)|0;m=l;pm(m);cc(l|0,13088,107)}vc[c[(c[j>>2]|0)+48>>2]&7](j,3672,3698|0,d)|0;d=c[b>>2]|0;if(!((c[1320]|0)==-1)){c[g>>2]=5280;c[g+4>>2]=118;c[g+8>>2]=0;qe(5280,g,119)}g=(c[5284>>2]|0)+ -1|0;j=c[d+8>>2]|0;if(!((c[d+12>>2]|0)-j>>2>>>0>g>>>0)){n=vb(4)|0;o=n;pm(o);cc(n|0,13088,107)}d=c[j+(g<<2)>>2]|0;if((d|0)==0){n=vb(4)|0;o=n;pm(o);cc(n|0,13088,107)}else{n=d;c[e>>2]=pc[c[(c[d>>2]|0)+16>>2]&127](n)|0;nc[c[(c[d>>2]|0)+20>>2]&63](a,n);Yd(c[b>>2]|0)|0;i=f;return}}function fh(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+40|0;h=g;j=g+16|0;k=g+32|0;Qe(k,b);b=k;k=c[b>>2]|0;if(!((c[1280]|0)==-1)){c[j>>2]=5120;c[j+4>>2]=118;c[j+8>>2]=0;qe(5120,j,119)}j=(c[5124>>2]|0)+ -1|0;l=c[k+8>>2]|0;if(!((c[k+12>>2]|0)-l>>2>>>0>j>>>0)){m=vb(4)|0;n=m;pm(n);cc(m|0,13088,107)}k=c[l+(j<<2)>>2]|0;if((k|0)==0){m=vb(4)|0;n=m;pm(n);cc(m|0,13088,107)}vc[c[(c[k>>2]|0)+48>>2]&7](k,3672,3704|0,d)|0;d=c[b>>2]|0;if(!((c[1320]|0)==-1)){c[h>>2]=5280;c[h+4>>2]=118;c[h+8>>2]=0;qe(5280,h,119)}h=(c[5284>>2]|0)+ -1|0;k=c[d+8>>2]|0;if(!((c[d+12>>2]|0)-k>>2>>>0>h>>>0)){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}d=c[k+(h<<2)>>2]|0;if((d|0)==0){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}else{o=d;p=d;c[e>>2]=pc[c[(c[p>>2]|0)+12>>2]&127](o)|0;c[f>>2]=pc[c[(c[p>>2]|0)+16>>2]&127](o)|0;nc[c[(c[d>>2]|0)+20>>2]&63](a,o);Yd(c[b>>2]|0)|0;i=g;return}}function gh(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0;p=i;if((b|0)==(h|0)){if((a[d]|0)==0){q=-1;i=p;return q|0}a[d]=0;h=c[g>>2]|0;c[g>>2]=h+1;a[h]=46;h=a[k]|0;if((h&1)==0){r=(h&255)>>>1}else{r=c[k+4>>2]|0}if((r|0)==0){q=0;i=p;return q|0}r=c[m>>2]|0;if((r-l|0)>=160){q=0;i=p;return q|0}h=c[n>>2]|0;c[m>>2]=r+4;c[r>>2]=h;q=0;i=p;return q|0}do{if((b|0)==(j|0)){h=a[k]|0;if((h&1)==0){s=(h&255)>>>1}else{s=c[k+4>>2]|0}if((s|0)==0){break}if((a[d]|0)==0){q=-1;i=p;return q|0}h=c[m>>2]|0;if((h-l|0)>=160){q=0;i=p;return q|0}r=c[n>>2]|0;c[m>>2]=h+4;c[h>>2]=r;c[n>>2]=0;q=0;i=p;return q|0}}while(0);s=o+128|0;j=o;while(1){r=j+4|0;if((c[j>>2]|0)==(b|0)){t=j;break}if((r|0)==(s|0)){t=s;break}else{j=r}}j=t-o|0;o=j>>2;if((j|0)>124){q=-1;i=p;return q|0}t=a[3672+o|0]|0;do{if((o|0)==24|(o|0)==25){s=c[g>>2]|0;do{if((s|0)!=(f|0)){if((a[s+ -1|0]&95|0)==(a[e]&127|0)){break}else{q=-1}i=p;return q|0}}while(0);c[g>>2]=s+1;a[s]=t;q=0;i=p;return q|0}else if((o|0)==23|(o|0)==22){a[e]=80}else{b=t&95;if((b|0)!=(a[e]|0)){break}a[e]=b|128;if((a[d]|0)==0){break}a[d]=0;b=a[k]|0;if((b&1)==0){u=(b&255)>>>1}else{u=c[k+4>>2]|0}if((u|0)==0){break}b=c[m>>2]|0;if((b-l|0)>=160){break}r=c[n>>2]|0;c[m>>2]=b+4;c[b>>2]=r}}while(0);m=c[g>>2]|0;c[g>>2]=m+1;a[m]=t;if((j|0)>84){q=0;i=p;return q|0}c[n>>2]=(c[n>>2]|0)+1;q=0;i=p;return q|0}function hh(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function ih(a){a=a|0;i=i;return}function jh(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 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;j=i;i=i+56|0;k=j;l=j+8|0;m=j+24|0;n=j+32|0;o=j+40|0;if((c[f+4>>2]&1|0)==0){p=c[(c[d>>2]|0)+24>>2]|0;c[m>>2]=c[e>>2];q=h&1;r=k;s=m;c[r+0>>2]=c[s+0>>2];xc[p&31](b,d,k,f,g,q);i=j;return}Qe(n,f);f=n;n=c[f>>2]|0;if(!((c[1318]|0)==-1)){c[l>>2]=5272;c[l+4>>2]=118;c[l+8>>2]=0;qe(5272,l,119)}l=(c[5276>>2]|0)+ -1|0;q=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-q>>2>>>0>l>>>0)){t=vb(4)|0;u=t;pm(u);cc(t|0,13088,107)}n=c[q+(l<<2)>>2]|0;if((n|0)==0){t=vb(4)|0;u=t;pm(u);cc(t|0,13088,107)}t=n;Yd(c[f>>2]|0)|0;f=c[n>>2]|0;if(h){nc[c[f+24>>2]&63](o,t)}else{nc[c[f+28>>2]&63](o,t)}t=o;f=a[t]|0;if((f&1)==0){h=o+1|0;v=h;w=h;x=o+8|0}else{h=o+8|0;v=c[h>>2]|0;w=o+1|0;x=h}h=e;e=o+4|0;n=f;f=v;while(1){if((n&1)==0){y=w;z=(n&255)>>>1}else{y=c[x>>2]|0;z=c[e>>2]|0}if((f|0)==(y+z|0)){break}v=a[f]|0;u=c[h>>2]|0;do{if((u|0)!=0){l=u+24|0;q=c[l>>2]|0;if((q|0)!=(c[u+28>>2]|0)){c[l>>2]=q+1;a[q]=v;break}if(!((yc[c[(c[u>>2]|0)+52>>2]&31](u,v&255)|0)==-1)){break}c[h>>2]=0}}while(0);n=a[t]|0;f=f+1|0}c[b>>2]=c[h>>2];ve(o);i=j;return}function kh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+24|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[3920|0]|0;a[s+1|0]=a[3921|0]|0;a[s+2|0]=a[3922|0]|0;a[s+3|0]=a[3923|0]|0;a[s+4|0]=a[3924|0]|0;a[s+5|0]=a[3925|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=m;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);v=c[1254]|0;c[k>>2]=h;h=lh(w,12,v,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else if((s|0)==32){y=k}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Qe(q,f);mh(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];ad(b,j,z,e,o,f,g);i=d;return}function lh(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;g=i;i=i+16|0;h=g;c[h>>2]=f;f=zb(d|0)|0;d=lb(a|0,b|0,e|0,h|0)|0;if((f|0)==0){i=g;return d|0}zb(f|0)|0;i=g;return d|0}function mh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1282]|0)==-1)){c[m>>2]=5128;c[m+4>>2]=118;c[m+8>>2]=0;qe(5128,m,119)}m=(c[5132>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}q=j;r=c[o>>2]|0;if(!((c[1318]|0)==-1)){c[l>>2]=5272;c[l+4>>2]=118;c[l+8>>2]=0;qe(5272,l,119)}l=(c[5276>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}s=r;nc[c[(c[r>>2]|0)+20>>2]&63](n,s);t=n;l=a[t]|0;if((l&1)==0){u=(l&255)>>>1}else{u=c[n+4>>2]|0}do{if((u|0)==0){vc[c[(c[j>>2]|0)+32>>2]&7](q,b,e,f)|0;c[h>>2]=f+(e-b)}else{c[h>>2]=f;l=a[b]|0;if(l<<24>>24==43|l<<24>>24==45){o=yc[c[(c[j>>2]|0)+28>>2]&31](q,l)|0;l=c[h>>2]|0;c[h>>2]=l+1;a[l]=o;v=b+1|0}else{v=b}do{if((e-v|0)>1){if((a[v]|0)!=48){w=v;break}o=v+1|0;l=a[o]|0;if(!(l<<24>>24==88|l<<24>>24==120)){w=v;break}l=j;m=yc[c[(c[l>>2]|0)+28>>2]&31](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=m;m=yc[c[(c[l>>2]|0)+28>>2]&31](q,a[o]|0)|0;o=c[h>>2]|0;c[h>>2]=o+1;a[o]=m;w=v+2|0}else{w=v}}while(0);do{if((w|0)!=(e|0)){m=e+ -1|0;if(m>>>0>w>>>0){x=w;y=m}else{break}do{m=a[x]|0;a[x]=a[y]|0;a[y]=m;x=x+1|0;y=y+ -1|0;}while(x>>>0<y>>>0)}}while(0);m=pc[c[(c[r>>2]|0)+16>>2]&127](s)|0;if(w>>>0<e>>>0){o=n+1|0;l=j;p=n+4|0;z=n+8|0;A=0;B=0;C=w;while(1){D=(a[t]&1)==0;do{if((a[(D?o:c[z>>2]|0)+B|0]|0)==0){E=A;F=B}else{if((A|0)!=(a[(D?o:c[z>>2]|0)+B|0]|0)){E=A;F=B;break}G=c[h>>2]|0;c[h>>2]=G+1;a[G]=m;G=a[t]|0;if((G&1)==0){H=(G&255)>>>1}else{H=c[p>>2]|0}E=0;F=(B>>>0<(H+ -1|0)>>>0)+B|0}}while(0);D=yc[c[(c[l>>2]|0)+28>>2]&31](q,a[C]|0)|0;G=c[h>>2]|0;c[h>>2]=G+1;a[G]=D;D=C+1|0;if(D>>>0<e>>>0){A=E+1|0;B=F;C=D}else{break}}}C=f+(w-b)|0;B=c[h>>2]|0;if((C|0)==(B|0)){break}A=B+ -1|0;if(A>>>0>C>>>0){I=C;J=A}else{break}do{A=a[I]|0;a[I]=a[J]|0;a[J]=A;I=I+1|0;J=J+ -1|0;}while(I>>>0<J>>>0)}}while(0);if((d|0)==(e|0)){K=c[h>>2]|0;c[g>>2]=K;ve(n);i=k;return}else{K=f+(d-b)|0;c[g>>2]=K;ve(n);i=k;return}}function nh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+48|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=100}}while(0);w=n;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);x=c[1254]|0;v=l;c[v>>2]=h;c[v+4>>2]=j;j=lh(w,22,x,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Qe(r,f);mh(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];ad(b,k,z,e,p,f,g);i=d;return}function oh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+24|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[3920|0]|0;a[s+1|0]=a[3921|0]|0;a[s+2|0]=a[3922|0]|0;a[s+3|0]=a[3923|0]|0;a[s+4|0]=a[3924|0]|0;a[s+5|0]=a[3925|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=117}}while(0);w=m;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);v=c[1254]|0;c[k>>2]=h;h=lh(w,12,v,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else if((s|0)==32){y=k}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Qe(q,f);mh(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];ad(b,j,z,e,o,f,g);i=d;return}function ph(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+48|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=n;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);x=c[1254]|0;v=l;c[v>>2]=h;c[v+4>>2]=j;j=lh(w,23,x,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Qe(r,f);mh(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];ad(b,k,z,e,p,f,g);i=d;return}function qh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+24|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+64|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){if((q&1|0)==0){a[D]=97;E=0;break}else{a[D]=65;E=0;break}}else{a[D]=46;B=D+2|0;a[D+1|0]=42;if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=lh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=lh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[5024]|0)==0;if(E){do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=rh(s,r,z,n)|0}else{do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);o=c[1254]|0;c[m>>2]=c[f+8>>2];r=m+4|0;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=rh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Wm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Km(J<<1)|0;if((L|0)!=0){M=H;N=L;O=L;break}Wm()}}while(0);Qe(w,f);sh(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];ad(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Lm(N)}if((I|0)==0){i=d;return}Lm(I);i=d;return}function rh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=zb(b|0)|0;b=kb(a|0,d|0,g|0)|0;if((e|0)==0){i=f;return b|0}zb(e|0)|0;i=f;return b|0}function sh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1282]|0)==-1)){c[m>>2]=5128;c[m+4>>2]=118;c[m+8>>2]=0;qe(5128,m,119)}m=(c[5132>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}q=j;r=c[o>>2]|0;if(!((c[1318]|0)==-1)){c[l>>2]=5272;c[l+4>>2]=118;c[l+8>>2]=0;qe(5272,l,119)}l=(c[5276>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}s=r;nc[c[(c[r>>2]|0)+20>>2]&63](n,s);c[h>>2]=f;t=a[b]|0;if(t<<24>>24==43|t<<24>>24==45){l=yc[c[(c[j>>2]|0)+28>>2]&31](q,t)|0;t=c[h>>2]|0;c[h>>2]=t+1;a[t]=l;u=b+1|0}else{u=b}l=e;a:do{if((l-u|0)>1){if((a[u]|0)!=48){v=14;break}t=u+1|0;o=a[t]|0;if(!(o<<24>>24==88|o<<24>>24==120)){v=14;break}o=j;m=yc[c[(c[o>>2]|0)+28>>2]&31](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=m;m=u+2|0;p=yc[c[(c[o>>2]|0)+28>>2]&31](q,a[t]|0)|0;t=c[h>>2]|0;c[h>>2]=t+1;a[t]=p;if(m>>>0<e>>>0){w=m}else{x=m;y=m;break}while(1){p=a[w]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);t=w+1|0;if((bb(p<<24>>24|0,c[1254]|0)|0)==0){x=m;y=w;break a}if(t>>>0<e>>>0){w=t}else{x=m;y=t;break}}}else{v=14}}while(0);b:do{if((v|0)==14){if(u>>>0<e>>>0){z=u}else{x=u;y=u;break}while(1){w=a[z]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);p=z+1|0;if((gb(w<<24>>24|0,c[1254]|0)|0)==0){x=u;y=z;break b}if(p>>>0<e>>>0){z=p}else{x=u;y=p;break}}}}while(0);u=n;z=a[u]|0;if((z&1)==0){A=(z&255)>>>1}else{A=c[n+4>>2]|0}do{if((A|0)==0){vc[c[(c[j>>2]|0)+32>>2]&7](q,x,y,c[h>>2]|0)|0;c[h>>2]=(c[h>>2]|0)+(y-x)}else{do{if((x|0)!=(y|0)){z=y+ -1|0;if(z>>>0>x>>>0){B=x;C=z}else{break}do{z=a[B]|0;a[B]=a[C]|0;a[C]=z;B=B+1|0;C=C+ -1|0;}while(B>>>0<C>>>0)}}while(0);w=pc[c[(c[r>>2]|0)+16>>2]&127](s)|0;if(x>>>0<y>>>0){z=n+1|0;v=n+4|0;p=n+8|0;m=j;t=0;o=0;D=x;while(1){E=(a[u]&1)==0;do{if((a[(E?z:c[p>>2]|0)+o|0]|0)>0){if((t|0)!=(a[(E?z:c[p>>2]|0)+o|0]|0)){F=t;G=o;break}H=c[h>>2]|0;c[h>>2]=H+1;a[H]=w;H=a[u]|0;if((H&1)==0){I=(H&255)>>>1}else{I=c[v>>2]|0}F=0;G=(o>>>0<(I+ -1|0)>>>0)+o|0}else{F=t;G=o}}while(0);E=yc[c[(c[m>>2]|0)+28>>2]&31](q,a[D]|0)|0;H=c[h>>2]|0;c[h>>2]=H+1;a[H]=E;E=D+1|0;if(E>>>0<y>>>0){t=F+1|0;o=G;D=E}else{break}}}D=f+(x-b)|0;o=c[h>>2]|0;if((D|0)==(o|0)){break}t=o+ -1|0;if(t>>>0>D>>>0){J=D;K=t}else{break}do{t=a[J]|0;a[J]=a[K]|0;a[K]=t;J=J+1|0;K=K+ -1|0;}while(J>>>0<K>>>0)}}while(0);c:do{if(y>>>0<e>>>0){K=j;J=y;while(1){x=a[J]|0;if(x<<24>>24==46){break}G=yc[c[(c[K>>2]|0)+28>>2]&31](q,x)|0;x=c[h>>2]|0;c[h>>2]=x+1;a[x]=G;G=J+1|0;if(G>>>0<e>>>0){J=G}else{L=G;break c}}K=pc[c[(c[r>>2]|0)+12>>2]&127](s)|0;G=c[h>>2]|0;c[h>>2]=G+1;a[G]=K;L=J+1|0}else{L=y}}while(0);vc[c[(c[j>>2]|0)+32>>2]&7](q,L,e,c[h>>2]|0)|0;q=(c[h>>2]|0)+(l-L)|0;c[h>>2]=q;if((d|0)==(e|0)){M=q;c[g>>2]=M;ve(n);i=k;return}M=f+(d-b)|0;c[g>>2]=M;ve(n);i=k;return}function th(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+64|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){a[D]=76;B=D+1|0;if((q&1|0)==0){a[B]=97;E=0;break}else{a[B]=65;E=0;break}}else{a[D]=46;a[D+1|0]=42;a[D+2|0]=76;B=D+3|0;if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=lh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=lh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[5024]|0)==0;if(E){do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=rh(s,r,z,n)|0}else{do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);o=c[1254]|0;r=m;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=rh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Wm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else if((s|0)==32){K=F}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Km(J<<1)|0;if((L|0)!=0){M=H;N=L;O=L;break}Wm()}}while(0);Qe(w,f);sh(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];ad(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Lm(N)}if((I|0)==0){i=d;return}Lm(I);i=d;return}function uh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+16|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+40|0;p=i;i=i+8|0;q=i;i=i+8|0;r=m;a[r+0|0]=a[3928|0]|0;a[r+1|0]=a[3929|0]|0;a[r+2|0]=a[3930|0]|0;a[r+3|0]=a[3931|0]|0;a[r+4|0]=a[3932|0]|0;a[r+5|0]=a[3933|0]|0;m=n;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);s=c[1254]|0;c[k>>2]=h;h=lh(m,20,s,r,k)|0;k=n+h|0;r=c[f+4>>2]&176;do{if((r|0)==32){t=k}else if((r|0)==16){s=a[m]|0;if(s<<24>>24==43|s<<24>>24==45){t=n+1|0;break}if(!((h|0)>1&s<<24>>24==48)){u=10;break}s=a[n+1|0]|0;if(!(s<<24>>24==88|s<<24>>24==120)){u=10;break}t=n+2|0}else{u=10}}while(0);if((u|0)==10){t=m}u=o;Qe(p,f);r=p;p=c[r>>2]|0;if(!((c[1282]|0)==-1)){c[l>>2]=5128;c[l+4>>2]=118;c[l+8>>2]=0;qe(5128,l,119)}l=(c[5132>>2]|0)+ -1|0;s=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-s>>2>>>0>l>>>0)){v=vb(4)|0;w=v;pm(w);cc(v|0,13088,107)}p=c[s+(l<<2)>>2]|0;if((p|0)==0){v=vb(4)|0;w=v;pm(w);cc(v|0,13088,107)}Yd(c[r>>2]|0)|0;vc[c[(c[p>>2]|0)+32>>2]&7](p,m,k,u)|0;m=o+h|0;if((t|0)==(k|0)){x=m;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];ad(b,j,u,x,m,f,g);E=j;i=d;return}x=o+(t-n)|0;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];ad(b,j,u,x,m,f,g);E=j;i=d;return}function vh(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function wh(a){a=a|0;i=i;return}function xh(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 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;j=i;i=i+56|0;k=j;l=j+8|0;m=j+24|0;n=j+32|0;o=j+40|0;if((c[f+4>>2]&1|0)==0){p=c[(c[d>>2]|0)+24>>2]|0;c[m>>2]=c[e>>2];q=h&1;r=k;s=m;c[r+0>>2]=c[s+0>>2];xc[p&31](b,d,k,f,g,q);i=j;return}Qe(n,f);f=n;n=c[f>>2]|0;if(!((c[1320]|0)==-1)){c[l>>2]=5280;c[l+4>>2]=118;c[l+8>>2]=0;qe(5280,l,119)}l=(c[5284>>2]|0)+ -1|0;q=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-q>>2>>>0>l>>>0)){t=vb(4)|0;u=t;pm(u);cc(t|0,13088,107)}n=c[q+(l<<2)>>2]|0;if((n|0)==0){t=vb(4)|0;u=t;pm(u);cc(t|0,13088,107)}t=n;Yd(c[f>>2]|0)|0;f=c[n>>2]|0;if(h){nc[c[f+24>>2]&63](o,t)}else{nc[c[f+28>>2]&63](o,t)}t=o;f=a[t]|0;if((f&1)==0){h=o+4|0;v=h;w=o+8|0;x=h}else{h=o+8|0;v=c[h>>2]|0;w=h;x=o+4|0}h=e;e=f;f=v;while(1){if((e&1)==0){y=x;z=(e&255)>>>1}else{y=c[w>>2]|0;z=c[x>>2]|0}if((f|0)==(y+(z<<2)|0)){break}v=c[f>>2]|0;n=c[h>>2]|0;do{if((n|0)!=0){u=n+24|0;l=c[u>>2]|0;if((l|0)==(c[n+28>>2]|0)){A=yc[c[(c[n>>2]|0)+52>>2]&31](n,v)|0}else{c[u>>2]=l+4;c[l>>2]=v;A=v}if(!((A|0)==-1)){break}c[h>>2]=0}}while(0);e=a[t]|0;f=f+4|0}c[b>>2]=c[h>>2];He(o);i=j;return}function yh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+88|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[3920|0]|0;a[s+1|0]=a[3921|0]|0;a[s+2|0]=a[3922|0]|0;a[s+3|0]=a[3923|0]|0;a[s+4|0]=a[3924|0]|0;a[s+5|0]=a[3925|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=100}}while(0);w=m;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);x=c[1254]|0;c[k>>2]=h;h=lh(w,12,x,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==32){y=k}else if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Qe(q,f);zh(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];Ah(b,j,z,e,o,f,g);i=d;return}function zh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1280]|0)==-1)){c[m>>2]=5120;c[m+4>>2]=118;c[m+8>>2]=0;qe(5120,m,119)}m=(c[5124>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}q=j;r=c[o>>2]|0;if(!((c[1320]|0)==-1)){c[l>>2]=5280;c[l+4>>2]=118;c[l+8>>2]=0;qe(5280,l,119)}l=(c[5284>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}s=r;nc[c[(c[r>>2]|0)+20>>2]&63](n,s);t=n;l=a[t]|0;if((l&1)==0){u=(l&255)>>>1}else{u=c[n+4>>2]|0}do{if((u|0)==0){vc[c[(c[j>>2]|0)+48>>2]&7](q,b,e,f)|0;l=f+(e-b<<2)|0;c[h>>2]=l;v=l}else{c[h>>2]=f;l=a[b]|0;if(l<<24>>24==43|l<<24>>24==45){o=yc[c[(c[j>>2]|0)+44>>2]&31](q,l)|0;l=c[h>>2]|0;c[h>>2]=l+4;c[l>>2]=o;w=b+1|0}else{w=b}do{if((e-w|0)>1){if((a[w]|0)!=48){x=w;break}o=w+1|0;l=a[o]|0;if(!(l<<24>>24==88|l<<24>>24==120)){x=w;break}l=j;m=yc[c[(c[l>>2]|0)+44>>2]&31](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+4;c[p>>2]=m;m=yc[c[(c[l>>2]|0)+44>>2]&31](q,a[o]|0)|0;o=c[h>>2]|0;c[h>>2]=o+4;c[o>>2]=m;x=w+2|0}else{x=w}}while(0);do{if((x|0)!=(e|0)){m=e+ -1|0;if(m>>>0>x>>>0){y=x;z=m}else{break}do{m=a[y]|0;a[y]=a[z]|0;a[z]=m;y=y+1|0;z=z+ -1|0;}while(y>>>0<z>>>0)}}while(0);m=pc[c[(c[r>>2]|0)+16>>2]&127](s)|0;if(x>>>0<e>>>0){o=n+1|0;l=j;p=n+4|0;A=n+8|0;B=0;C=0;D=x;while(1){E=(a[t]&1)==0;do{if((a[(E?o:c[A>>2]|0)+C|0]|0)==0){F=B;G=C}else{if((B|0)!=(a[(E?o:c[A>>2]|0)+C|0]|0)){F=B;G=C;break}H=c[h>>2]|0;c[h>>2]=H+4;c[H>>2]=m;H=a[t]|0;if((H&1)==0){I=(H&255)>>>1}else{I=c[p>>2]|0}F=0;G=(C>>>0<(I+ -1|0)>>>0)+C|0}}while(0);E=yc[c[(c[l>>2]|0)+44>>2]&31](q,a[D]|0)|0;H=c[h>>2]|0;J=H+4|0;c[h>>2]=J;c[H>>2]=E;E=D+1|0;if(E>>>0<e>>>0){B=F+1|0;C=G;D=E}else{K=J;break}}}else{K=c[h>>2]|0}D=f+(x-b<<2)|0;if((D|0)==(K|0)){v=K;break}C=K+ -4|0;if(C>>>0>D>>>0){L=D;M=C}else{v=K;break}while(1){C=c[L>>2]|0;c[L>>2]=c[M>>2];c[M>>2]=C;C=L+4|0;D=M+ -4|0;if(C>>>0<D>>>0){M=D;L=C}else{v=K;break}}}}while(0);if((d|0)==(e|0)){N=v;c[g>>2]=N;ve(n);i=k;return}N=f+(d-b<<2)|0;c[g>>2]=N;ve(n);i=k;return}function Ah(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+16|0;l=k;m=d;d=c[m>>2]|0;if((d|0)==0){c[b>>2]=0;i=k;return}n=g;g=e;o=n-g>>2;p=h+12|0;h=c[p>>2]|0;q=(h|0)>(o|0)?h-o|0:0;o=f;h=o-g|0;g=h>>2;do{if((h|0)>0){if((jc[c[(c[d>>2]|0)+48>>2]&31](d,e,g)|0)==(g|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);do{if((q|0)>0){Ge(l,q,j);if((a[l]&1)==0){r=l+4|0}else{r=c[l+8>>2]|0}if((jc[c[(c[d>>2]|0)+48>>2]&31](d,r,q)|0)==(q|0)){He(l);break}c[m>>2]=0;c[b>>2]=0;He(l);i=k;return}}while(0);l=n-o|0;o=l>>2;do{if((l|0)>0){if((jc[c[(c[d>>2]|0)+48>>2]&31](d,f,o)|0)==(o|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);c[p>>2]=0;c[b>>2]=d;i=k;return}function Bh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+168|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=n;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);v=c[1254]|0;x=l;c[x>>2]=h;c[x+4>>2]=j;j=lh(w,22,v,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Qe(r,f);zh(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];Ah(b,k,z,e,p,f,g);i=d;return}function Ch(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+88|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[3920|0]|0;a[s+1|0]=a[3921|0]|0;a[s+2|0]=a[3922|0]|0;a[s+3|0]=a[3923|0]|0;a[s+4|0]=a[3924|0]|0;a[s+5|0]=a[3925|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=m;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);x=c[1254]|0;c[k>>2]=h;h=lh(w,12,x,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==32){y=k}else if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Qe(q,f);zh(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];Ah(b,j,z,e,o,f,g);i=d;return}function Dh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+176|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=117}}while(0);w=n;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);v=c[1254]|0;x=l;c[x>>2]=h;c[x+4>>2]=j;j=lh(w,23,v,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Qe(r,f);zh(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];Ah(b,k,z,e,p,f,g);i=d;return}function Eh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+24|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+232|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){if((q&1|0)==0){a[D]=97;E=0;break}else{a[D]=65;E=0;break}}else{a[D]=46;B=D+2|0;a[D+1|0]=42;if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=lh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=lh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[5024]|0)==0;if(E){do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=rh(s,r,z,n)|0}else{do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);o=c[1254]|0;c[m>>2]=c[f+8>>2];r=m+4|0;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=rh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Wm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Km(J<<3)|0;s=L;if((L|0)!=0){M=H;N=s;O=s;break}Wm()}}while(0);Qe(w,f);Fh(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];Ah(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Lm(N)}if((I|0)==0){i=d;return}Lm(I);i=d;return}function Fh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1280]|0)==-1)){c[m>>2]=5120;c[m+4>>2]=118;c[m+8>>2]=0;qe(5120,m,119)}m=(c[5124>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=vb(4)|0;r=q;pm(r);cc(q|0,13088,107)}q=j;r=c[o>>2]|0;if(!((c[1320]|0)==-1)){c[l>>2]=5280;c[l+4>>2]=118;c[l+8>>2]=0;qe(5280,l,119)}l=(c[5284>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=vb(4)|0;t=s;pm(t);cc(s|0,13088,107)}s=r;nc[c[(c[r>>2]|0)+20>>2]&63](n,s);c[h>>2]=f;t=a[b]|0;if(t<<24>>24==43|t<<24>>24==45){l=yc[c[(c[j>>2]|0)+44>>2]&31](q,t)|0;t=c[h>>2]|0;c[h>>2]=t+4;c[t>>2]=l;u=b+1|0}else{u=b}l=e;a:do{if((l-u|0)>1){if((a[u]|0)!=48){v=14;break}t=u+1|0;o=a[t]|0;if(!(o<<24>>24==88|o<<24>>24==120)){v=14;break}o=j;m=yc[c[(c[o>>2]|0)+44>>2]&31](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+4;c[p>>2]=m;m=u+2|0;p=yc[c[(c[o>>2]|0)+44>>2]&31](q,a[t]|0)|0;t=c[h>>2]|0;c[h>>2]=t+4;c[t>>2]=p;if(m>>>0<e>>>0){w=m}else{x=m;y=m;break}while(1){p=a[w]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);t=w+1|0;if((bb(p<<24>>24|0,c[1254]|0)|0)==0){x=m;y=w;break a}if(t>>>0<e>>>0){w=t}else{x=m;y=t;break}}}else{v=14}}while(0);b:do{if((v|0)==14){if(u>>>0<e>>>0){z=u}else{x=u;y=u;break}while(1){w=a[z]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);p=z+1|0;if((gb(w<<24>>24|0,c[1254]|0)|0)==0){x=u;y=z;break b}if(p>>>0<e>>>0){z=p}else{x=u;y=p;break}}}}while(0);u=n;z=a[u]|0;if((z&1)==0){A=(z&255)>>>1}else{A=c[n+4>>2]|0}do{if((A|0)==0){vc[c[(c[j>>2]|0)+48>>2]&7](q,x,y,c[h>>2]|0)|0;z=(c[h>>2]|0)+(y-x<<2)|0;c[h>>2]=z;B=z}else{do{if((x|0)!=(y|0)){z=y+ -1|0;if(z>>>0>x>>>0){C=x;D=z}else{break}do{z=a[C]|0;a[C]=a[D]|0;a[D]=z;C=C+1|0;D=D+ -1|0;}while(C>>>0<D>>>0)}}while(0);w=pc[c[(c[r>>2]|0)+16>>2]&127](s)|0;if(x>>>0<y>>>0){z=n+1|0;v=n+4|0;p=n+8|0;m=j;t=0;o=0;E=x;while(1){F=(a[u]&1)==0;do{if((a[(F?z:c[p>>2]|0)+o|0]|0)>0){if((t|0)!=(a[(F?z:c[p>>2]|0)+o|0]|0)){G=t;H=o;break}I=c[h>>2]|0;c[h>>2]=I+4;c[I>>2]=w;I=a[u]|0;if((I&1)==0){J=(I&255)>>>1}else{J=c[v>>2]|0}G=0;H=(o>>>0<(J+ -1|0)>>>0)+o|0}else{G=t;H=o}}while(0);F=yc[c[(c[m>>2]|0)+44>>2]&31](q,a[E]|0)|0;I=c[h>>2]|0;K=I+4|0;c[h>>2]=K;c[I>>2]=F;F=E+1|0;if(F>>>0<y>>>0){t=G+1|0;o=H;E=F}else{L=K;break}}}else{L=c[h>>2]|0}E=f+(x-b<<2)|0;if((E|0)==(L|0)){B=L;break}o=L+ -4|0;if(o>>>0>E>>>0){M=E;N=o}else{B=L;break}while(1){o=c[M>>2]|0;c[M>>2]=c[N>>2];c[N>>2]=o;o=M+4|0;E=N+ -4|0;if(o>>>0<E>>>0){N=E;M=o}else{B=L;break}}}}while(0);c:do{if(y>>>0<e>>>0){L=j;M=y;while(1){N=a[M]|0;if(N<<24>>24==46){break}x=yc[c[(c[L>>2]|0)+44>>2]&31](q,N)|0;N=c[h>>2]|0;H=N+4|0;c[h>>2]=H;c[N>>2]=x;x=M+1|0;if(x>>>0<e>>>0){M=x}else{O=H;P=x;break c}}L=pc[c[(c[r>>2]|0)+12>>2]&127](s)|0;x=c[h>>2]|0;H=x+4|0;c[h>>2]=H;c[x>>2]=L;O=H;P=M+1|0}else{O=B;P=y}}while(0);vc[c[(c[j>>2]|0)+48>>2]&7](q,P,e,O)|0;O=(c[h>>2]|0)+(l-P<<2)|0;c[h>>2]=O;if((d|0)==(e|0)){Q=O;c[g>>2]=Q;ve(n);i=k;return}Q=f+(d-b<<2)|0;c[g>>2]=Q;ve(n);i=k;return}function Gh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+232|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){a[D]=76;B=D+1|0;if((q&1|0)==0){a[B]=97;E=0;break}else{a[B]=65;E=0;break}}else{a[D]=46;a[D+1|0]=42;a[D+2|0]=76;B=D+3|0;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=lh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=lh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[5024]|0)==0;if(E){do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);r=c[1254]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=rh(s,r,z,n)|0}else{do{if(o){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);o=c[1254]|0;r=m;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=rh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Wm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else if((s|0)==32){K=F}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Km(J<<3)|0;s=L;if((L|0)!=0){M=H;N=s;O=s;break}Wm()}}while(0);Qe(w,f);Fh(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];Ah(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Lm(N)}if((I|0)==0){i=d;return}Lm(I);i=d;return}function Hh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+16|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+152|0;p=i;i=i+8|0;q=i;i=i+8|0;r=m;a[r+0|0]=a[3928|0]|0;a[r+1|0]=a[3929|0]|0;a[r+2|0]=a[3930|0]|0;a[r+3|0]=a[3931|0]|0;a[r+4|0]=a[3932|0]|0;a[r+5|0]=a[3933|0]|0;m=n;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);s=c[1254]|0;c[k>>2]=h;h=lh(m,20,s,r,k)|0;k=n+h|0;r=c[f+4>>2]&176;do{if((r|0)==16){s=a[m]|0;if(s<<24>>24==43|s<<24>>24==45){t=n+1|0;break}if(!((h|0)>1&s<<24>>24==48)){u=10;break}s=a[n+1|0]|0;if(!(s<<24>>24==88|s<<24>>24==120)){u=10;break}t=n+2|0}else if((r|0)==32){t=k}else{u=10}}while(0);if((u|0)==10){t=m}Qe(p,f);u=p;p=c[u>>2]|0;if(!((c[1280]|0)==-1)){c[l>>2]=5120;c[l+4>>2]=118;c[l+8>>2]=0;qe(5120,l,119)}l=(c[5124>>2]|0)+ -1|0;r=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-r>>2>>>0>l>>>0)){v=vb(4)|0;w=v;pm(w);cc(v|0,13088,107)}p=c[r+(l<<2)>>2]|0;if((p|0)==0){v=vb(4)|0;w=v;pm(w);cc(v|0,13088,107)}Yd(c[u>>2]|0)|0;u=o;vc[c[(c[p>>2]|0)+48>>2]&7](p,m,k,u)|0;m=o+(h<<2)|0;if((t|0)==(k|0)){x=m;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];Ah(b,j,u,x,m,f,g);E=j;i=d;return}x=o+(t-n<<2)|0;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];Ah(b,j,u,x,m,f,g);E=j;i=d;return}function Ih(e,f,g,h,j,k,l,m,n){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,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;o=i;i=i+64|0;p=o;q=o+8|0;r=o+16|0;s=o+32|0;t=o+40|0;u=o+48|0;v=o+56|0;Qe(s,j);w=s;s=c[w>>2]|0;if(!((c[1282]|0)==-1)){c[r>>2]=5128;c[r+4>>2]=118;c[r+8>>2]=0;qe(5128,r,119)}r=(c[5132>>2]|0)+ -1|0;x=c[s+8>>2]|0;if(!((c[s+12>>2]|0)-x>>2>>>0>r>>>0)){y=vb(4)|0;z=y;pm(z);cc(y|0,13088,107)}s=c[x+(r<<2)>>2]|0;if((s|0)==0){y=vb(4)|0;z=y;pm(z);cc(y|0,13088,107)}y=s;Yd(c[w>>2]|0)|0;c[k>>2]=0;w=g;a:do{if((m|0)==(n|0)){A=65}else{z=h;r=s;x=s+8|0;B=s;C=f;D=u;E=v;F=t;G=m;H=0;b:while(1){I=H;while(1){if((I|0)!=0){A=65;break a}J=c[w>>2]|0;do{if((J|0)==0){K=0}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){K=J;break}if(!((pc[c[(c[J>>2]|0)+36>>2]&127](J)|0)==-1)){K=J;break}c[w>>2]=0;K=0}}while(0);J=(K|0)==0;L=c[z>>2]|0;c:do{if((L|0)==0){A=19}else{do{if((c[L+12>>2]|0)==(c[L+16>>2]|0)){if(!((pc[c[(c[L>>2]|0)+36>>2]&127](L)|0)==-1)){break}c[z>>2]=0;A=19;break c}}while(0);if(J){M=L}else{A=20;break b}}}while(0);if((A|0)==19){A=0;if(J){A=20;break b}else{M=0}}if((jc[c[(c[r>>2]|0)+36>>2]&31](y,a[G]|0,0)|0)<<24>>24==37){A=22;break}L=a[G]|0;if(L<<24>>24>-1){N=c[x>>2]|0;if(!((b[N+(L<<24>>24<<1)>>1]&8192)==0)){O=G;A=33;break}}P=K+12|0;L=c[P>>2]|0;Q=K+16|0;if((L|0)==(c[Q>>2]|0)){R=pc[c[(c[K>>2]|0)+36>>2]&127](K)|0}else{R=d[L]|0}L=yc[c[(c[B>>2]|0)+12>>2]&31](y,R&255)|0;if(L<<24>>24==(yc[c[(c[B>>2]|0)+12>>2]&31](y,a[G]|0)|0)<<24>>24){A=60;break}c[k>>2]=4;I=4}d:do{if((A|0)==22){A=0;I=G+1|0;if((I|0)==(n|0)){A=23;break b}L=jc[c[(c[r>>2]|0)+36>>2]&31](y,a[I]|0,0)|0;if(L<<24>>24==48|L<<24>>24==69){S=G+2|0;if((S|0)==(n|0)){A=26;break b}T=S;U=jc[c[(c[r>>2]|0)+36>>2]&31](y,a[S]|0,0)|0;V=L}else{T=I;U=L;V=0}L=c[(c[C>>2]|0)+36>>2]|0;c[D>>2]=K;c[E>>2]=M;I=q;S=u;c[I+0>>2]=c[S+0>>2];S=p;I=v;c[S+0>>2]=c[I+0>>2];oc[L&3](t,f,q,p,j,k,l,U,V);c[w>>2]=c[F>>2];W=T+1|0}else if((A|0)==33){while(1){A=0;L=O+1|0;if((L|0)==(n|0)){X=n;break}I=a[L]|0;if(!(I<<24>>24>-1)){X=L;break}if((b[N+(I<<24>>24<<1)>>1]&8192)==0){X=L;break}else{O=L;A=33}}J=K;L=M;I=M;while(1){do{if((J|0)==0){Y=0}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){Y=J;break}if(!((pc[c[(c[J>>2]|0)+36>>2]&127](J)|0)==-1)){Y=J;break}c[w>>2]=0;Y=0}}while(0);S=(Y|0)==0;do{if((I|0)==0){Z=L;A=46}else{if((c[I+12>>2]|0)!=(c[I+16>>2]|0)){if(S){_=L;$=I;break}else{W=X;break d}}if((pc[c[(c[I>>2]|0)+36>>2]&127](I)|0)==-1){c[z>>2]=0;Z=0;A=46;break}else{if(S^(L|0)==0){_=L;$=L;break}else{W=X;break d}}}}while(0);if((A|0)==46){A=0;if(S){W=X;break d}else{_=Z;$=0}}aa=Y+12|0;ba=c[aa>>2]|0;ca=Y+16|0;if((ba|0)==(c[ca>>2]|0)){da=pc[c[(c[Y>>2]|0)+36>>2]&127](Y)|0}else{da=d[ba]|0}if(!((da&255)<<24>>24>-1)){W=X;break d}if((b[(c[x>>2]|0)+(da<<24>>24<<1)>>1]&8192)==0){W=X;break d}ba=c[aa>>2]|0;if((ba|0)==(c[ca>>2]|0)){pc[c[(c[Y>>2]|0)+40>>2]&127](Y)|0;J=Y;L=_;I=$;continue}else{c[aa>>2]=ba+1;J=Y;L=_;I=$;continue}}}else if((A|0)==60){A=0;I=c[P>>2]|0;if((I|0)==(c[Q>>2]|0)){pc[c[(c[K>>2]|0)+40>>2]&127](K)|0}else{c[P>>2]=I+1}W=G+1|0}}while(0);if((W|0)==(n|0)){A=65;break a}G=W;H=c[k>>2]|0}if((A|0)==20){c[k>>2]=4;ea=K;break}else if((A|0)==23){c[k>>2]=4;ea=K;break}else if((A|0)==26){c[k>>2]=4;ea=K;break}}}while(0);if((A|0)==65){ea=c[w>>2]|0}w=g;do{if((ea|0)==0){fa=0}else{if((c[ea+12>>2]|0)!=(c[ea+16>>2]|0)){fa=ea;break}if(!((pc[c[(c[ea>>2]|0)+36>>2]&127](ea)|0)==-1)){fa=ea;break}c[w>>2]=0;fa=0}}while(0);w=(fa|0)==0;ea=h;h=c[ea>>2]|0;e:do{if((h|0)==0){A=75}else{do{if((c[h+12>>2]|0)==(c[h+16>>2]|0)){if(!((pc[c[(c[h>>2]|0)+36>>2]&127](h)|0)==-1)){break}c[ea>>2]=0;A=75;break e}}while(0);if(!w){break}ga=e;c[ga>>2]=fa;i=o;return}}while(0);do{if((A|0)==75){if(w){break}ga=e;c[ga>>2]=fa;i=o;return}}while(0);c[k>>2]=c[k>>2]|2;ga=e;c[ga>>2]=fa;i=o;return}function Jh(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Kh(a){a=a|0;i=i;return}function Lh(a){a=a|0;i=i;return 2}function Mh(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 j=0,k=0,l=0,m=0,n=0;j=i;i=i+32|0;k=j;l=j+8|0;m=j+16|0;n=j+24|0;c[m>>2]=c[d>>2];c[n>>2]=c[e>>2];e=l;d=m;c[e+0>>2]=c[d+0>>2];d=k;e=n;c[d+0>>2]=c[e+0>>2];Ih(a,b,l,k,f,g,h,4032,4040|0);i=j;return}function Nh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=i;i=i+32|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=d+8|0;q=pc[c[(c[p>>2]|0)+20>>2]&127](p)|0;c[n>>2]=c[e>>2];c[o>>2]=c[f>>2];f=a[q]|0;if((f&1)==0){r=q+1|0;s=q+1|0;t=(f&255)>>>1}else{f=c[q+8>>2]|0;r=f;s=f;t=c[q+4>>2]|0}q=r+t|0;t=m;r=n;c[t+0>>2]=c[r+0>>2];r=l;t=o;c[r+0>>2]=c[t+0>>2];Ih(b,d,m,l,g,h,j,s,q);i=k;return}function Oh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Qe(n,f);f=n;n=c[f>>2]|0;if(!((c[1282]|0)==-1)){c[m>>2]=5128;c[m+4>>2]=118;c[m+8>>2]=0;qe(5128,m,119)}m=(c[5132>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=pc[c[c[e>>2]>>2]&127](e)|0;c[l>>2]=f;f=b+168|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=jg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=168){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+24>>2]=((g|0)/12|0|0)%7|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Ph(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Qe(n,f);f=n;n=c[f>>2]|0;if(!((c[1282]|0)==-1)){c[m>>2]=5128;c[m+4>>2]=118;c[m+8>>2]=0;qe(5128,m,119)}m=(c[5132>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=pc[c[(c[e>>2]|0)+4>>2]&127](e)|0;c[l>>2]=f;f=b+288|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=jg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=288){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+16>>2]=((g|0)/12|0|0)%12|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Qh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+40|0;j=b;k=b+8|0;l=b+16|0;m=b+32|0;Qe(m,f);f=m;m=c[f>>2]|0;if(!((c[1282]|0)==-1)){c[l>>2]=5128;c[l+4>>2]=118;c[l+8>>2]=0;qe(5128,l,119)}l=(c[5132>>2]|0)+ -1|0;n=c[m+8>>2]|0;if(!((c[m+12>>2]|0)-n>>2>>>0>l>>>0)){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}m=c[n+(l<<2)>>2]|0;if((m|0)==0){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}o=m;Yd(c[f>>2]|0)|0;f=h+20|0;c[k>>2]=c[e>>2];e=j;h=k;c[e+0>>2]=c[h+0>>2];h=Uh(d,j,g,o,4)|0;if((c[g>>2]&4|0)!=0){q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}if((h|0)<69){t=h+2e3|0}else{t=(h+ -69|0)>>>0<31?h+1900|0:h}c[f>>2]=t+ -1900;q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}function Rh(b,d,e,f,g,h,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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,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;l=i;i=i+576|0;m=l;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+312|0;_=l+320|0;$=l+328|0;aa=l+336|0;ba=l+344|0;ca=l+352|0;da=l+368|0;ea=l+376|0;fa=l+384|0;ga=l+392|0;ha=l+400|0;ia=l+408|0;ja=l+416|0;ka=l+424|0;la=l+432|0;ma=l+440|0;na=l+448|0;oa=l+456|0;pa=l+464|0;qa=l+472|0;ra=l+480|0;sa=l+488|0;ta=l+496|0;ua=l+504|0;va=l+512|0;wa=l+520|0;xa=l+528|0;ya=l+536|0;za=l+544|0;Aa=l+552|0;Ba=l+560|0;Ca=l+568|0;c[h>>2]=0;Qe(da,g);Da=da;da=c[Da>>2]|0;if(!((c[1282]|0)==-1)){c[ca>>2]=5128;c[ca+4>>2]=118;c[ca+8>>2]=0;qe(5128,ca,119)}ca=(c[5132>>2]|0)+ -1|0;Ea=c[da+8>>2]|0;if(!((c[da+12>>2]|0)-Ea>>2>>>0>ca>>>0)){Fa=vb(4)|0;Ga=Fa;pm(Ga);cc(Fa|0,13088,107)}da=c[Ea+(ca<<2)>>2]|0;if((da|0)==0){Fa=vb(4)|0;Ga=Fa;pm(Ga);cc(Fa|0,13088,107)}Fa=da;Yd(c[Da>>2]|0)|0;a:do{switch(k<<24>>24|0){case 106:{c[Y>>2]=c[f>>2];c[F+0>>2]=c[Y+0>>2];Da=Uh(e,F,h,Fa,3)|0;da=c[h>>2]|0;if((da&4|0)==0&(Da|0)<366){c[j+28>>2]=Da;break a}else{c[h>>2]=da|4;break a}break};case 104:case 66:case 98:{da=c[f>>2]|0;Da=d+8|0;Ga=pc[c[(c[Da>>2]|0)+4>>2]&127](Da)|0;c[aa>>2]=da;c[P+0>>2]=c[aa+0>>2];da=(jg(e,P,Ga,Ga+288|0,Fa,h,0)|0)-Ga|0;if((da|0)>=288){break a}c[j+16>>2]=((da|0)/12|0|0)%12|0;break};case 65:case 97:{da=c[f>>2]|0;Ga=d+8|0;Da=pc[c[c[Ga>>2]>>2]&127](Ga)|0;c[ba>>2]=da;c[Q+0>>2]=c[ba+0>>2];da=(jg(e,Q,Da,Da+168|0,Fa,h,0)|0)-Da|0;if((da|0)>=168){break a}c[j+24>>2]=((da|0)/12|0|0)%7|0;break};case 73:{da=j+8|0;c[Z>>2]=c[f>>2];c[G+0>>2]=c[Z+0>>2];Da=Uh(e,G,h,Fa,2)|0;Ga=c[h>>2]|0;do{if((Ga&4|0)==0){if(!((Da+ -1|0)>>>0<12)){break}c[da>>2]=Da;break a}}while(0);c[h>>2]=Ga|4;break};case 99:{Da=d+8|0;da=pc[c[(c[Da>>2]|0)+12>>2]&127](Da)|0;Da=e;c[fa>>2]=c[Da>>2];c[ga>>2]=c[f>>2];ca=a[da]|0;if((ca&1)==0){Ha=da+1|0;Ia=da+1|0;Ja=(ca&255)>>>1}else{ca=c[da+8>>2]|0;Ha=ca;Ia=ca;Ja=c[da+4>>2]|0}c[O+0>>2]=c[fa+0>>2];c[N+0>>2]=c[ga+0>>2];Ih(ea,d,O,N,g,h,j,Ia,Ha+Ja|0);c[Da>>2]=c[ea>>2];break};case 70:{Da=e;c[la>>2]=c[Da>>2];c[ma>>2]=c[f>>2];c[J+0>>2]=c[la+0>>2];c[I+0>>2]=c[ma+0>>2];Ih(ka,d,J,I,g,h,j,4048,4056|0);c[Da>>2]=c[ka>>2];break};case 68:{Da=e;c[ia>>2]=c[Da>>2];c[ja>>2]=c[f>>2];c[L+0>>2]=c[ia+0>>2];c[K+0>>2]=c[ja+0>>2];Ih(ha,d,L,K,g,h,j,4040,4048|0);c[Da>>2]=c[ha>>2];break};case 101:case 100:{Da=j+12|0;c[$>>2]=c[f>>2];c[M+0>>2]=c[$+0>>2];da=Uh(e,M,h,Fa,2)|0;ca=c[h>>2]|0;do{if((ca&4|0)==0){if(!((da+ -1|0)>>>0<31)){break}c[Da>>2]=da;break a}}while(0);c[h>>2]=ca|4;break};case 72:{c[_>>2]=c[f>>2];c[H+0>>2]=c[_+0>>2];da=Uh(e,H,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<24){c[j+8>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 109:{c[X>>2]=c[f>>2];c[E+0>>2]=c[X+0>>2];Da=Uh(e,E,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(Da|0)<13){c[j+16>>2]=Da+ -1;break a}else{c[h>>2]=da|4;break a}break};case 77:{c[W>>2]=c[f>>2];c[D+0>>2]=c[W+0>>2];da=Uh(e,D,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<60){c[j+4>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 116:case 110:{c[na>>2]=c[f>>2];c[C+0>>2]=c[na+0>>2];Sh(0,e,C,h,Fa);break};case 112:{Da=j+8|0;da=c[f>>2]|0;Ga=d+8|0;Ea=pc[c[(c[Ga>>2]|0)+8>>2]&127](Ga)|0;Ga=a[Ea]|0;if((Ga&1)==0){Ka=(Ga&255)>>>1}else{Ka=c[Ea+4>>2]|0}Ga=a[Ea+12|0]|0;if((Ga&1)==0){La=(Ga&255)>>>1}else{La=c[Ea+16>>2]|0}if((Ka|0)==(0-La|0)){c[h>>2]=c[h>>2]|4;break a}c[V>>2]=da;c[B+0>>2]=c[V+0>>2];da=jg(e,B,Ea,Ea+24|0,Fa,h,0)|0;Ga=da-Ea|0;do{if((da|0)==(Ea|0)){if((c[Da>>2]|0)!=12){break}c[Da>>2]=0;break a}}while(0);if((Ga|0)!=12){break a}Ea=c[Da>>2]|0;if((Ea|0)>=12){break a}c[Da>>2]=Ea+12;break};case 114:{Ea=e;c[pa>>2]=c[Ea>>2];c[qa>>2]=c[f>>2];c[A+0>>2]=c[pa+0>>2];c[z+0>>2]=c[qa+0>>2];Ih(oa,d,A,z,g,h,j,4056,4067|0);c[Ea>>2]=c[oa>>2];break};case 82:{Ea=e;c[sa>>2]=c[Ea>>2];c[ta>>2]=c[f>>2];c[y+0>>2]=c[sa+0>>2];c[x+0>>2]=c[ta+0>>2];Ih(ra,d,y,x,g,h,j,4072,4077|0);c[Ea>>2]=c[ra>>2];break};case 83:{c[U>>2]=c[f>>2];c[w+0>>2]=c[U+0>>2];Ea=Uh(e,w,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(Ea|0)<61){c[j>>2]=Ea;break a}else{c[h>>2]=da|4;break a}break};case 84:{da=e;c[va>>2]=c[da>>2];c[wa>>2]=c[f>>2];c[v+0>>2]=c[va+0>>2];c[u+0>>2]=c[wa+0>>2];Ih(ua,d,v,u,g,h,j,4080,4088|0);c[da>>2]=c[ua>>2];break};case 119:{c[T>>2]=c[f>>2];c[t+0>>2]=c[T+0>>2];da=Uh(e,t,h,Fa,1)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(da|0)<7){c[j+24>>2]=da;break a}else{c[h>>2]=Ea|4;break a}break};case 120:{Ea=c[(c[d>>2]|0)+20>>2]|0;c[xa>>2]=c[e>>2];c[ya>>2]=c[f>>2];c[s+0>>2]=c[xa+0>>2];c[r+0>>2]=c[ya+0>>2];kc[Ea&63](b,d,s,r,g,h,j);i=l;return};case 88:{Ea=d+8|0;da=pc[c[(c[Ea>>2]|0)+24>>2]&127](Ea)|0;Ea=e;c[Aa>>2]=c[Ea>>2];c[Ba>>2]=c[f>>2];ca=a[da]|0;if((ca&1)==0){Ma=da+1|0;Na=da+1|0;Oa=(ca&255)>>>1}else{ca=c[da+8>>2]|0;Ma=ca;Na=ca;Oa=c[da+4>>2]|0}c[q+0>>2]=c[Aa+0>>2];c[p+0>>2]=c[Ba+0>>2];Ih(za,d,q,p,g,h,j,Na,Ma+Oa|0);c[Ea>>2]=c[za>>2];break};case 121:{c[S>>2]=c[f>>2];c[o+0>>2]=c[S+0>>2];Ea=Uh(e,o,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}if((Ea|0)<69){Pa=Ea+2e3|0}else{Pa=(Ea+ -69|0)>>>0<31?Ea+1900|0:Ea}c[j+20>>2]=Pa+ -1900;break};case 89:{c[R>>2]=c[f>>2];c[n+0>>2]=c[R+0>>2];Ea=Uh(e,n,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}c[j+20>>2]=Ea+ -1900;break};case 37:{c[Ca>>2]=c[f>>2];c[m+0>>2]=c[Ca+0>>2];Th(0,e,m,h,Fa);break};default:{c[h>>2]=c[h>>2]|4}}}while(0);c[b>>2]=c[e>>2];i=l;return}function Sh(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a=i;j=e;e=f;f=h+8|0;a:while(1){h=c[j>>2]|0;do{if((h|0)==0){k=0}else{if((c[h+12>>2]|0)!=(c[h+16>>2]|0)){k=h;break}if((pc[c[(c[h>>2]|0)+36>>2]&127](h)|0)==-1){c[j>>2]=0;k=0;break}else{k=c[j>>2]|0;break}}}while(0);h=(k|0)==0;l=c[e>>2]|0;do{if((l|0)==0){m=12}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){if(h){n=l;break}else{o=l;break a}}if((pc[c[(c[l>>2]|0)+36>>2]&127](l)|0)==-1){c[e>>2]=0;m=12;break}else{if(h){n=l;break}else{o=l;break a}}}}while(0);if((m|0)==12){m=0;if(h){o=0;break}else{n=0}}l=c[j>>2]|0;p=c[l+12>>2]|0;if((p|0)==(c[l+16>>2]|0)){q=pc[c[(c[l>>2]|0)+36>>2]&127](l)|0}else{q=d[p]|0}if(!((q&255)<<24>>24>-1)){o=n;break}if((b[(c[f>>2]|0)+(q<<24>>24<<1)>>1]&8192)==0){o=n;break}p=c[j>>2]|0;l=p+12|0;r=c[l>>2]|0;if((r|0)==(c[p+16>>2]|0)){pc[c[(c[p>>2]|0)+40>>2]&127](p)|0;continue}else{c[l>>2]=r+1;continue}}n=c[j>>2]|0;do{if((n|0)==0){s=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){s=n;break}if((pc[c[(c[n>>2]|0)+36>>2]&127](n)|0)==-1){c[j>>2]=0;s=0;break}else{s=c[j>>2]|0;break}}}while(0);j=(s|0)==0;b:do{if((o|0)==0){m=32}else{do{if((c[o+12>>2]|0)==(c[o+16>>2]|0)){if(!((pc[c[(c[o>>2]|0)+36>>2]&127](o)|0)==-1)){break}c[e>>2]=0;m=32;break b}}while(0);if(!j){break}i=a;return}}while(0);do{if((m|0)==32){if(j){break}i=a;return}}while(0);c[g>>2]=c[g>>2]|2;i=a;return}function Th(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;a=i;h=b;b=c[h>>2]|0;do{if((b|0)==0){j=0}else{if((c[b+12>>2]|0)!=(c[b+16>>2]|0)){j=b;break}if((pc[c[(c[b>>2]|0)+36>>2]&127](b)|0)==-1){c[h>>2]=0;j=0;break}else{j=c[h>>2]|0;break}}}while(0);b=(j|0)==0;j=e;e=c[j>>2]|0;a:do{if((e|0)==0){k=11}else{do{if((c[e+12>>2]|0)==(c[e+16>>2]|0)){if(!((pc[c[(c[e>>2]|0)+36>>2]&127](e)|0)==-1)){break}c[j>>2]=0;k=11;break a}}while(0);if(b){l=e}else{k=12}}}while(0);if((k|0)==11){if(b){k=12}else{l=0}}if((k|0)==12){c[f>>2]=c[f>>2]|6;i=a;return}b=c[h>>2]|0;e=c[b+12>>2]|0;if((e|0)==(c[b+16>>2]|0)){m=pc[c[(c[b>>2]|0)+36>>2]&127](b)|0}else{m=d[e]|0}if(!((jc[c[(c[g>>2]|0)+36>>2]&31](g,m&255,0)|0)<<24>>24==37)){c[f>>2]=c[f>>2]|4;i=a;return}m=c[h>>2]|0;g=m+12|0;e=c[g>>2]|0;if((e|0)==(c[m+16>>2]|0)){pc[c[(c[m>>2]|0)+40>>2]&127](m)|0}else{c[g>>2]=e+1}e=c[h>>2]|0;do{if((e|0)==0){n=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){n=e;break}if((pc[c[(c[e>>2]|0)+36>>2]&127](e)|0)==-1){c[h>>2]=0;n=0;break}else{n=c[h>>2]|0;break}}}while(0);h=(n|0)==0;b:do{if((l|0)==0){k=31}else{do{if((c[l+12>>2]|0)==(c[l+16>>2]|0)){if(!((pc[c[(c[l>>2]|0)+36>>2]&127](l)|0)==-1)){break}c[j>>2]=0;k=31;break b}}while(0);if(!h){break}i=a;return}}while(0);do{if((k|0)==31){if(h){break}i=a;return}}while(0);c[f>>2]=c[f>>2]|2;i=a;return}function Uh(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|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,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;j=i;k=a;a=c[k>>2]|0;do{if((a|0)==0){l=0}else{if((c[a+12>>2]|0)!=(c[a+16>>2]|0)){l=a;break}if((pc[c[(c[a>>2]|0)+36>>2]&127](a)|0)==-1){c[k>>2]=0;l=0;break}else{l=c[k>>2]|0;break}}}while(0);a=(l|0)==0;l=e;e=c[l>>2]|0;a:do{if((e|0)==0){m=11}else{do{if((c[e+12>>2]|0)==(c[e+16>>2]|0)){if(!((pc[c[(c[e>>2]|0)+36>>2]&127](e)|0)==-1)){break}c[l>>2]=0;m=11;break a}}while(0);if(a){n=e}else{m=12}}}while(0);if((m|0)==11){if(a){m=12}else{n=0}}if((m|0)==12){c[f>>2]=c[f>>2]|6;o=0;i=j;return o|0}a=c[k>>2]|0;e=c[a+12>>2]|0;if((e|0)==(c[a+16>>2]|0)){p=pc[c[(c[a>>2]|0)+36>>2]&127](a)|0}else{p=d[e]|0}e=p&255;do{if(e<<24>>24>-1){a=g+8|0;if((b[(c[a>>2]|0)+(p<<24>>24<<1)>>1]&2048)==0){break}q=g;r=(jc[c[(c[q>>2]|0)+36>>2]&31](g,e,0)|0)<<24>>24;s=c[k>>2]|0;t=s+12|0;u=c[t>>2]|0;if((u|0)==(c[s+16>>2]|0)){pc[c[(c[s>>2]|0)+40>>2]&127](s)|0;v=h;w=n;x=n;y=r}else{c[t>>2]=u+1;v=h;w=n;x=n;y=r}while(1){z=y+ -48|0;r=v+ -1|0;u=c[k>>2]|0;do{if((u|0)==0){A=0}else{if((c[u+12>>2]|0)!=(c[u+16>>2]|0)){A=u;break}if((pc[c[(c[u>>2]|0)+36>>2]&127](u)|0)==-1){c[k>>2]=0;A=0;break}else{A=c[k>>2]|0;break}}}while(0);u=(A|0)==0;do{if((x|0)==0){B=w;C=0}else{if((c[x+12>>2]|0)!=(c[x+16>>2]|0)){B=w;C=x;break}if(!((pc[c[(c[x>>2]|0)+36>>2]&127](x)|0)==-1)){B=w;C=w;break}c[l>>2]=0;B=0;C=0}}while(0);D=c[k>>2]|0;if(!((u^(C|0)==0)&(r|0)>0)){m=40;break}t=c[D+12>>2]|0;if((t|0)==(c[D+16>>2]|0)){E=pc[c[(c[D>>2]|0)+36>>2]&127](D)|0}else{E=d[t]|0}t=E&255;if(!(t<<24>>24>-1)){o=z;m=52;break}if((b[(c[a>>2]|0)+(E<<24>>24<<1)>>1]&2048)==0){o=z;m=52;break}s=((jc[c[(c[q>>2]|0)+36>>2]&31](g,t,0)|0)<<24>>24)+(z*10|0)|0;t=c[k>>2]|0;F=t+12|0;G=c[F>>2]|0;if((G|0)==(c[t+16>>2]|0)){pc[c[(c[t>>2]|0)+40>>2]&127](t)|0;H=r;w=B;x=C;y=s;v=H;continue}else{c[F>>2]=G+1;H=r;w=B;x=C;y=s;v=H;continue}}if((m|0)==40){do{if((D|0)==0){I=0}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){I=D;break}if((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1){c[k>>2]=0;I=0;break}else{I=c[k>>2]|0;break}}}while(0);q=(I|0)==0;b:do{if((B|0)==0){m=50}else{do{if((c[B+12>>2]|0)==(c[B+16>>2]|0)){if(!((pc[c[(c[B>>2]|0)+36>>2]&127](B)|0)==-1)){break}c[l>>2]=0;m=50;break b}}while(0);if(q){o=z}else{break}i=j;return o|0}}while(0);do{if((m|0)==50){if(q){break}else{o=z}i=j;return o|0}}while(0);c[f>>2]=c[f>>2]|2;o=z;i=j;return o|0}else if((m|0)==52){i=j;return o|0}}}while(0);c[f>>2]=c[f>>2]|4;o=0;i=j;return o|0}function Vh(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;l=i;i=i+64|0;m=l;n=l+8|0;o=l+16|0;p=l+32|0;q=l+40|0;r=l+48|0;s=l+56|0;Qe(p,f);t=p;p=c[t>>2]|0;if(!((c[1280]|0)==-1)){c[o>>2]=5120;c[o+4>>2]=118;c[o+8>>2]=0;qe(5120,o,119)}o=(c[5124>>2]|0)+ -1|0;u=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-u>>2>>>0>o>>>0)){v=vb(4)|0;w=v;pm(w);cc(v|0,13088,107)}p=c[u+(o<<2)>>2]|0;if((p|0)==0){v=vb(4)|0;w=v;pm(w);cc(v|0,13088,107)}v=p;Yd(c[t>>2]|0)|0;c[g>>2]=0;t=d;a:do{if((j|0)==(k|0)){x=69}else{w=e;o=p;u=p;y=p;z=b;A=r;B=s;C=q;D=j;E=0;b:while(1){F=E;while(1){if((F|0)!=0){x=69;break a}G=c[t>>2]|0;do{if((G|0)==0){H=0;I=1}else{J=c[G+12>>2]|0;if((J|0)==(c[G+16>>2]|0)){K=pc[c[(c[G>>2]|0)+36>>2]&127](G)|0}else{K=c[J>>2]|0}if(!((K|0)==-1)){H=G;I=0;break}c[t>>2]=0;H=0;I=1}}while(0);G=c[w>>2]|0;do{if((G|0)==0){x=22}else{J=c[G+12>>2]|0;if((J|0)==(c[G+16>>2]|0)){L=pc[c[(c[G>>2]|0)+36>>2]&127](G)|0}else{L=c[J>>2]|0}if((L|0)==-1){c[w>>2]=0;x=22;break}else{if(I){M=G;break}else{x=24;break b}}}}while(0);if((x|0)==22){x=0;if(I){x=24;break b}else{M=0}}if((jc[c[(c[o>>2]|0)+52>>2]&31](v,c[D>>2]|0,0)|0)<<24>>24==37){x=26;break}if(jc[c[(c[u>>2]|0)+12>>2]&31](v,8192,c[D>>2]|0)|0){N=D;x=36;break}O=H+12|0;G=c[O>>2]|0;P=H+16|0;if((G|0)==(c[P>>2]|0)){Q=pc[c[(c[H>>2]|0)+36>>2]&127](H)|0}else{Q=c[G>>2]|0}G=yc[c[(c[y>>2]|0)+28>>2]&31](v,Q)|0;if((G|0)==(yc[c[(c[y>>2]|0)+28>>2]&31](v,c[D>>2]|0)|0)){x=64;break}c[g>>2]=4;F=4}c:do{if((x|0)==26){x=0;F=D+4|0;if((F|0)==(k|0)){x=27;break b}G=jc[c[(c[o>>2]|0)+52>>2]&31](v,c[F>>2]|0,0)|0;if(G<<24>>24==48|G<<24>>24==69){J=D+8|0;if((J|0)==(k|0)){x=30;break b}R=J;S=jc[c[(c[o>>2]|0)+52>>2]&31](v,c[J>>2]|0,0)|0;T=G}else{R=F;S=G;T=0}G=c[(c[z>>2]|0)+36>>2]|0;c[A>>2]=H;c[B>>2]=M;F=n;J=r;c[F+0>>2]=c[J+0>>2];J=m;F=s;c[J+0>>2]=c[F+0>>2];oc[G&3](q,b,n,m,f,g,h,S,T);c[t>>2]=c[C>>2];U=R+4|0}else if((x|0)==36){while(1){x=0;G=N+4|0;if((G|0)==(k|0)){V=k;break}if(jc[c[(c[u>>2]|0)+12>>2]&31](v,8192,c[G>>2]|0)|0){N=G;x=36}else{V=G;break}}G=H;F=M;J=M;while(1){do{if((G|0)==0){W=0;X=1}else{Y=c[G+12>>2]|0;if((Y|0)==(c[G+16>>2]|0)){Z=pc[c[(c[G>>2]|0)+36>>2]&127](G)|0}else{Z=c[Y>>2]|0}if(!((Z|0)==-1)){W=G;X=0;break}c[t>>2]=0;W=0;X=1}}while(0);do{if((J|0)==0){_=F;x=51}else{Y=c[J+12>>2]|0;if((Y|0)==(c[J+16>>2]|0)){$=pc[c[(c[J>>2]|0)+36>>2]&127](J)|0}else{$=c[Y>>2]|0}if(($|0)==-1){c[w>>2]=0;_=0;x=51;break}else{if(X^(F|0)==0){aa=F;ba=F;break}else{U=V;break c}}}}while(0);if((x|0)==51){x=0;if(X){U=V;break c}else{aa=_;ba=0}}Y=W+12|0;ca=c[Y>>2]|0;da=W+16|0;if((ca|0)==(c[da>>2]|0)){ea=pc[c[(c[W>>2]|0)+36>>2]&127](W)|0}else{ea=c[ca>>2]|0}if(!(jc[c[(c[u>>2]|0)+12>>2]&31](v,8192,ea)|0)){U=V;break c}ca=c[Y>>2]|0;if((ca|0)==(c[da>>2]|0)){pc[c[(c[W>>2]|0)+40>>2]&127](W)|0;G=W;F=aa;J=ba;continue}else{c[Y>>2]=ca+4;G=W;F=aa;J=ba;continue}}}else if((x|0)==64){x=0;J=c[O>>2]|0;if((J|0)==(c[P>>2]|0)){pc[c[(c[H>>2]|0)+40>>2]&127](H)|0}else{c[O>>2]=J+4}U=D+4|0}}while(0);if((U|0)==(k|0)){x=69;break a}D=U;E=c[g>>2]|0}if((x|0)==24){c[g>>2]=4;fa=H;break}else if((x|0)==27){c[g>>2]=4;fa=H;break}else if((x|0)==30){c[g>>2]=4;fa=H;break}}}while(0);if((x|0)==69){fa=c[t>>2]|0}t=d;do{if((fa|0)==0){ga=0;ha=1}else{d=c[fa+12>>2]|0;if((d|0)==(c[fa+16>>2]|0)){ia=pc[c[(c[fa>>2]|0)+36>>2]&127](fa)|0}else{ia=c[d>>2]|0}if(!((ia|0)==-1)){ga=fa;ha=0;break}c[t>>2]=0;ga=0;ha=1}}while(0);t=e;e=c[t>>2]|0;do{if((e|0)==0){x=82}else{fa=c[e+12>>2]|0;if((fa|0)==(c[e+16>>2]|0)){ja=pc[c[(c[e>>2]|0)+36>>2]&127](e)|0}else{ja=c[fa>>2]|0}if((ja|0)==-1){c[t>>2]=0;x=82;break}if(!ha){break}ka=a;c[ka>>2]=ga;i=l;return}}while(0);do{if((x|0)==82){if(ha){break}ka=a;c[ka>>2]=ga;i=l;return}}while(0);c[g>>2]=c[g>>2]|2;ka=a;c[ka>>2]=ga;i=l;return}function Wh(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Xh(a){a=a|0;i=i;return}function Yh(a){a=a|0;i=i;return 2}function Zh(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 j=0,k=0,l=0,m=0,n=0;j=i;i=i+32|0;k=j;l=j+8|0;m=j+16|0;n=j+24|0;c[m>>2]=c[d>>2];c[n>>2]=c[e>>2];e=l;d=m;c[e+0>>2]=c[d+0>>2];d=k;e=n;c[d+0>>2]=c[e+0>>2];Vh(a,b,l,k,f,g,h,4184,4216|0);i=j;return}function _h(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=i;i=i+32|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=d+8|0;q=pc[c[(c[p>>2]|0)+20>>2]&127](p)|0;c[n>>2]=c[e>>2];c[o>>2]=c[f>>2];f=a[q]|0;if((f&1)==0){r=q+4|0;s=q+4|0;t=(f&255)>>>1}else{f=c[q+8>>2]|0;r=f;s=f;t=c[q+4>>2]|0}q=r+(t<<2)|0;t=m;r=n;c[t+0>>2]=c[r+0>>2];r=l;t=o;c[r+0>>2]=c[t+0>>2];Vh(b,d,m,l,g,h,j,s,q);i=k;return}function $h(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Qe(n,f);f=n;n=c[f>>2]|0;if(!((c[1280]|0)==-1)){c[m>>2]=5120;c[m+4>>2]=118;c[m+8>>2]=0;qe(5120,m,119)}m=(c[5124>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=pc[c[c[e>>2]>>2]&127](e)|0;c[l>>2]=f;f=b+168|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=Ig(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=168){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+24>>2]=((g|0)/12|0|0)%7|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function ai(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Qe(n,f);f=n;n=c[f>>2]|0;if(!((c[1280]|0)==-1)){c[m>>2]=5120;c[m+4>>2]=118;c[m+8>>2]=0;qe(5120,m,119)}m=(c[5124>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=vb(4)|0;q=p;pm(q);cc(p|0,13088,107)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=pc[c[(c[e>>2]|0)+4>>2]&127](e)|0;c[l>>2]=f;f=b+288|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=Ig(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=288){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+16>>2]=((g|0)/12|0|0)%12|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function bi(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+40|0;j=b;k=b+8|0;l=b+16|0;m=b+32|0;Qe(m,f);f=m;m=c[f>>2]|0;if(!((c[1280]|0)==-1)){c[l>>2]=5120;c[l+4>>2]=118;c[l+8>>2]=0;qe(5120,l,119)}l=(c[5124>>2]|0)+ -1|0;n=c[m+8>>2]|0;if(!((c[m+12>>2]|0)-n>>2>>>0>l>>>0)){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}m=c[n+(l<<2)>>2]|0;if((m|0)==0){o=vb(4)|0;p=o;pm(p);cc(o|0,13088,107)}o=m;Yd(c[f>>2]|0)|0;f=h+20|0;c[k>>2]=c[e>>2];e=j;h=k;c[e+0>>2]=c[h+0>>2];h=fi(d,j,g,o,4)|0;if((c[g>>2]&4|0)!=0){q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}if((h|0)<69){t=h+2e3|0}else{t=(h+ -69|0)>>>0<31?h+1900|0:h}c[f>>2]=t+ -1900;q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}function ci(b,d,e,f,g,h,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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,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;l=i;i=i+576|0;m=l;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+312|0;_=l+320|0;$=l+328|0;aa=l+336|0;ba=l+344|0;ca=l+352|0;da=l+368|0;ea=l+376|0;fa=l+384|0;ga=l+392|0;ha=l+400|0;ia=l+408|0;ja=l+416|0;ka=l+424|0;la=l+432|0;ma=l+440|0;na=l+448|0;oa=l+456|0;pa=l+464|0;qa=l+472|0;ra=l+480|0;sa=l+488|0;ta=l+496|0;ua=l+504|0;va=l+512|0;wa=l+520|0;xa=l+528|0;ya=l+536|0;za=l+544|0;Aa=l+552|0;Ba=l+560|0;Ca=l+568|0;c[h>>2]=0;Qe(da,g);Da=da;da=c[Da>>2]|0;if(!((c[1280]|0)==-1)){c[ca>>2]=5120;c[ca+4>>2]=118;c[ca+8>>2]=0;qe(5120,ca,119)}ca=(c[5124>>2]|0)+ -1|0;Ea=c[da+8>>2]|0;if(!((c[da+12>>2]|0)-Ea>>2>>>0>ca>>>0)){Fa=vb(4)|0;Ga=Fa;pm(Ga);cc(Fa|0,13088,107)}da=c[Ea+(ca<<2)>>2]|0;if((da|0)==0){Fa=vb(4)|0;Ga=Fa;pm(Ga);cc(Fa|0,13088,107)}Fa=da;Yd(c[Da>>2]|0)|0;a:do{switch(k<<24>>24|0){case 89:{c[R>>2]=c[f>>2];c[n+0>>2]=c[R+0>>2];Da=fi(e,n,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}c[j+20>>2]=Da+ -1900;break};case 121:{c[S>>2]=c[f>>2];c[o+0>>2]=c[S+0>>2];Da=fi(e,o,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}if((Da|0)<69){Ha=Da+2e3|0}else{Ha=(Da+ -69|0)>>>0<31?Da+1900|0:Da}c[j+20>>2]=Ha+ -1900;break};case 88:{Da=d+8|0;da=pc[c[(c[Da>>2]|0)+24>>2]&127](Da)|0;Da=e;c[Aa>>2]=c[Da>>2];c[Ba>>2]=c[f>>2];Ga=a[da]|0;if((Ga&1)==0){Ia=da+4|0;Ja=da+4|0;Ka=(Ga&255)>>>1}else{Ga=c[da+8>>2]|0;Ia=Ga;Ja=Ga;Ka=c[da+4>>2]|0}c[q+0>>2]=c[Aa+0>>2];c[p+0>>2]=c[Ba+0>>2];Vh(za,d,q,p,g,h,j,Ja,Ia+(Ka<<2)|0);c[Da>>2]=c[za>>2];break};case 37:{c[Ca>>2]=c[f>>2];c[m+0>>2]=c[Ca+0>>2];ei(0,e,m,h,Fa);break};case 84:{Da=e;c[va>>2]=c[Da>>2];c[wa>>2]=c[f>>2];c[v+0>>2]=c[va+0>>2];c[u+0>>2]=c[wa+0>>2];Vh(ua,d,v,u,g,h,j,4352,4384|0);c[Da>>2]=c[ua>>2];break};case 120:{Da=c[(c[d>>2]|0)+20>>2]|0;c[xa>>2]=c[e>>2];c[ya>>2]=c[f>>2];c[s+0>>2]=c[xa+0>>2];c[r+0>>2]=c[ya+0>>2];kc[Da&63](b,d,s,r,g,h,j);i=l;return};case 116:case 110:{c[na>>2]=c[f>>2];c[C+0>>2]=c[na+0>>2];di(0,e,C,h,Fa);break};case 112:{Da=j+8|0;da=c[f>>2]|0;Ga=d+8|0;ca=pc[c[(c[Ga>>2]|0)+8>>2]&127](Ga)|0;Ga=a[ca]|0;if((Ga&1)==0){La=(Ga&255)>>>1}else{La=c[ca+4>>2]|0}Ga=a[ca+12|0]|0;if((Ga&1)==0){Ma=(Ga&255)>>>1}else{Ma=c[ca+16>>2]|0}if((La|0)==(0-Ma|0)){c[h>>2]=c[h>>2]|4;break a}c[V>>2]=da;c[B+0>>2]=c[V+0>>2];da=Ig(e,B,ca,ca+24|0,Fa,h,0)|0;Ga=da-ca|0;do{if((da|0)==(ca|0)){if((c[Da>>2]|0)!=12){break}c[Da>>2]=0;break a}}while(0);if((Ga|0)!=12){break a}ca=c[Da>>2]|0;if((ca|0)>=12){break a}c[Da>>2]=ca+12;break};case 77:{c[W>>2]=c[f>>2];c[D+0>>2]=c[W+0>>2];ca=fi(e,D,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(ca|0)<60){c[j+4>>2]=ca;break a}else{c[h>>2]=da|4;break a}break};case 101:case 100:{da=j+12|0;c[$>>2]=c[f>>2];c[M+0>>2]=c[$+0>>2];ca=fi(e,M,h,Fa,2)|0;Ea=c[h>>2]|0;do{if((Ea&4|0)==0){if(!((ca+ -1|0)>>>0<31)){break}c[da>>2]=ca;break a}}while(0);c[h>>2]=Ea|4;break};case 68:{ca=e;c[ia>>2]=c[ca>>2];c[ja>>2]=c[f>>2];c[L+0>>2]=c[ia+0>>2];c[K+0>>2]=c[ja+0>>2];Vh(ha,d,L,K,g,h,j,4216,4248|0);c[ca>>2]=c[ha>>2];break};case 70:{ca=e;c[la>>2]=c[ca>>2];c[ma>>2]=c[f>>2];c[J+0>>2]=c[la+0>>2];c[I+0>>2]=c[ma+0>>2];Vh(ka,d,J,I,g,h,j,4248,4280|0);c[ca>>2]=c[ka>>2];break};case 72:{c[_>>2]=c[f>>2];c[H+0>>2]=c[_+0>>2];ca=fi(e,H,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(ca|0)<24){c[j+8>>2]=ca;break a}else{c[h>>2]=da|4;break a}break};case 73:{da=j+8|0;c[Z>>2]=c[f>>2];c[G+0>>2]=c[Z+0>>2];ca=fi(e,G,h,Fa,2)|0;Da=c[h>>2]|0;do{if((Da&4|0)==0){if(!((ca+ -1|0)>>>0<12)){break}c[da>>2]=ca;break a}}while(0);c[h>>2]=Da|4;break};case 106:{c[Y>>2]=c[f>>2];c[F+0>>2]=c[Y+0>>2];ca=fi(e,F,h,Fa,3)|0;da=c[h>>2]|0;if((da&4|0)==0&(ca|0)<366){c[j+28>>2]=ca;break a}else{c[h>>2]=da|4;break a}break};case 109:{c[X>>2]=c[f>>2];c[E+0>>2]=c[X+0>>2];da=fi(e,E,h,Fa,2)|0;ca=c[h>>2]|0;if((ca&4|0)==0&(da|0)<13){c[j+16>>2]=da+ -1;break a}else{c[h>>2]=ca|4;break a}break};case 65:case 97:{ca=c[f>>2]|0;da=d+8|0;Ea=pc[c[c[da>>2]>>2]&127](da)|0;c[ba>>2]=ca;c[Q+0>>2]=c[ba+0>>2];ca=(Ig(e,Q,Ea,Ea+168|0,Fa,h,0)|0)-Ea|0;if((ca|0)>=168){break a}c[j+24>>2]=((ca|0)/12|0|0)%7|0;break};case 104:case 66:case 98:{ca=c[f>>2]|0;Ea=d+8|0;da=pc[c[(c[Ea>>2]|0)+4>>2]&127](Ea)|0;c[aa>>2]=ca;c[P+0>>2]=c[aa+0>>2];ca=(Ig(e,P,da,da+288|0,Fa,h,0)|0)-da|0;if((ca|0)>=288){break a}c[j+16>>2]=((ca|0)/12|0|0)%12|0;break};case 99:{ca=d+8|0;da=pc[c[(c[ca>>2]|0)+12>>2]&127](ca)|0;ca=e;c[fa>>2]=c[ca>>2];c[ga>>2]=c[f>>2];Ea=a[da]|0;if((Ea&1)==0){Na=da+4|0;Oa=da+4|0;Pa=(Ea&255)>>>1}else{Ea=c[da+8>>2]|0;Na=Ea;Oa=Ea;Pa=c[da+4>>2]|0}c[O+0>>2]=c[fa+0>>2];c[N+0>>2]=c[ga+0>>2];Vh(ea,d,O,N,g,h,j,Oa,Na+(Pa<<2)|0);c[ca>>2]=c[ea>>2];break};case 114:{ca=e;c[pa>>2]=c[ca>>2];c[qa>>2]=c[f>>2];c[A+0>>2]=c[pa+0>>2];c[z+0>>2]=c[qa+0>>2];Vh(oa,d,A,z,g,h,j,4280,4324|0);c[ca>>2]=c[oa>>2];break};case 82:{ca=e;c[sa>>2]=c[ca>>2];c[ta>>2]=c[f>>2];c[y+0>>2]=c[sa+0>>2];c[x+0>>2]=c[ta+0>>2];Vh(ra,d,y,x,g,h,j,4328,4348|0);c[ca>>2]=c[ra>>2];break};case 83:{c[U>>2]=c[f>>2];c[w+0>>2]=c[U+0>>2];ca=fi(e,w,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(ca|0)<61){c[j>>2]=ca;break a}else{c[h>>2]=da|4;break a}break};case 119:{c[T>>2]=c[f>>2];c[t+0>>2]=c[T+0>>2];da=fi(e,t,h,Fa,1)|0;ca=c[h>>2]|0;if((ca&4|0)==0&(da|0)<7){c[j+24>>2]=da;break a}else{c[h>>2]=ca|4;break a}break};default:{c[h>>2]=c[h>>2]|4}}}while(0);c[b>>2]=c[e>>2];i=l;return}function di(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;a=i;g=b;b=d;d=f;a:while(1){h=c[g>>2]|0;do{if((h|0)==0){j=1}else{k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){l=pc[c[(c[h>>2]|0)+36>>2]&127](h)|0}else{l=c[k>>2]|0}if((l|0)==-1){c[g>>2]=0;j=1;break}else{j=(c[g>>2]|0)==0;break}}}while(0);h=c[b>>2]|0;do{if((h|0)==0){m=15}else{k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){n=pc[c[(c[h>>2]|0)+36>>2]&127](h)|0}else{n=c[k>>2]|0}if((n|0)==-1){c[b>>2]=0;m=15;break}else{if(j){o=h;break}else{p=h;break a}}}}while(0);if((m|0)==15){m=0;if(j){p=0;break}else{o=0}}h=c[g>>2]|0;k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){q=pc[c[(c[h>>2]|0)+36>>2]&127](h)|0}else{q=c[k>>2]|0}if(!(jc[c[(c[d>>2]|0)+12>>2]&31](f,8192,q)|0)){p=o;break}k=c[g>>2]|0;h=k+12|0;r=c[h>>2]|0;if((r|0)==(c[k+16>>2]|0)){pc[c[(c[k>>2]|0)+40>>2]&127](k)|0;continue}else{c[h>>2]=r+4;continue}}o=c[g>>2]|0;do{if((o|0)==0){s=1}else{q=c[o+12>>2]|0;if((q|0)==(c[o+16>>2]|0)){t=pc[c[(c[o>>2]|0)+36>>2]&127](o)|0}else{t=c[q>>2]|0}if((t|0)==-1){c[g>>2]=0;s=1;break}else{s=(c[g>>2]|0)==0;break}}}while(0);do{if((p|0)==0){m=37}else{g=c[p+12>>2]|0;if((g|0)==(c[p+16>>2]|0)){u=pc[c[(c[p>>2]|0)+36>>2]&127](p)|0}else{u=c[g>>2]|0}if((u|0)==-1){c[b>>2]=0;m=37;break}if(!s){break}i=a;return}}while(0);do{if((m|0)==37){if(s){break}i=a;return}}while(0);c[e>>2]=c[e>>2]|2;i=a;return}function ei(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a=i;g=b;b=c[g>>2]|0;do{if((b|0)==0){h=1}else{j=c[b+12>>2]|0;if((j|0)==(c[b+16>>2]|0)){k=pc[c[(c[b>>2]|0)+36>>2]&127](b)|0}else{k=c[j>>2]|0}if((k|0)==-1){c[g>>2]=0;h=1;break}else{h=(c[g>>2]|0)==0;break}}}while(0);k=d;d=c[k>>2]|0;do{if((d|0)==0){l=14}else{b=c[d+12>>2]|0;if((b|0)==(c[d+16>>2]|0)){m=pc[c[(c[d>>2]|0)+36>>2]&127](d)|0}else{m=c[b>>2]|0}if((m|0)==-1){c[k>>2]=0;l=14;break}else{if(h){n=d;break}else{l=16;break}}}}while(0);if((l|0)==14){if(h){l=16}else{n=0}}if((l|0)==16){c[e>>2]=c[e>>2]|6;i=a;return}h=c[g>>2]|0;d=c[h+12>>2]|0;if((d|0)==(c[h+16>>2]|0)){o=pc[c[(c[h>>2]|0)+36>>2]&127](h)|0}else{o=c[d>>2]|0}if(!((jc[c[(c[f>>2]|0)+52>>2]&31](f,o,0)|0)<<24>>24==37)){c[e>>2]=c[e>>2]|4;i=a;return}o=c[g>>2]|0;f=o+12|0;d=c[f>>2]|0;if((d|0)==(c[o+16>>2]|0)){pc[c[(c[o>>2]|0)+40>>2]&127](o)|0}else{c[f>>2]=d+4}d=c[g>>2]|0;do{if((d|0)==0){p=1}else{f=c[d+12>>2]|0;if((f|0)==(c[d+16>>2]|0)){q=pc[c[(c[d>>2]|0)+36>>2]&127](d)|0}else{q=c[f>>2]|0}if((q|0)==-1){c[g>>2]=0;p=1;break}else{p=(c[g>>2]|0)==0;break}}}while(0);do{if((n|0)==0){l=38}else{g=c[n+12>>2]|0;if((g|0)==(c[n+16>>2]|0)){r=pc[c[(c[n>>2]|0)+36>>2]&127](n)|0}else{r=c[g>>2]|0}if((r|0)==-1){c[k>>2]=0;l=38;break}if(!p){break}i=a;return}}while(0);do{if((l|0)==38){if(p){break}i=a;return}}while(0);c[e>>2]=c[e>>2]|2;i=a;return}function fi(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,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;g=i;h=a;a=c[h>>2]|0;do{if((a|0)==0){j=1}else{k=c[a+12>>2]|0;if((k|0)==(c[a+16>>2]|0)){l=pc[c[(c[a>>2]|0)+36>>2]&127](a)|0}else{l=c[k>>2]|0}if((l|0)==-1){c[h>>2]=0;j=1;break}else{j=(c[h>>2]|0)==0;break}}}while(0);l=b;b=c[l>>2]|0;do{if((b|0)==0){m=14}else{a=c[b+12>>2]|0;if((a|0)==(c[b+16>>2]|0)){n=pc[c[(c[b>>2]|0)+36>>2]&127](b)|0}else{n=c[a>>2]|0}if((n|0)==-1){c[l>>2]=0;m=14;break}else{if(j){o=b;break}else{m=16;break}}}}while(0);if((m|0)==14){if(j){m=16}else{o=0}}if((m|0)==16){c[d>>2]=c[d>>2]|6;p=0;i=g;return p|0}j=c[h>>2]|0;b=c[j+12>>2]|0;if((b|0)==(c[j+16>>2]|0)){q=pc[c[(c[j>>2]|0)+36>>2]&127](j)|0}else{q=c[b>>2]|0}b=e;if(!(jc[c[(c[b>>2]|0)+12>>2]&31](e,2048,q)|0)){c[d>>2]=c[d>>2]|4;p=0;i=g;return p|0}j=e;n=(jc[c[(c[j>>2]|0)+52>>2]&31](e,q,0)|0)<<24>>24;q=c[h>>2]|0;a=q+12|0;k=c[a>>2]|0;if((k|0)==(c[q+16>>2]|0)){pc[c[(c[q>>2]|0)+40>>2]&127](q)|0;r=f;s=o;t=o;u=n}else{c[a>>2]=k+4;r=f;s=o;t=o;u=n}while(1){v=u+ -48|0;n=r+ -1|0;o=c[h>>2]|0;do{if((o|0)==0){w=1}else{f=c[o+12>>2]|0;if((f|0)==(c[o+16>>2]|0)){x=pc[c[(c[o>>2]|0)+36>>2]&127](o)|0}else{x=c[f>>2]|0}if((x|0)==-1){c[h>>2]=0;w=1;break}else{w=(c[h>>2]|0)==0;break}}}while(0);do{if((t|0)==0){y=s;z=0;A=1}else{o=c[t+12>>2]|0;if((o|0)==(c[t+16>>2]|0)){B=pc[c[(c[t>>2]|0)+36>>2]&127](t)|0}else{B=c[o>>2]|0}if((B|0)==-1){c[l>>2]=0;y=0;z=0;A=1;break}else{y=s;z=s;A=(s|0)==0;break}}}while(0);C=c[h>>2]|0;if(!((w^A)&(n|0)>0)){break}o=c[C+12>>2]|0;if((o|0)==(c[C+16>>2]|0)){D=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{D=c[o>>2]|0}if(!(jc[c[(c[b>>2]|0)+12>>2]&31](e,2048,D)|0)){p=v;m=63;break}o=((jc[c[(c[j>>2]|0)+52>>2]&31](e,D,0)|0)<<24>>24)+(v*10|0)|0;f=c[h>>2]|0;k=f+12|0;a=c[k>>2]|0;if((a|0)==(c[f+16>>2]|0)){pc[c[(c[f>>2]|0)+40>>2]&127](f)|0;E=n;s=y;t=z;u=o;r=E;continue}else{c[k>>2]=a+4;E=n;s=y;t=z;u=o;r=E;continue}}if((m|0)==63){i=g;return p|0}do{if((C|0)==0){F=1}else{E=c[C+12>>2]|0;if((E|0)==(c[C+16>>2]|0)){G=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{G=c[E>>2]|0}if((G|0)==-1){c[h>>2]=0;F=1;break}else{F=(c[h>>2]|0)==0;break}}}while(0);do{if((y|0)==0){m=60}else{h=c[y+12>>2]|0;if((h|0)==(c[y+16>>2]|0)){H=pc[c[(c[y>>2]|0)+36>>2]&127](y)|0}else{H=c[h>>2]|0}if((H|0)==-1){c[l>>2]=0;m=60;break}if(F){p=v}else{break}i=g;return p|0}}while(0);do{if((m|0)==60){if(F){break}else{p=v}i=g;return p|0}}while(0);c[d>>2]=c[d>>2]|2;p=v;i=g;return p|0}function gi(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+8|0;f=c[e>>2]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);if((f|0)==(c[1254]|0)){g=b;Rm(g);i=d;return}ib(c[e>>2]|0);g=b;Rm(g);i=d;return}function hi(b){b=b|0;var d=0,e=0;d=i;e=b+8|0;b=c[e>>2]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);if((b|0)==(c[1254]|0)){i=d;return}ib(c[e>>2]|0);i=d;return}function ii(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+112|0;f=g;l=g+8|0;m=l;n=f;a[n]=37;o=f+1|0;a[o]=j;p=f+2|0;a[p]=k;a[f+3|0]=0;if(!(k<<24>>24==0)){a[o]=k;a[p]=j}j=Sb(m|0,100,n|0,h|0,c[d+8>>2]|0)|0;d=l+j|0;l=c[e>>2]|0;if((j|0)==0){q=l;r=b;c[r>>2]=q;i=g;return}else{s=m;t=l;u=l}while(1){l=a[s]|0;do{if((u|0)==0){v=t;w=0}else{m=u+24|0;j=c[m>>2]|0;if((j|0)==(c[u+28>>2]|0)){e=(yc[c[(c[u>>2]|0)+52>>2]&31](u,l&255)|0)==-1;v=e?0:t;w=e?0:u;break}else{c[m>>2]=j+1;a[j]=l;v=t;w=u;break}}}while(0);l=s+1|0;if((l|0)==(d|0)){q=v;break}else{s=l;t=v;u=w}}r=b;c[r>>2]=q;i=g;return}function ji(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+8|0;f=c[e>>2]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);if((f|0)==(c[1254]|0)){g=b;Rm(g);i=d;return}ib(c[e>>2]|0);g=b;Rm(g);i=d;return}function ki(b){b=b|0;var d=0,e=0;d=i;e=b+8|0;b=c[e>>2]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);if((b|0)==(c[1254]|0)){i=d;return}ib(c[e>>2]|0);i=d;return}function li(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+408|0;e=f;k=f+400|0;l=e;c[k>>2]=e+400;mi(b+8|0,l,k,g,h,j);j=c[k>>2]|0;k=c[d>>2]|0;if((l|0)==(j|0)){m=k;n=a;c[n>>2]=m;i=f;return}else{o=l;p=k;q=k}while(1){k=c[o>>2]|0;if((p|0)==0){r=q;s=0}else{l=p+24|0;d=c[l>>2]|0;if((d|0)==(c[p+28>>2]|0)){t=yc[c[(c[p>>2]|0)+52>>2]&31](p,k)|0}else{c[l>>2]=d+4;c[d>>2]=k;t=k}k=(t|0)==-1;r=k?0:q;s=k?0:p}k=o+4|0;if((k|0)==(j|0)){m=r;break}else{o=k;p=s;q=r}}n=a;c[n>>2]=m;i=f;return}function mi(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;i=i+120|0;k=j;l=j+112|0;m=i;i=i+8|0;n=j+8|0;o=k;a[o]=37;p=k+1|0;a[p]=g;q=k+2|0;a[q]=h;a[k+3|0]=0;if(!(h<<24>>24==0)){a[p]=h;a[q]=g}g=b;Sb(n|0,100,o|0,f|0,c[g>>2]|0)|0;f=l;c[f>>2]=0;c[f+4>>2]=0;c[m>>2]=n;n=(c[e>>2]|0)-d>>2;f=zb(c[g>>2]|0)|0;g=fm(d,m,n,l)|0;if((f|0)!=0){zb(f|0)|0}if((g|0)==-1){ij(6008)}else{c[e>>2]=d+(g<<2);i=j;return}}function ni(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function oi(a){a=a|0;i=i;return}function pi(a){a=a|0;i=i;return 127}function qi(a){a=a|0;i=i;return 127}function ri(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function si(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function ti(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function ui(a,b){a=a|0;b=b|0;b=i;ue(a,1,45);i=b;return}function vi(a){a=a|0;i=i;return 0}function wi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function xi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function yi(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function zi(a){a=a|0;i=i;return}function Ai(a){a=a|0;i=i;return 127}function Bi(a){a=a|0;i=i;return 127}function Ci(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Di(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Ei(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Fi(a,b){a=a|0;b=b|0;b=i;ue(a,1,45);i=b;return}function Gi(a){a=a|0;i=i;return 0}function Hi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ii(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ji(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Ki(a){a=a|0;i=i;return}function Li(a){a=a|0;i=i;return 2147483647}function Mi(a){a=a|0;i=i;return 2147483647}function Ni(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Oi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Pi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Qi(a,b){a=a|0;b=b|0;b=i;Ge(a,1,45);i=b;return}function Ri(a){a=a|0;i=i;return 0}function Si(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ti(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ui(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Vi(a){a=a|0;i=i;return}function Wi(a){a=a|0;i=i;return 2147483647}function Xi(a){a=a|0;i=i;return 2147483647}function Yi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Zi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function _i(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function $i(a,b){a=a|0;b=b|0;b=i;Ge(a,1,45);i=b;return}function aj(a){a=a|0;i=i;return 0}function bj(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function cj(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function dj(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function ej(a){a=a|0;i=i;return}function fj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+104|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=i;i=i+8|0;u=i;i=i+16|0;v=i;i=i+104|0;w=p;c[w>>2]=o;x=p+4|0;c[x>>2]=120;y=o+100|0;Qe(r,h);o=r;z=c[o>>2]|0;if(!((c[1282]|0)==-1)){c[n>>2]=5128;c[n+4>>2]=118;c[n+8>>2]=0;qe(5128,n,119)}n=(c[5132>>2]|0)+ -1|0;A=c[z+8>>2]|0;if(!((c[z+12>>2]|0)-A>>2>>>0>n>>>0)){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}z=c[A+(n<<2)>>2]|0;if((z|0)==0){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}B=z;a[s]=0;C=f;c[t>>2]=c[C>>2];f=c[h+4>>2]|0;h=l;n=t;c[h+0>>2]=c[n+0>>2];n=hj(e,l,g,r,f,j,s,B,p,q,y)|0;do{if(n){y=u;vc[c[(c[z>>2]|0)+32>>2]&7](B,4744,4754|0,y)|0;p=v;f=c[q>>2]|0;r=c[w>>2]|0;g=f-r|0;do{if((g|0)>98){l=Km(g+2|0)|0;if((l|0)!=0){D=l;E=l;break}Wm()}else{D=0;E=p}}while(0);if((a[s]|0)==0){F=E}else{a[E]=45;F=E+1|0}if(r>>>0<f>>>0){g=u+10|0;l=u;h=F;t=r;while(1){A=a[t]|0;G=y;while(1){H=G+1|0;if((a[G]|0)==A<<24>>24){I=G;break}if((H|0)==(g|0)){I=g;break}else{G=H}}a[h]=a[4744+(I-l)|0]|0;G=t+1|0;A=h+1|0;if(G>>>0<(c[q>>2]|0)>>>0){h=A;t=G}else{J=A;break}}}else{J=F}a[J]=0;c[m>>2]=k;if((Tb(p|0,4760,m|0)|0)!=1){t=vb(8)|0;ce(t,4768);cc(t|0,2136,21)}if((D|0)==0){break}Lm(D)}}while(0);D=e;e=c[D>>2]|0;do{if((e|0)==0){K=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){K=e;break}if(!((pc[c[(c[e>>2]|0)+36>>2]&127](e)|0)==-1)){K=e;break}c[D>>2]=0;K=0}}while(0);D=(K|0)==0;e=c[C>>2]|0;do{if((e|0)==0){L=31}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){if(D){break}else{L=33;break}}if((pc[c[(c[e>>2]|0)+36>>2]&127](e)|0)==-1){c[C>>2]=0;L=31;break}else{if(D){break}else{L=33;break}}}}while(0);if((L|0)==31){if(D){L=33}}if((L|0)==33){c[j>>2]=c[j>>2]|2}c[b>>2]=K;Yd(c[o>>2]|0)|0;o=c[w>>2]|0;c[w>>2]=0;if((o|0)==0){i=d;return}mc[c[x>>2]&255](o);i=d;return}function gj(a){a=a|0;i=i;return}function hj(e,f,g,h,j,k,l,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var 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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,nc=0,oc=0,qc=0,rc=0,sc=0,tc=0,uc=0;q=i;i=i+408|0;r=q;s=q+400|0;t=s;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+8|0;D=r;c[s>>2]=0;E=w;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;F=x;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;G=y;c[G+0>>2]=0;c[G+4>>2]=0;c[G+8>>2]=0;H=z;c[H+0>>2]=0;c[H+4>>2]=0;c[H+8>>2]=0;I=A;c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;lj(g,h,t,u,v,w,x,y,z,B);t=n;c[o>>2]=c[t>>2];h=e;e=f;f=s;s=m+8|0;m=z+1|0;g=z+4|0;J=z+8|0;K=y+1|0;L=y+4|0;M=y+8|0;N=(j&512|0)!=0;j=x+1|0;O=x+8|0;P=x+4|0;Q=A;R=Q+1|0;S=A+8|0;T=A+4|0;U=f+3|0;V=n+4|0;n=w+4|0;W=r+400|0;r=D;X=D;D=p;p=0;Y=0;Z=120;a:while(1){_=c[h>>2]|0;do{if((_|0)==0){$=0}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){$=_;break}if((pc[c[(c[_>>2]|0)+36>>2]&127](_)|0)==-1){c[h>>2]=0;$=0;break}else{$=c[h>>2]|0;break}}}while(0);_=($|0)==0;aa=c[e>>2]|0;do{if((aa|0)==0){ba=12}else{if((c[aa+12>>2]|0)!=(c[aa+16>>2]|0)){if(_){ca=aa;break}else{da=X;ea=r;fa=Y;ga=Z;ba=269;break a}}if((pc[c[(c[aa>>2]|0)+36>>2]&127](aa)|0)==-1){c[e>>2]=0;ba=12;break}else{if(_){ca=aa;break}else{da=X;ea=r;fa=Y;ga=Z;ba=269;break a}}}}while(0);if((ba|0)==12){ba=0;if(_){da=X;ea=r;fa=Y;ga=Z;ba=269;break}else{ca=0}}b:do{switch(a[f+p|0]|0){case 1:{if((p|0)==3){da=X;ea=r;fa=Y;ga=Z;ba=269;break a}aa=c[h>>2]|0;ha=c[aa+12>>2]|0;if((ha|0)==(c[aa+16>>2]|0)){ia=pc[c[(c[aa>>2]|0)+36>>2]&127](aa)|0}else{ia=d[ha]|0}if(!((ia&255)<<24>>24>-1)){ba=25;break a}if((b[(c[s>>2]|0)+(ia<<24>>24<<1)>>1]&8192)==0){ba=25;break a}ha=c[h>>2]|0;aa=ha+12|0;ja=c[aa>>2]|0;if((ja|0)==(c[ha+16>>2]|0)){ka=pc[c[(c[ha>>2]|0)+40>>2]&127](ha)|0}else{c[aa>>2]=ja+1;ka=d[ja]|0}Be(A,ka&255);ba=26;break};case 0:{ba=26;break};case 3:{ja=a[G]|0;aa=(ja&1)==0;if(aa){la=(ja&255)>>>1}else{la=c[L>>2]|0}ha=a[H]|0;ma=(ha&1)==0;if(ma){na=(ha&255)>>>1}else{na=c[g>>2]|0}if((la|0)==(0-na|0)){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break b}if(aa){ua=(ja&255)>>>1}else{ua=c[L>>2]|0}do{if((ua|0)!=0){if(ma){va=(ha&255)>>>1}else{va=c[g>>2]|0}if((va|0)==0){break}wa=c[h>>2]|0;xa=c[wa+12>>2]|0;ya=c[wa+16>>2]|0;if((xa|0)==(ya|0)){za=pc[c[(c[wa>>2]|0)+36>>2]&127](wa)|0;Aa=c[h>>2]|0;Ba=za;Ca=c[Aa+16>>2]|0;Da=c[Aa+12>>2]|0;Ea=Aa;Fa=a[G]|0}else{Ba=d[xa]|0;Ca=ya;Da=xa;Ea=wa;Fa=ja}wa=Ea+12|0;xa=(Da|0)==(Ca|0);if((Ba&255)<<24>>24==(a[(Fa&1)==0?K:c[M>>2]|0]|0)){if(xa){pc[c[(c[Ea>>2]|0)+40>>2]&127](Ea)|0}else{c[wa>>2]=Da+1}wa=a[G]|0;if((wa&1)==0){Ga=(wa&255)>>>1}else{Ga=c[L>>2]|0}oa=D;pa=X;qa=r;ra=W;sa=Ga>>>0>1?y:Y;ta=Z;break b}if(xa){Ha=pc[c[(c[Ea>>2]|0)+36>>2]&127](Ea)|0}else{Ha=d[Da]|0}if(!((Ha&255)<<24>>24==(a[(a[H]&1)==0?m:c[J>>2]|0]|0))){ba=112;break a}xa=c[h>>2]|0;wa=xa+12|0;ya=c[wa>>2]|0;if((ya|0)==(c[xa+16>>2]|0)){pc[c[(c[xa>>2]|0)+40>>2]&127](xa)|0}else{c[wa>>2]=ya+1}a[l]=1;ya=a[H]|0;if((ya&1)==0){Ia=(ya&255)>>>1}else{Ia=c[g>>2]|0}oa=D;pa=X;qa=r;ra=W;sa=Ia>>>0>1?z:Y;ta=Z;break b}}while(0);if(aa){Ja=(ja&255)>>>1}else{Ja=c[L>>2]|0}ma=c[h>>2]|0;ya=c[ma+12>>2]|0;wa=(ya|0)==(c[ma+16>>2]|0);if((Ja|0)==0){if(wa){xa=pc[c[(c[ma>>2]|0)+36>>2]&127](ma)|0;Ka=xa;La=a[H]|0}else{Ka=d[ya]|0;La=ha}if(!((Ka&255)<<24>>24==(a[(La&1)==0?m:c[J>>2]|0]|0))){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break b}xa=c[h>>2]|0;Aa=xa+12|0;za=c[Aa>>2]|0;if((za|0)==(c[xa+16>>2]|0)){pc[c[(c[xa>>2]|0)+40>>2]&127](xa)|0}else{c[Aa>>2]=za+1}a[l]=1;za=a[H]|0;if((za&1)==0){Ma=(za&255)>>>1}else{Ma=c[g>>2]|0}oa=D;pa=X;qa=r;ra=W;sa=Ma>>>0>1?z:Y;ta=Z;break b}if(wa){wa=pc[c[(c[ma>>2]|0)+36>>2]&127](ma)|0;Na=wa;Oa=a[G]|0}else{Na=d[ya]|0;Oa=ja}if(!((Na&255)<<24>>24==(a[(Oa&1)==0?K:c[M>>2]|0]|0))){a[l]=1;oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break b}ya=c[h>>2]|0;wa=ya+12|0;ma=c[wa>>2]|0;if((ma|0)==(c[ya+16>>2]|0)){pc[c[(c[ya>>2]|0)+40>>2]&127](ya)|0}else{c[wa>>2]=ma+1}ma=a[G]|0;if((ma&1)==0){Pa=(ma&255)>>>1}else{Pa=c[L>>2]|0}oa=D;pa=X;qa=r;ra=W;sa=Pa>>>0>1?y:Y;ta=Z;break};case 2:{if(!((Y|0)!=0|p>>>0<2)){if((p|0)==2){Qa=(a[U]|0)!=0}else{Qa=0}if(!(N|Qa)){oa=D;pa=X;qa=r;ra=W;sa=0;ta=Z;break b}}ma=a[F]|0;wa=(ma&1)==0;ya=wa?j:c[O>>2]|0;c:do{if((p|0)==0){Ra=ca;Sa=ca;Ta=ma;Ua=ya}else{if((d[f+(p+ -1)|0]|0)>=2){Ra=ca;Sa=ca;Ta=ma;Ua=ya;break}za=ya+(wa?(ma&255)>>>1:c[P>>2]|0)|0;Aa=ya;while(1){if((Aa|0)==(za|0)){Va=za;break}xa=a[Aa]|0;if(!(xa<<24>>24>-1)){Va=Aa;break}if((b[(c[s>>2]|0)+(xa<<24>>24<<1)>>1]&8192)==0){Va=Aa;break}else{Aa=Aa+1|0}}Aa=Va-ya|0;za=a[I]|0;xa=(za&1)==0;if(xa){Wa=(za&255)>>>1}else{Wa=c[T>>2]|0}if(Aa>>>0>Wa>>>0){Ra=ca;Sa=ca;Ta=ma;Ua=ya;break}if(xa){xa=(za&255)>>>1;Xa=Q+(xa-Aa)+1|0;Ya=R;Za=xa}else{xa=c[S>>2]|0;za=c[T>>2]|0;Xa=xa+(za-Aa)|0;Ya=xa;Za=za}za=Ya+Za|0;if((Xa|0)==(za|0)){Ra=ca;Sa=ca;Ta=ma;Ua=Va;break}else{_a=ya;$a=Xa}while(1){if((a[$a]|0)!=(a[_a]|0)){Ra=ca;Sa=ca;Ta=ma;Ua=ya;break c}xa=$a+1|0;if((xa|0)==(za|0)){Ra=ca;Sa=ca;Ta=ma;Ua=Va;break}else{_a=_a+1|0;$a=xa}}}}while(0);d:while(1){if((Ta&1)==0){ab=j;bb=(Ta&255)>>>1}else{ab=c[O>>2]|0;bb=c[P>>2]|0}if((Ua|0)==(ab+bb|0)){break}ma=c[h>>2]|0;do{if((ma|0)==0){cb=0}else{if((c[ma+12>>2]|0)!=(c[ma+16>>2]|0)){cb=ma;break}if((pc[c[(c[ma>>2]|0)+36>>2]&127](ma)|0)==-1){c[h>>2]=0;cb=0;break}else{cb=c[h>>2]|0;break}}}while(0);ma=(cb|0)==0;do{if((Sa|0)==0){db=Ra;ba=147}else{if((c[Sa+12>>2]|0)!=(c[Sa+16>>2]|0)){if(ma){eb=Ra;fb=Sa;break}else{break d}}if((pc[c[(c[Sa>>2]|0)+36>>2]&127](Sa)|0)==-1){c[e>>2]=0;db=0;ba=147;break}else{if(ma^(Ra|0)==0){eb=Ra;fb=Ra;break}else{break d}}}}while(0);if((ba|0)==147){ba=0;if(ma){break}else{eb=db;fb=0}}ya=c[h>>2]|0;wa=c[ya+12>>2]|0;if((wa|0)==(c[ya+16>>2]|0)){gb=pc[c[(c[ya>>2]|0)+36>>2]&127](ya)|0}else{gb=d[wa]|0}if(!((gb&255)<<24>>24==(a[Ua]|0))){break}wa=c[h>>2]|0;ya=wa+12|0;ja=c[ya>>2]|0;if((ja|0)==(c[wa+16>>2]|0)){pc[c[(c[wa>>2]|0)+40>>2]&127](wa)|0}else{c[ya>>2]=ja+1}Ra=eb;Sa=fb;Ta=a[F]|0;Ua=Ua+1|0}if(!N){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break b}ja=a[F]|0;if((ja&1)==0){hb=j;ib=(ja&255)>>>1}else{hb=c[O>>2]|0;ib=c[P>>2]|0}if((Ua|0)==(hb+ib|0)){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z}else{ba=162;break a}break};case 4:{ja=D;ya=X;wa=r;ha=W;aa=0;za=Z;e:while(1){xa=c[h>>2]|0;do{if((xa|0)==0){jb=0}else{if((c[xa+12>>2]|0)!=(c[xa+16>>2]|0)){jb=xa;break}if((pc[c[(c[xa>>2]|0)+36>>2]&127](xa)|0)==-1){c[h>>2]=0;jb=0;break}else{jb=c[h>>2]|0;break}}}while(0);xa=(jb|0)==0;ma=c[e>>2]|0;do{if((ma|0)==0){ba=173}else{if((c[ma+12>>2]|0)!=(c[ma+16>>2]|0)){if(xa){break}else{break e}}if((pc[c[(c[ma>>2]|0)+36>>2]&127](ma)|0)==-1){c[e>>2]=0;ba=173;break}else{if(xa){break}else{break e}}}}while(0);if((ba|0)==173){ba=0;if(xa){break}}ma=c[h>>2]|0;Aa=c[ma+12>>2]|0;if((Aa|0)==(c[ma+16>>2]|0)){kb=pc[c[(c[ma>>2]|0)+36>>2]&127](ma)|0}else{kb=d[Aa]|0}Aa=kb&255;do{if(Aa<<24>>24>-1){if((b[(c[s>>2]|0)+(kb<<24>>24<<1)>>1]&2048)==0){ba=189;break}ma=c[o>>2]|0;if((ma|0)==(ja|0)){lb=(c[V>>2]|0)!=120;mb=c[t>>2]|0;nb=ja-mb|0;ob=nb>>>0<2147483647?nb<<1:-1;pb=Mm(lb?mb:0,ob)|0;if((pb|0)==0){ba=182;break a}do{if(lb){c[t>>2]=pb;qb=pb}else{mb=c[t>>2]|0;c[t>>2]=pb;if((mb|0)==0){qb=pb;break}mc[c[V>>2]&255](mb);qb=c[t>>2]|0}}while(0);c[V>>2]=121;pb=qb+nb|0;c[o>>2]=pb;rb=pb;sb=(c[t>>2]|0)+ob|0}else{rb=ma;sb=ja}c[o>>2]=rb+1;a[rb]=Aa;tb=sb;ub=ya;vb=wa;wb=ha;xb=aa+1|0;yb=za}else{ba=189}}while(0);if((ba|0)==189){ba=0;xa=a[E]|0;if((xa&1)==0){zb=(xa&255)>>>1}else{zb=c[n>>2]|0}if((zb|0)==0|(aa|0)==0){break}if(!(Aa<<24>>24==(a[v]|0))){break}if((wa|0)==(ha|0)){xa=wa-ya|0;pb=xa>>>0<2147483647?xa<<1:-1;if((za|0)==120){Ab=0}else{Ab=ya}lb=Mm(Ab,pb)|0;mb=lb;if((lb|0)==0){ba=198;break a}Bb=mb;Cb=mb+(xa>>2<<2)|0;Db=mb+(pb>>>2<<2)|0;Eb=121}else{Bb=ya;Cb=wa;Db=ha;Eb=za}c[Cb>>2]=aa;tb=ja;ub=Bb;vb=Cb+4|0;wb=Db;xb=0;yb=Eb}pb=c[h>>2]|0;mb=pb+12|0;xa=c[mb>>2]|0;if((xa|0)==(c[pb+16>>2]|0)){pc[c[(c[pb>>2]|0)+40>>2]&127](pb)|0;ja=tb;ya=ub;wa=vb;ha=wb;aa=xb;za=yb;continue}else{c[mb>>2]=xa+1;ja=tb;ya=ub;wa=vb;ha=wb;aa=xb;za=yb;continue}}if((ya|0)==(wa|0)|(aa|0)==0){Fb=ya;Gb=wa;Hb=ha;Ib=za}else{if((wa|0)==(ha|0)){xa=wa-ya|0;mb=xa>>>0<2147483647?xa<<1:-1;if((za|0)==120){Jb=0}else{Jb=ya}pb=Mm(Jb,mb)|0;lb=pb;if((pb|0)==0){ba=209;break a}Kb=lb;Lb=lb+(xa>>2<<2)|0;Mb=lb+(mb>>>2<<2)|0;Nb=121}else{Kb=ya;Lb=wa;Mb=ha;Nb=za}c[Lb>>2]=aa;Fb=Kb;Gb=Lb+4|0;Hb=Mb;Ib=Nb}mb=c[B>>2]|0;if((mb|0)>0){lb=c[h>>2]|0;do{if((lb|0)==0){Ob=0}else{if((c[lb+12>>2]|0)!=(c[lb+16>>2]|0)){Ob=lb;break}if((pc[c[(c[lb>>2]|0)+36>>2]&127](lb)|0)==-1){c[h>>2]=0;Ob=0;break}else{Ob=c[h>>2]|0;break}}}while(0);lb=(Ob|0)==0;aa=c[e>>2]|0;do{if((aa|0)==0){ba=223}else{if((c[aa+12>>2]|0)!=(c[aa+16>>2]|0)){if(lb){Pb=aa;break}else{ba=229;break a}}if((pc[c[(c[aa>>2]|0)+36>>2]&127](aa)|0)==-1){c[e>>2]=0;ba=223;break}else{if(lb){Pb=aa;break}else{ba=229;break a}}}}while(0);if((ba|0)==223){ba=0;if(lb){ba=229;break a}else{Pb=0}}aa=c[h>>2]|0;za=c[aa+12>>2]|0;if((za|0)==(c[aa+16>>2]|0)){Qb=pc[c[(c[aa>>2]|0)+36>>2]&127](aa)|0}else{Qb=d[za]|0}if(!((Qb&255)<<24>>24==(a[u]|0))){ba=229;break a}za=c[h>>2]|0;aa=za+12|0;ha=c[aa>>2]|0;if((ha|0)==(c[za+16>>2]|0)){pc[c[(c[za>>2]|0)+40>>2]&127](za)|0;Rb=Pb;Sb=mb;Tb=Pb;Ub=ja}else{c[aa>>2]=ha+1;Rb=Pb;Sb=mb;Tb=Pb;Ub=ja}while(1){ha=c[h>>2]|0;do{if((ha|0)==0){Vb=0}else{if((c[ha+12>>2]|0)!=(c[ha+16>>2]|0)){Vb=ha;break}if((pc[c[(c[ha>>2]|0)+36>>2]&127](ha)|0)==-1){c[h>>2]=0;Vb=0;break}else{Vb=c[h>>2]|0;break}}}while(0);ha=(Vb|0)==0;do{if((Tb|0)==0){Wb=Rb;ba=243}else{if((c[Tb+12>>2]|0)!=(c[Tb+16>>2]|0)){if(ha){Xb=Rb;Yb=Tb;break}else{ba=250;break a}}if((pc[c[(c[Tb>>2]|0)+36>>2]&127](Tb)|0)==-1){c[e>>2]=0;Wb=0;ba=243;break}else{if(ha^(Rb|0)==0){Xb=Rb;Yb=Rb;break}else{ba=250;break a}}}}while(0);if((ba|0)==243){ba=0;if(ha){ba=250;break a}else{Xb=Wb;Yb=0}}Aa=c[h>>2]|0;aa=c[Aa+12>>2]|0;if((aa|0)==(c[Aa+16>>2]|0)){Zb=pc[c[(c[Aa>>2]|0)+36>>2]&127](Aa)|0}else{Zb=d[aa]|0}if(!((Zb&255)<<24>>24>-1)){ba=250;break a}if((b[(c[s>>2]|0)+(Zb<<24>>24<<1)>>1]&2048)==0){ba=250;break a}aa=c[o>>2]|0;if((aa|0)==(Ub|0)){Aa=(c[V>>2]|0)!=120;za=c[t>>2]|0;wa=Ub-za|0;ya=wa>>>0<2147483647?wa<<1:-1;xa=Mm(Aa?za:0,ya)|0;if((xa|0)==0){ba=253;break a}do{if(Aa){c[t>>2]=xa;_b=xa}else{za=c[t>>2]|0;c[t>>2]=xa;if((za|0)==0){_b=xa;break}mc[c[V>>2]&255](za);_b=c[t>>2]|0}}while(0);c[V>>2]=121;xa=_b+wa|0;c[o>>2]=xa;$b=xa;ac=(c[t>>2]|0)+ya|0}else{$b=aa;ac=Ub}xa=c[h>>2]|0;Aa=c[xa+12>>2]|0;if((Aa|0)==(c[xa+16>>2]|0)){ha=pc[c[(c[xa>>2]|0)+36>>2]&127](xa)|0;bc=ha;cc=c[o>>2]|0}else{bc=d[Aa]|0;cc=$b}c[o>>2]=cc+1;a[cc]=bc;Aa=Sb+ -1|0;c[B>>2]=Aa;ha=c[h>>2]|0;xa=ha+12|0;za=c[xa>>2]|0;if((za|0)==(c[ha+16>>2]|0)){pc[c[(c[ha>>2]|0)+40>>2]&127](ha)|0}else{c[xa>>2]=za+1}if((Aa|0)>0){Rb=Xb;Sb=Aa;Tb=Yb;Ub=ac}else{dc=ac;break}}}else{dc=ja}if((c[o>>2]|0)==(c[t>>2]|0)){ba=267;break a}else{oa=dc;pa=Fb;qa=Gb;ra=Hb;sa=Y;ta=Ib}break};default:{oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z}}}while(0);f:do{if((ba|0)==26){ba=0;if((p|0)==3){da=X;ea=r;fa=Y;ga=Z;ba=269;break a}else{ec=ca;fc=ca}while(1){_=c[h>>2]|0;do{if((_|0)==0){gc=0}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){gc=_;break}if((pc[c[(c[_>>2]|0)+36>>2]&127](_)|0)==-1){c[h>>2]=0;gc=0;break}else{gc=c[h>>2]|0;break}}}while(0);_=(gc|0)==0;do{if((fc|0)==0){hc=ec;ba=37}else{if((c[fc+12>>2]|0)!=(c[fc+16>>2]|0)){if(_){ic=ec;jc=fc;break}else{oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break f}}if((pc[c[(c[fc>>2]|0)+36>>2]&127](fc)|0)==-1){c[e>>2]=0;hc=0;ba=37;break}else{if(_^(ec|0)==0){ic=ec;jc=ec;break}else{oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break f}}}}while(0);if((ba|0)==37){ba=0;if(_){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break f}else{ic=hc;jc=0}}aa=c[h>>2]|0;ya=c[aa+12>>2]|0;if((ya|0)==(c[aa+16>>2]|0)){kc=pc[c[(c[aa>>2]|0)+36>>2]&127](aa)|0}else{kc=d[ya]|0}if(!((kc&255)<<24>>24>-1)){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break f}if((b[(c[s>>2]|0)+(kc<<24>>24<<1)>>1]&8192)==0){oa=D;pa=X;qa=r;ra=W;sa=Y;ta=Z;break f}ya=c[h>>2]|0;aa=ya+12|0;wa=c[aa>>2]|0;if((wa|0)==(c[ya+16>>2]|0)){lc=pc[c[(c[ya>>2]|0)+40>>2]&127](ya)|0}else{c[aa>>2]=wa+1;lc=d[wa]|0}Be(A,lc&255);ec=ic;fc=jc}}}while(0);ja=p+1|0;if(ja>>>0<4){W=ra;r=qa;X=pa;D=oa;p=ja;Y=sa;Z=ta}else{da=pa;ea=qa;fa=sa;ga=ta;ba=269;break}}g:do{if((ba|0)==25){c[k>>2]=c[k>>2]|4;nc=0;oc=X;qc=Z}else if((ba|0)==112){c[k>>2]=c[k>>2]|4;nc=0;oc=X;qc=Z}else if((ba|0)==162){c[k>>2]=c[k>>2]|4;nc=0;oc=X;qc=Z}else if((ba|0)==182){Wm()}else if((ba|0)==198){Wm()}else if((ba|0)==209){Wm()}else if((ba|0)==229){c[k>>2]=c[k>>2]|4;nc=0;oc=Fb;qc=Ib}else if((ba|0)==250){c[k>>2]=c[k>>2]|4;nc=0;oc=Fb;qc=Ib}else if((ba|0)==253){Wm()}else if((ba|0)==267){c[k>>2]=c[k>>2]|4;nc=0;oc=Fb;qc=Ib}else if((ba|0)==269){h:do{if((fa|0)!=0){ta=fa;sa=fa+1|0;qa=fa+8|0;pa=fa+4|0;Y=1;i:while(1){p=a[ta]|0;if((p&1)==0){rc=(p&255)>>>1}else{rc=c[pa>>2]|0}if(!(Y>>>0<rc>>>0)){break h}p=c[h>>2]|0;do{if((p|0)==0){sc=0}else{if((c[p+12>>2]|0)!=(c[p+16>>2]|0)){sc=p;break}if((pc[c[(c[p>>2]|0)+36>>2]&127](p)|0)==-1){c[h>>2]=0;sc=0;break}else{sc=c[h>>2]|0;break}}}while(0);p=(sc|0)==0;_=c[e>>2]|0;do{if((_|0)==0){ba=285}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){if(p){break}else{break i}}if((pc[c[(c[_>>2]|0)+36>>2]&127](_)|0)==-1){c[e>>2]=0;ba=285;break}else{if(p){break}else{break i}}}}while(0);if((ba|0)==285){ba=0;if(p){break}}_=c[h>>2]|0;oa=c[_+12>>2]|0;if((oa|0)==(c[_+16>>2]|0)){tc=pc[c[(c[_>>2]|0)+36>>2]&127](_)|0}else{tc=d[oa]|0}if((a[ta]&1)==0){uc=sa}else{uc=c[qa>>2]|0}if(!((tc&255)<<24>>24==(a[uc+Y|0]|0))){break}oa=Y+1|0;_=c[h>>2]|0;D=_+12|0;r=c[D>>2]|0;if((r|0)==(c[_+16>>2]|0)){pc[c[(c[_>>2]|0)+40>>2]&127](_)|0;Y=oa;continue}else{c[D>>2]=r+1;Y=oa;continue}}c[k>>2]=c[k>>2]|4;nc=0;oc=da;qc=ga;break g}}while(0);if((da|0)==(ea|0)){nc=1;oc=ea;qc=ga;break}c[C>>2]=0;mj(w,da,ea,C);if((c[C>>2]|0)==0){nc=1;oc=da;qc=ga;break}c[k>>2]=c[k>>2]|4;nc=0;oc=da;qc=ga}}while(0);ve(A);ve(z);ve(y);ve(x);ve(w);if((oc|0)==0){i=q;return nc|0}mc[qc&255](oc);i=q;return nc|0}function ij(a){a=a|0;var b=0;b=vb(8)|0;ce(b,a);cc(b|0,2136,21)}function jj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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=i;i=i+168|0;l=d;m=d+8|0;n=d+24|0;o=d+128|0;p=d+136|0;q=d+144|0;r=d+152|0;s=d+160|0;t=o;c[t>>2]=n;u=o+4|0;c[u>>2]=120;v=n+100|0;Qe(q,h);n=q;w=c[n>>2]|0;if(!((c[1282]|0)==-1)){c[m>>2]=5128;c[m+4>>2]=118;c[m+8>>2]=0;qe(5128,m,119)}m=(c[5132>>2]|0)+ -1|0;x=c[w+8>>2]|0;if(!((c[w+12>>2]|0)-x>>2>>>0>m>>>0)){y=vb(4)|0;z=y;pm(z);cc(y|0,13088,107)}w=c[x+(m<<2)>>2]|0;if((w|0)==0){y=vb(4)|0;z=y;pm(z);cc(y|0,13088,107)}y=w;a[r]=0;z=f;f=c[z>>2]|0;c[s>>2]=f;m=c[h+4>>2]|0;h=l;x=s;c[h+0>>2]=c[x+0>>2];x=hj(e,l,g,q,m,j,r,y,o,p,v)|0;if(x){x=k;if((a[x]&1)==0){a[k+1|0]=0;a[x]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}x=w;if((a[r]|0)!=0){Be(k,yc[c[(c[x>>2]|0)+28>>2]&31](y,45)|0)}r=yc[c[(c[x>>2]|0)+28>>2]&31](y,48)|0;y=c[t>>2]|0;x=c[p>>2]|0;p=x+ -1|0;a:do{if(y>>>0<p>>>0){w=y;while(1){v=w+1|0;if(!((a[w]|0)==r<<24>>24)){A=w;break a}if(v>>>0<p>>>0){w=v}else{A=v;break}}}else{A=y}}while(0);kj(k,A,x)|0}x=e;e=c[x>>2]|0;do{if((e|0)==0){B=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){B=e;break}if(!((pc[c[(c[e>>2]|0)+36>>2]&127](e)|0)==-1)){B=e;break}c[x>>2]=0;B=0}}while(0);x=(B|0)==0;do{if((f|0)==0){C=25}else{if((c[f+12>>2]|0)!=(c[f+16>>2]|0)){if(x){break}else{C=27;break}}if((pc[c[(c[f>>2]|0)+36>>2]&127](f)|0)==-1){c[z>>2]=0;C=25;break}else{if(x^(f|0)==0){break}else{C=27;break}}}}while(0);if((C|0)==25){if(x){C=27}}if((C|0)==27){c[j>>2]=c[j>>2]|2}c[b>>2]=B;Yd(c[n>>2]|0)|0;n=c[t>>2]|0;c[t>>2]=0;if((n|0)==0){i=d;return}mc[c[u>>2]&255](n);i=d;return}function kj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b;h=d;j=a[g]|0;if((j&1)==0){k=(j&255)>>>1;l=j;m=10}else{j=c[b>>2]|0;k=c[b+4>>2]|0;l=j&255;m=(j&-2)+ -1|0}j=e-h|0;if((e|0)==(d|0)){i=f;return b|0}if((m-k|0)>>>0<j>>>0){Ee(b,m,k+j-m|0,k,k,0,0);n=a[g]|0}else{n=l}if((n&1)==0){o=b+1|0}else{o=c[b+8>>2]|0}n=e+(k-h)|0;h=d;d=o+k|0;while(1){a[d]=a[h]|0;l=h+1|0;if((l|0)==(e|0)){break}else{d=d+1|0;h=l}}a[o+n|0]=0;n=k+j|0;if((a[g]&1)==0){a[g]=n<<1;i=f;return b|0}else{c[b+4>>2]=n;i=f;return b|0}return 0}function lj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;i=i+176|0;o=n;p=n+16|0;q=n+32|0;r=n+40|0;s=n+56|0;t=n+72|0;u=n+88|0;v=n+104|0;w=n+112|0;x=n+128|0;y=n+144|0;z=n+160|0;if(b){b=c[d>>2]|0;if(!((c[1142]|0)==-1)){c[p>>2]=4568;c[p+4>>2]=118;c[p+8>>2]=0;qe(4568,p,119)}p=(c[4572>>2]|0)+ -1|0;A=c[b+8>>2]|0;if(!((c[b+12>>2]|0)-A>>2>>>0>p>>>0)){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}b=c[A+(p<<2)>>2]|0;if((b|0)==0){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}B=b;nc[c[(c[b>>2]|0)+44>>2]&63](q,B);C=e;p=c[q>>2]|0;a[C]=p;a[C+1|0]=p>>8;a[C+2|0]=p>>16;a[C+3|0]=p>>24;p=b;nc[c[(c[p>>2]|0)+32>>2]&63](r,B);C=l;if((a[C]&1)==0){a[l+1|0]=0;a[C]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}Ae(l,0);q=r;c[C+0>>2]=c[q+0>>2];c[C+4>>2]=c[q+4>>2];c[C+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(r);nc[c[(c[p>>2]|0)+28>>2]&63](s,B);r=k;if((a[r]&1)==0){a[k+1|0]=0;a[r]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}Ae(k,0);q=s;c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(s);s=b;a[f]=pc[c[(c[s>>2]|0)+12>>2]&127](B)|0;a[g]=pc[c[(c[s>>2]|0)+16>>2]&127](B)|0;nc[c[(c[p>>2]|0)+20>>2]&63](t,B);s=h;if((a[s]&1)==0){a[h+1|0]=0;a[s]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}Ae(h,0);q=t;c[s+0>>2]=c[q+0>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(t);nc[c[(c[p>>2]|0)+24>>2]&63](u,B);p=j;if((a[p]&1)==0){a[j+1|0]=0;a[p]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}Ae(j,0);t=u;c[p+0>>2]=c[t+0>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;ve(u);D=pc[c[(c[b>>2]|0)+36>>2]&127](B)|0;c[m>>2]=D;i=n;return}else{B=c[d>>2]|0;if(!((c[1126]|0)==-1)){c[o>>2]=4504;c[o+4>>2]=118;c[o+8>>2]=0;qe(4504,o,119)}o=(c[4508>>2]|0)+ -1|0;d=c[B+8>>2]|0;if(!((c[B+12>>2]|0)-d>>2>>>0>o>>>0)){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}B=c[d+(o<<2)>>2]|0;if((B|0)==0){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}E=B;nc[c[(c[B>>2]|0)+44>>2]&63](v,E);F=e;e=c[v>>2]|0;a[F]=e;a[F+1|0]=e>>8;a[F+2|0]=e>>16;a[F+3|0]=e>>24;e=B;nc[c[(c[e>>2]|0)+32>>2]&63](w,E);F=l;if((a[F]&1)==0){a[l+1|0]=0;a[F]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}Ae(l,0);l=w;c[F+0>>2]=c[l+0>>2];c[F+4>>2]=c[l+4>>2];c[F+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;ve(w);nc[c[(c[e>>2]|0)+28>>2]&63](x,E);w=k;if((a[w]&1)==0){a[k+1|0]=0;a[w]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}Ae(k,0);k=x;c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;ve(x);x=B;a[f]=pc[c[(c[x>>2]|0)+12>>2]&127](E)|0;a[g]=pc[c[(c[x>>2]|0)+16>>2]&127](E)|0;nc[c[(c[e>>2]|0)+20>>2]&63](y,E);x=h;if((a[x]&1)==0){a[h+1|0]=0;a[x]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}Ae(h,0);h=y;c[x+0>>2]=c[h+0>>2];c[x+4>>2]=c[h+4>>2];c[x+8>>2]=c[h+8>>2];c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ve(y);nc[c[(c[e>>2]|0)+24>>2]&63](z,E);e=j;if((a[e]&1)==0){a[j+1|0]=0;a[e]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}Ae(j,0);j=z;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ve(z);D=pc[c[(c[B>>2]|0)+36>>2]&127](E)|0;c[m>>2]=D;i=n;return}}function mj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;g=i;h=b;j=a[h]|0;if((j&1)==0){k=(j&255)>>>1}else{k=c[b+4>>2]|0}if((k|0)==0){i=g;return}do{if((d|0)==(e|0)){l=j}else{k=e+ -4|0;if(k>>>0>d>>>0){m=d;n=k}else{l=j;break}do{k=c[m>>2]|0;c[m>>2]=c[n>>2];c[n>>2]=k;m=m+4|0;n=n+ -4|0;}while(m>>>0<n>>>0);l=a[h]|0}}while(0);if((l&1)==0){o=b+1|0;p=(l&255)>>>1}else{o=c[b+8>>2]|0;p=c[b+4>>2]|0}b=e+ -4|0;e=a[o]|0;l=e<<24>>24<1|e<<24>>24==127;a:do{if(b>>>0>d>>>0){h=o+p|0;n=e;m=o;j=d;k=l;while(1){if(!k){if((n<<24>>24|0)!=(c[j>>2]|0)){break}}q=(h-m|0)>1?m+1|0:m;r=j+4|0;s=a[q]|0;t=s<<24>>24<1|s<<24>>24==127;if(r>>>0<b>>>0){n=s;m=q;j=r;k=t}else{u=s;v=t;break a}}c[f>>2]=4;i=g;return}else{u=e;v=l}}while(0);if(v){i=g;return}v=c[b>>2]|0;if(!(u<<24>>24>>>0<v>>>0|(v|0)==0)){i=g;return}c[f>>2]=4;i=g;return}function nj(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function oj(a){a=a|0;i=i;return}function pj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+400|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=i;i=i+8|0;u=i;i=i+40|0;v=i;i=i+104|0;w=p;c[w>>2]=o;x=p+4|0;c[x>>2]=120;y=o+400|0;Qe(r,h);o=r;z=c[o>>2]|0;if(!((c[1280]|0)==-1)){c[n>>2]=5120;c[n+4>>2]=118;c[n+8>>2]=0;qe(5120,n,119)}n=(c[5124>>2]|0)+ -1|0;A=c[z+8>>2]|0;if(!((c[z+12>>2]|0)-A>>2>>>0>n>>>0)){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}z=c[A+(n<<2)>>2]|0;if((z|0)==0){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}B=z;a[s]=0;C=f;c[t>>2]=c[C>>2];f=c[h+4>>2]|0;h=l;n=t;c[h+0>>2]=c[n+0>>2];n=qj(e,l,g,r,f,j,s,B,p,q,y)|0;do{if(n){y=u;vc[c[(c[z>>2]|0)+48>>2]&7](B,4824,4834|0,y)|0;p=v;f=c[q>>2]|0;r=c[w>>2]|0;g=f-r|0;do{if((g|0)>392){l=Km((g>>2)+2|0)|0;if((l|0)!=0){D=l;E=l;break}Wm()}else{D=0;E=p}}while(0);if((a[s]|0)==0){F=E}else{a[E]=45;F=E+1|0}if(r>>>0<f>>>0){g=u+40|0;l=u;h=F;t=r;while(1){A=c[t>>2]|0;G=y;while(1){H=G+4|0;if((c[G>>2]|0)==(A|0)){I=G;break}if((H|0)==(g|0)){I=g;break}else{G=H}}a[h]=a[4824+(I-l>>2)|0]|0;G=t+4|0;A=h+1|0;if(G>>>0<(c[q>>2]|0)>>>0){h=A;t=G}else{J=A;break}}}else{J=F}a[J]=0;c[m>>2]=k;if((Tb(p|0,4760,m|0)|0)!=1){t=vb(8)|0;ce(t,4768);cc(t|0,2136,21)}if((D|0)==0){break}Lm(D)}}while(0);D=e;e=c[D>>2]|0;do{if((e|0)==0){K=1}else{m=c[e+12>>2]|0;if((m|0)==(c[e+16>>2]|0)){L=pc[c[(c[e>>2]|0)+36>>2]&127](e)|0}else{L=c[m>>2]|0}if((L|0)==-1){c[D>>2]=0;K=1;break}else{K=(c[D>>2]|0)==0;break}}}while(0);L=c[C>>2]|0;do{if((L|0)==0){M=35}else{e=c[L+12>>2]|0;if((e|0)==(c[L+16>>2]|0)){N=pc[c[(c[L>>2]|0)+36>>2]&127](L)|0}else{N=c[e>>2]|0}if((N|0)==-1){c[C>>2]=0;M=35;break}else{if(K){break}else{M=37;break}}}}while(0);if((M|0)==35){if(K){M=37}}if((M|0)==37){c[j>>2]=c[j>>2]|2}c[b>>2]=c[D>>2];Yd(c[o>>2]|0)|0;o=c[w>>2]|0;c[w>>2]=0;if((o|0)==0){i=d;return}mc[c[x>>2]&255](o);i=d;return}\n\n\n\nfunction Bc(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function Cc(){return i|0}function Dc(a){a=a|0;i=a}function Ec(a,b){a=a|0;b=b|0;if((u|0)==0){u=a;v=b}}function Fc(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function Gc(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function Hc(a){a=a|0;J=a}function Ic(a){a=a|0;K=a}function Jc(a){a=a|0;L=a}function Kc(a){a=a|0;M=a}function Lc(a){a=a|0;N=a}function Mc(a){a=a|0;O=a}function Nc(a){a=a|0;P=a}function Oc(a){a=a|0;Q=a}function Pc(a){a=a|0;R=a}function Qc(a){a=a|0;S=a}function Rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=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,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;e=i;i=i+96|0;f=e;g=e+16|0;h=e+32|0;j=e+48|0;k=e+64|0;l=e+80|0;m=b;Sc(m,d+1|0);n=b+4|0;o=b;p=c[o>>2]|0;q=((c[n>>2]|0)-p|0)/12|0;if(q>>>0>d>>>0){r=p;s=a;t=r+(d*12|0)|0;od(s,t);i=e;return}p=b+8|0;u=j;v=l;w=k;x=k+4|0;y=l+4|0;z=j+4|0;A=f;B=f+4|0;C=f+8|0;D=g;E=g+4|0;F=g+8|0;G=h;H=h+4|0;I=h+8|0;J=q;a:do{do{if((J|0)==0){c[A>>2]=0;c[B>>2]=0;c[C>>2]=0;q=Pm(4)|0;K=q;L=q+4|0;if((q|0)!=0){c[K>>2]=0}c[A>>2]=K;c[B>>2]=L;c[C>>2]=L;M=c[n>>2]|0;if((M|0)==(c[p>>2]|0)){nd(m,f);N=c[A>>2]|0}else{if((M|0)==0){O=0}else{P=M;c[P>>2]=0;Q=M+4|0;c[Q>>2]=0;R=M+8|0;c[R>>2]=0;M=Pm(4)|0;S=M;c[Q>>2]=S;c[P>>2]=S;c[R>>2]=M+4;M=q+(0-q)|0;q=K;R=S;while(1){if((R|0)!=0){c[R>>2]=c[q>>2]}P=q+4|0;if((P|0)==(L|0)){break}else{q=P;R=R+4|0}}c[Q>>2]=S+((M>>>2)+1<<2);O=c[n>>2]|0}c[n>>2]=O+12;N=K}if((N|0)==0){break}R=c[B>>2]|0;if((R|0)!=(N|0)){c[B>>2]=R+(~((R+ -4+(0-N)|0)>>>2)<<2)}Rm(N)}else if((J|0)==1){R=c[o>>2]|0;do{if((R|0)==(c[n>>2]|0)){c[D>>2]=0;c[E>>2]=0;c[F>>2]=0;q=Pm(4)|0;L=q;P=q+4|0;if((q|0)!=0){c[L>>2]=0}c[D>>2]=L;c[E>>2]=P;c[F>>2]=P;if((R|0)==(c[p>>2]|0)){nd(m,g);T=c[D>>2]|0}else{if((R|0)==0){U=0}else{V=R;c[V>>2]=0;W=R+4|0;c[W>>2]=0;X=R+8|0;c[X>>2]=0;Y=Pm(4)|0;Z=Y;c[W>>2]=Z;c[V>>2]=Z;c[X>>2]=Y+4;Y=q+(0-q)|0;q=L;X=Z;while(1){if((X|0)!=0){c[X>>2]=c[q>>2]}V=q+4|0;if((V|0)==(P|0)){break}else{q=V;X=X+4|0}}c[W>>2]=Z+((Y>>>2)+1<<2);U=c[n>>2]|0}c[n>>2]=U+12;T=L}if((T|0)==0){break}X=c[E>>2]|0;if((X|0)!=(T|0)){c[E>>2]=X+(~((X+ -4+(0-T)|0)>>>2)<<2)}Rm(T)}}while(0);c[G>>2]=0;c[H>>2]=0;c[I>>2]=0;R=Pm(4)|0;K=R;M=R+4|0;if((R|0)!=0){c[K>>2]=1}c[G>>2]=K;c[H>>2]=M;c[I>>2]=M;S=c[n>>2]|0;if((S|0)==(c[p>>2]|0)){nd(m,h);_=c[G>>2]|0}else{if((S|0)==0){$=0}else{Q=S;c[Q>>2]=0;X=S+4|0;c[X>>2]=0;q=S+8|0;c[q>>2]=0;S=Pm(4)|0;P=S;c[X>>2]=P;c[Q>>2]=P;c[q>>2]=S+4;S=R+(0-R)|0;R=K;q=P;while(1){if((q|0)!=0){c[q>>2]=c[R>>2]}Q=R+4|0;if((Q|0)==(M|0)){break}else{R=Q;q=q+4|0}}c[X>>2]=P+((S>>>2)+1<<2);$=c[n>>2]|0}c[n>>2]=$+12;_=K}if((_|0)==0){break}q=c[H>>2]|0;if((q|0)!=(_|0)){c[H>>2]=q+(~((q+ -4+(0-_)|0)>>>2)<<2)}Rm(_)}else{Rc(k,b,J+ -2|0);Rc(l,b,J+ -1|0);pd(j,k,l);q=c[n>>2]|0;if((q|0)==(c[p>>2]|0)){nd(m,j)}else{if((q|0)==0){aa=0}else{R=q;c[R>>2]=0;M=q+4|0;c[M>>2]=0;Q=q+8|0;c[Q>>2]=0;q=(c[z>>2]|0)-(c[u>>2]|0)|0;V=q>>2;do{if((V|0)!=0){if(V>>>0>1073741823){ba=54;break a}ca=Pm(q)|0;c[M>>2]=ca;c[R>>2]=ca;c[Q>>2]=ca+(V<<2);da=c[u>>2]|0;ea=c[z>>2]|0;if((da|0)==(ea|0)){break}fa=ea+ -4+(0-da)|0;ga=da;da=ca;while(1){if((da|0)!=0){c[da>>2]=c[ga>>2]}ha=ga+4|0;if((ha|0)==(ea|0)){break}else{ga=ha;da=da+4|0}}c[M>>2]=ca+((fa>>>2)+1<<2)}}while(0);aa=c[n>>2]|0}c[n>>2]=aa+12}M=c[u>>2]|0;if((M|0)!=0){V=c[z>>2]|0;if((V|0)!=(M|0)){c[z>>2]=V+(~((V+ -4+(0-M)|0)>>>2)<<2)}Rm(M)}M=c[v>>2]|0;if((M|0)!=0){V=c[y>>2]|0;if((V|0)!=(M|0)){c[y>>2]=V+(~((V+ -4+(0-M)|0)>>>2)<<2)}Rm(M)}M=c[w>>2]|0;if((M|0)==0){break}V=c[x>>2]|0;if((V|0)!=(M|0)){c[x>>2]=V+(~((V+ -4+(0-M)|0)>>>2)<<2)}Rm(M)}}while(0);J=J+1|0;}while(!(J>>>0>d>>>0));if((ba|0)==54){Rj(0)}r=c[o>>2]|0;s=a;t=r+(d*12|0)|0;od(s,t);i=e;return}function Sc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;e=a+8|0;f=a;g=c[f>>2]|0;h=g;if(!((((c[e>>2]|0)-h|0)/12|0)>>>0<b>>>0)){i=d;return}j=a+4|0;a=c[j>>2]|0;if((b|0)==0){k=0}else{k=Pm(b*12|0)|0}l=k+(((a-h|0)/12|0)*12|0)|0;h=k+(b*12|0)|0;do{if((a|0)==(g|0)){c[f>>2]=l;c[j>>2]=l;c[e>>2]=h;m=g}else{b=a;k=l;do{b=b+ -12|0;od(k+ -12|0,b);k=k+ -12|0;}while((b|0)!=(g|0));b=c[f>>2]|0;n=c[j>>2]|0;c[f>>2]=k;c[j>>2]=l;c[e>>2]=h;if((n|0)==(b|0)){m=b;break}else{o=n}while(1){n=o+ -12|0;p=c[n>>2]|0;if((p|0)!=0){q=o+ -8|0;r=c[q>>2]|0;if((r|0)!=(p|0)){c[q>>2]=r+(~((r+ -4+(0-p)|0)>>>2)<<2)}Rm(p)}if((n|0)==(b|0)){m=b;break}else{o=n}}}}while(0);if((m|0)==0){i=d;return}Rm(m);i=d;return}function Tc(a){a=a|0;Ma(a|0)|0;Fa()}function Uc(b){b=b|0;var d=0,e=0,f=0,g=0,h=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;d=i;i=i+168|0;e=d;f=d+16|0;g=d+152|0;h=f;j=f+4|0;c[h>>2]=212;k=f+56|0;c[k>>2]=232;l=f+56|0;Re(l,j);c[f+128>>2]=0;c[f+132>>2]=-1;c[h>>2]=84;c[f+56>>2]=104;m=e;n=j;c[n>>2]=2400;o=f+8|0;Xj(o);p=f+12|0;c[p+0>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;c[p+16>>2]=0;c[p+20>>2]=0;c[n>>2]=248;n=f+36|0;p=f+52|0;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;c[n+12>>2]=0;c[p>>2]=16;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;md(j,e);if(!((a[m]&1)==0)){Rm(c[e+8>>2]|0)}e=b+4|0;m=b;if((c[e>>2]|0)!=(c[m>>2]|0)){b=f;p=0;do{q=Vc(Jf(Vc(b,8)|0,p)|0,16)|0;r=c[m>>2]|0;s=r+(p*12|0)|0;t=c[s>>2]|0;u=((c[r+(p*12|0)+4>>2]|0)-t>>2)+ -1|0;if((u|0)==0){v=t}else{r=t;t=u;while(1){u=Kf(q,c[r+(t<<2)>>2]|0)|0;w=u;x=u;c[x+((c[(c[w>>2]|0)+ -12>>2]|0)+12)>>2]=9;c[x+((c[(c[w>>2]|0)+ -12>>2]|0)+76)>>2]=48;w=t+ -1|0;x=c[s>>2]|0;if((w|0)==0){v=x;break}else{t=w;r=x}}}Vc(Kf(q,c[v>>2]|0)|0,24)|0;p=p+1|0;}while(p>>>0<(((c[e>>2]|0)-(c[m>>2]|0)|0)/12|0)>>>0)}bd(g,j);Wc(480,g)|0;if(!((a[g]&1)==0)){Rm(c[g+8>>2]|0)}c[h>>2]=84;c[k>>2]=104;k=f+4|0;c[k>>2]=248;if((a[n]&1)==0){c[k>>2]=2400;Zj(o);Pe(l);i=d;return}Rm(c[f+44>>2]|0);c[k>>2]=2400;Zj(o);Pe(l);i=d;return}function Vc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+40|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=h;a[l]=0;c[h+4>>2]=b;m=b;n=c[(c[m>>2]|0)+ -12>>2]|0;o=b;if((c[o+(n+16)>>2]|0)!=0){If(h);i=e;return b|0}p=c[o+(n+72)>>2]|0;if((p|0)==0){q=n}else{xf(p)|0;q=c[(c[m>>2]|0)+ -12>>2]|0}a[l]=1;l=on(d|0)|0;c[j>>2]=c[o+(q+24)>>2];if((c[o+(q+4)>>2]&176|0)==32){r=d+l|0}else{r=d}p=o+q|0;n=o+(q+76)|0;q=c[n>>2]|0;if((q|0)==-1){s=p;Qe(g,s);t=_j(g,5128)|0;u=yc[c[(c[t>>2]|0)+28>>2]&31](t,32)|0;Zj(g);g=u<<24>>24;c[n>>2]=g;v=s;w=g}else{v=p;w=q}q=w&255;w=d+l|0;l=f;p=j;c[l+0>>2]=c[p+0>>2];ad(k,f,d,r,w,v,q);if((c[k>>2]|0)!=0){If(h);i=e;return b|0}k=c[(c[m>>2]|0)+ -12>>2]|0;Oe(o+k|0,c[o+(k+16)>>2]|5);If(h);i=e;return b|0}function Wc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+40|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=h;a[l]=0;c[h+4>>2]=b;m=b;n=c[(c[m>>2]|0)+ -12>>2]|0;o=b;if((c[o+(n+16)>>2]|0)!=0){If(h);i=e;return b|0}p=c[o+(n+72)>>2]|0;if((p|0)!=0){xf(p)|0}a[l]=1;l=a[d]|0;p=(l&1)==0;if(p){q=(l&255)>>>1}else{q=c[d+4>>2]|0}l=c[(c[m>>2]|0)+ -12>>2]|0;c[j>>2]=c[o+(l+24)>>2];if(p){p=d;if((c[o+(l+4)>>2]&176|0)==32){r=p+q+1|0}else{r=p+1|0}s=r;t=d+1|0;u=d+1|0}else{r=c[d+8>>2]|0;if((c[o+(l+4)>>2]&176|0)==32){v=r+q|0}else{v=r}s=v;t=c[d+8>>2]|0;u=c[d+8>>2]|0}d=o+l|0;v=o+(l+76)|0;l=c[v>>2]|0;if((l|0)==-1){r=d;Qe(g,r);p=_j(g,5128)|0;n=yc[c[(c[p>>2]|0)+28>>2]&31](p,32)|0;Zj(g);g=n<<24>>24;c[v>>2]=g;w=r;x=g}else{w=d;x=l}l=x&255;x=u+q|0;q=f;u=j;c[q+0>>2]=c[u+0>>2];ad(k,f,t,s,x,w,l);if((c[k>>2]|0)!=0){If(h);i=e;return b|0}k=c[(c[m>>2]|0)+ -12>>2]|0;Oe(o+k|0,c[o+(k+16)>>2]|5);If(h);i=e;return b|0}function Xc(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=84;c[b+56>>2]=104;e=b+4|0;c[e>>2]=248;if(!((a[b+36|0]&1)==0)){Rm(c[b+44>>2]|0)}c[e>>2]=2400;Zj(b+8|0);Pe(b+56|0);i=d;return}function Yc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+184|0;f=e;g=e+16|0;h=e+152|0;j=e+168|0;k=g;l=g+4|0;c[k>>2]=212;m=g+56|0;c[m>>2]=232;n=g+56|0;Re(n,l);c[g+128>>2]=0;c[g+132>>2]=-1;c[k>>2]=84;c[g+56>>2]=104;o=f;p=l;c[p>>2]=2400;q=g+8|0;Xj(q);r=g+12|0;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;c[r+12>>2]=0;c[r+16>>2]=0;c[r+20>>2]=0;c[p>>2]=248;p=g+36|0;r=g+52|0;c[p+0>>2]=0;c[p+4>>2]=0;c[p+8>>2]=0;c[p+12>>2]=0;c[r>>2]=16;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;md(l,f);if(!((a[o]&1)==0)){Rm(c[f+8>>2]|0)}f=b;do{if(!((((c[b+4>>2]|0)-(c[f>>2]|0)|0)/12|0)>>>0>d>>>0)){Rc(h,b,d);o=c[h>>2]|0;if((o|0)==0){break}r=h+4|0;s=c[r>>2]|0;if((s|0)!=(o|0)){c[r>>2]=s+(~((s+ -4+(0-o)|0)>>>2)<<2)}Rm(o)}}while(0);h=Vc(Kf(Vc(g,8)|0,d)|0,16)|0;b=c[f>>2]|0;f=b+(d*12|0)|0;o=c[f>>2]|0;s=((c[b+(d*12|0)+4>>2]|0)-o>>2)+ -1|0;if((s|0)==0){t=o}else{d=o;o=s;while(1){s=Kf(h,c[d+(o<<2)>>2]|0)|0;b=s;r=s;c[r+((c[(c[b>>2]|0)+ -12>>2]|0)+12)>>2]=9;c[r+((c[(c[b>>2]|0)+ -12>>2]|0)+76)>>2]=48;b=o+ -1|0;r=c[f>>2]|0;if((b|0)==0){t=r;break}else{o=b;d=r}}}Vc(Kf(h,c[t>>2]|0)|0,24)|0;bd(j,l);Wc(480,j)|0;if(!((a[j]&1)==0)){Rm(c[j+8>>2]|0)}c[k>>2]=84;c[m>>2]=104;m=g+4|0;c[m>>2]=248;if((a[p]&1)==0){c[m>>2]=2400;Zj(q);Pe(n);i=e;return}Rm(c[g+44>>2]|0);c[m>>2]=2400;Zj(q);Pe(n);i=e;return}function Zc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=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;f=i;i=i+16|0;g=f;if((d|0)<3){d=b;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=f;return}d=c[e+4>>2]|0;e=on(d|0)|0;if(e>>>0>4294967279){re(0)}if(e>>>0<11){h=e<<1&255;j=g;a[j]=h;k=j;l=h;m=g+1|0}else{h=e+16&-16;j=Pm(h)|0;c[g+8>>2]=j;n=h|1;c[g>>2]=n;c[g+4>>2]=e;k=g;l=n&255;m=j}mn(m|0,d|0,e|0)|0;a[m+e|0]=0;if((l&1)==0){o=(l&255)>>>1;p=g+1|0}else{o=c[g+4>>2]|0;p=c[g+8>>2]|0}e=o>>>0>3;if((en(p,40,e?3:o)|0)==0){if(o>>>0>2&(e^1)){q=28}else{q=13}}else{q=13}do{if((q|0)==13){if((l&1)==0){r=(l&255)>>>1;s=g+1|0}else{r=c[g+4>>2]|0;s=c[g+8>>2]|0}e=r>>>0>2;if((en(s,48,e?2:r)|0)==0){if(r>>>0>1&(e^1)){q=28;break}}if((l&1)==0){t=(l&255)>>>1;u=g+1|0}else{t=c[g+4>>2]|0;u=c[g+8>>2]|0}e=t>>>0>4;if((en(u,56,e?4:t)|0)==0){if(t>>>0>3&(e^1)){q=28;break}}if((l&1)==0){v=(l&255)>>>1;w=g+1|0}else{v=c[g+4>>2]|0;w=c[g+8>>2]|0}e=v>>>0>4;if((en(w,64,e?4:v)|0)==0){if(v>>>0>3&(e^1)){q=28;break}}e=b;c[e+0>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0}}while(0);do{if((q|0)==28){if((l&1)==0){v=b;c[v+0>>2]=c[k+0>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];break}v=c[g+8>>2]|0;w=c[g+4>>2]|0;if(w>>>0>4294967279){re(0)}if(w>>>0<11){a[b]=w<<1;x=b+1|0}else{t=w+16&-16;u=Pm(t)|0;c[b+8>>2]=u;c[b>>2]=t|1;c[b+4>>2]=w;x=u}mn(x|0,v|0,w|0)|0;a[x+w|0]=0}}while(0);if((l&1)==0){i=f;return}Rm(c[g+8>>2]|0);i=f;return}function _c(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+80|0;f=e;g=e+16|0;h=e+32|0;j=e+48|0;k=e+64|0;Zc(f,b,d);l=f;m=a[l]|0;if((m&1)==0){n=(m&255)>>>1}else{n=c[f+4>>2]|0}if((n|0)==0){xe(f,48)|0;o=a[l]|0;p=5e4}else{o=m;p=wb(c[d+8>>2]|0)|0}if((o&1)==0){q=(o&255)>>>1;r=f+1|0}else{q=c[f+4>>2]|0;r=c[f+8>>2]|0}o=q>>>0>3;do{if((en(r,40,o?3:q)|0)==0){if(!(q>>>0>2&(o^1))){break}$c(g,p);Uc(g);m=g;n=c[m>>2]|0;if((n|0)==0){break}s=g+4|0;t=c[s>>2]|0;if((t|0)==(n|0)){u=n}else{v=t;while(1){t=v+ -12|0;c[s>>2]=t;w=c[t>>2]|0;if((w|0)==0){x=t}else{t=v+ -8|0;y=c[t>>2]|0;if((y|0)!=(w|0)){c[t>>2]=y+(~((y+ -4+(0-w)|0)>>>2)<<2)}Rm(w);x=c[s>>2]|0}if((x|0)==(n|0)){break}else{v=x}}u=c[m>>2]|0}Rm(u)}}while(0);u=a[l]|0;if((u&1)==0){z=(u&255)>>>1;A=f+1|0}else{z=c[f+4>>2]|0;A=c[f+8>>2]|0}u=z>>>0>2;do{if((en(A,48,u?2:z)|0)==0){if(!(z>>>0>1&(u^1))){break}$c(h,p);x=h;g=c[x>>2]|0;if((g|0)==0){break}o=h+4|0;q=c[o>>2]|0;if((q|0)==(g|0)){B=g}else{r=q;while(1){q=r+ -12|0;c[o>>2]=q;v=c[q>>2]|0;if((v|0)==0){C=q}else{q=r+ -8|0;n=c[q>>2]|0;if((n|0)!=(v|0)){c[q>>2]=n+(~((n+ -4+(0-v)|0)>>>2)<<2)}Rm(v);C=c[o>>2]|0}if((C|0)==(g|0)){break}else{r=C}}B=c[x>>2]|0}Rm(B)}}while(0);B=a[l]|0;if((B&1)==0){D=(B&255)>>>1;E=f+1|0}else{D=c[f+4>>2]|0;E=c[f+8>>2]|0}B=D>>>0>4;do{if((en(E,56,B?4:D)|0)==0){if(!(D>>>0>3&(B^1))){break}$c(j,0);if((b|0)>2){C=2;do{Yc(j,wb(c[d+(C<<2)>>2]|0)|0);C=C+1|0;}while((C|0)<(b|0))}C=j;x=c[C>>2]|0;if((x|0)==0){break}h=j+4|0;u=c[h>>2]|0;if((u|0)==(x|0)){F=x}else{z=u;while(1){u=z+ -12|0;c[h>>2]=u;A=c[u>>2]|0;if((A|0)==0){G=u}else{u=z+ -8|0;r=c[u>>2]|0;if((r|0)!=(A|0)){c[u>>2]=r+(~((r+ -4+(0-A)|0)>>>2)<<2)}Rm(A);G=c[h>>2]|0}if((G|0)==(x|0)){break}else{z=G}}F=c[C>>2]|0}Rm(F)}}while(0);F=a[l]|0;if((F&1)==0){H=(F&255)>>>1;I=f+1|0}else{H=c[f+4>>2]|0;I=c[f+8>>2]|0}F=H>>>0>4;do{if((en(I,64,F?4:H)|0)==0){if(!(H>>>0>3&(F^1))){break}if((b|0)==3){J=25e3}else{J=wb(c[d+12>>2]|0)|0}$c(k,0);if((p|0)!=0){G=0;do{Yc(k,(hn()|0)%(J|0)|0);G=G+1|0;}while(G>>>0<p>>>0)}G=k;C=c[G>>2]|0;if((C|0)==0){break}j=k+4|0;B=c[j>>2]|0;if((B|0)==(C|0)){K=C}else{D=B;while(1){B=D+ -12|0;c[j>>2]=B;E=c[B>>2]|0;if((E|0)==0){L=B}else{B=D+ -8|0;z=c[B>>2]|0;if((z|0)!=(E|0)){c[B>>2]=z+(~((z+ -4+(0-E)|0)>>>2)<<2)}Rm(E);L=c[j>>2]|0}if((L|0)==(C|0)){break}else{D=L}}K=c[G>>2]|0}Rm(K)}}while(0);if((a[l]&1)==0){i=e;return 0}Rm(c[f+8>>2]|0);i=e;return 0}function $c(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;Rc(e,a,b);b=c[e>>2]|0;if((b|0)==0){i=d;return}a=e+4|0;e=c[a>>2]|0;if((e|0)!=(b|0)){c[a>>2]=e+(~((e+ -4+(0-b)|0)>>>2)<<2)}Rm(b);i=d;return}function ad(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=i;i=i+16|0;l=k;m=d;d=c[m>>2]|0;if((d|0)==0){c[b>>2]=0;i=k;return}n=g;g=e;o=n-g|0;p=h+12|0;h=c[p>>2]|0;q=(h|0)>(o|0)?h-o|0:0;o=f;h=o-g|0;do{if((h|0)>0){if((jc[c[(c[d>>2]|0)+48>>2]&31](d,e,h)|0)==(h|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);do{if((q|0)>0){if(q>>>0<11){h=q<<1&255;e=l;a[e]=h;r=e;s=h;t=l+1|0}else{h=q+16&-16;e=Pm(h)|0;c[l+8>>2]=e;g=h|1;c[l>>2]=g;c[l+4>>2]=q;r=l;s=g&255;t=e}jn(t|0,j|0,q|0)|0;a[t+q|0]=0;if((s&1)==0){u=l+1|0}else{u=c[l+8>>2]|0}if((jc[c[(c[d>>2]|0)+48>>2]&31](d,u,q)|0)==(q|0)){if((a[r]&1)==0){break}Rm(c[l+8>>2]|0);break}c[m>>2]=0;c[b>>2]=0;if((a[r]&1)==0){i=k;return}Rm(c[l+8>>2]|0);i=k;return}}while(0);l=n-o|0;do{if((l|0)>0){if((jc[c[(c[d>>2]|0)+48>>2]&31](d,f,l)|0)==(l|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);c[p>>2]=0;c[b>>2]=d;i=k;return}function bd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=c[d+48>>2]|0;if((f&16|0)!=0){g=d+44|0;h=c[g>>2]|0;j=c[d+24>>2]|0;if(h>>>0<j>>>0){c[g>>2]=j;k=j}else{k=h}h=c[d+20>>2]|0;j=h;g=k-j|0;if(g>>>0>4294967279){re(0)}if(g>>>0<11){a[b]=g<<1;l=b+1|0}else{m=g+16&-16;n=Pm(m)|0;c[b+8>>2]=n;c[b>>2]=m|1;c[b+4>>2]=g;l=n}if((h|0)==(k|0)){o=l}else{n=h;h=l;while(1){a[h]=a[n]|0;g=n+1|0;if((g|0)==(k|0)){break}else{h=h+1|0;n=g}}o=l+(k+(0-j))|0}a[o]=0;i=e;return}if((f&8|0)==0){f=b;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;i=e;return}f=c[d+8>>2]|0;o=c[d+16>>2]|0;d=f;j=o-d|0;if(j>>>0>4294967279){re(0)}if(j>>>0<11){a[b]=j<<1;p=b+1|0}else{k=j+16&-16;l=Pm(k)|0;c[b+8>>2]=l;c[b>>2]=k|1;c[b+4>>2]=j;p=l}if((f|0)==(o|0)){q=p}else{l=f;f=p;while(1){a[f]=a[l]|0;j=l+1|0;if((j|0)==(o|0)){break}else{f=f+1|0;l=j}}q=p+(o+(0-d))|0}a[q]=0;i=e;return}function cd(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=84;c[b+56>>2]=104;e=b+4|0;c[e>>2]=248;if(!((a[b+36|0]&1)==0)){Rm(c[b+44>>2]|0)}c[e>>2]=2400;Zj(b+8|0);Pe(b+56|0);Rm(b);i=d;return}function dd(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b;f=c[(c[b>>2]|0)+ -12>>2]|0;c[e+f>>2]=84;b=e+(f+56)|0;c[b>>2]=104;g=e+(f+4)|0;c[g>>2]=248;if(!((a[e+(f+36)|0]&1)==0)){Rm(c[e+(f+44)>>2]|0)}c[g>>2]=2400;Zj(e+(f+8)|0);Pe(b);i=d;return}function ed(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b;f=c[(c[b>>2]|0)+ -12>>2]|0;b=e+f|0;c[b>>2]=84;g=e+(f+56)|0;c[g>>2]=104;h=e+(f+4)|0;c[h>>2]=248;if(!((a[e+(f+36)|0]&1)==0)){Rm(c[e+(f+44)>>2]|0)}c[h>>2]=2400;Zj(e+(f+8)|0);Pe(g);Rm(b);i=d;return}function fd(b){b=b|0;var d=0,e=0;d=i;e=b;c[e>>2]=248;if(!((a[b+32|0]&1)==0)){Rm(c[b+40>>2]|0)}c[e>>2]=2400;Zj(b+4|0);i=d;return}function gd(b){b=b|0;var d=0,e=0;d=i;e=b;c[e>>2]=248;if(!((a[b+32|0]&1)==0)){Rm(c[b+40>>2]|0)}c[e>>2]=2400;Zj(b+4|0);Rm(b);i=d;return}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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;k=d+44|0;l=c[k>>2]|0;m=d+24|0;n=c[m>>2]|0;if(l>>>0<n>>>0){c[k>>2]=n;o=n}else{o=l}l=h&24;do{if((l|0)==24){if((g|0)==2){p=11;break}else if((g|0)==0){q=0;r=0;break}else if((g|0)!=1){p=15;break}k=b;c[k>>2]=0;c[k+4>>2]=0;k=b+8|0;c[k>>2]=-1;c[k+4>>2]=-1;i=j;return}else if((l|0)==0){k=b;c[k>>2]=0;c[k+4>>2]=0;k=b+8|0;c[k>>2]=-1;c[k+4>>2]=-1;i=j;return}else{if((g|0)==2){p=11;break}else if((g|0)==0){q=0;r=0;break}else if((g|0)!=1){p=15;break}if((h&8|0)==0){k=n-(c[d+20>>2]|0)|0;q=k;r=((k|0)<0)<<31>>31;break}else{k=(c[d+12>>2]|0)-(c[d+8>>2]|0)|0;q=k;r=((k|0)<0)<<31>>31;break}}}while(0);if((p|0)==15){g=b;c[g>>2]=0;c[g+4>>2]=0;g=b+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=j;return}if((p|0)==11){p=d+32|0;if((a[p]&1)==0){s=p+1|0}else{s=c[d+40>>2]|0}p=o-s|0;q=p;r=((p|0)<0)<<31>>31}p=ln(q|0,r|0,e|0,f|0)|0;f=J;do{if(!((f|0)<0|(f|0)==0&p>>>0<0)){e=d+32|0;if((a[e]&1)==0){t=e+1|0}else{t=c[d+40>>2]|0}e=o-t|0;r=((e|0)<0)<<31>>31;if((r|0)<(f|0)|(r|0)==(f|0)&e>>>0<p>>>0){break}e=h&8;do{if(!((p|0)==0&(f|0)==0)){do{if((e|0)!=0){if((c[d+12>>2]|0)!=0){break}r=b;c[r>>2]=0;c[r+4>>2]=0;r=b+8|0;c[r>>2]=-1;c[r+4>>2]=-1;i=j;return}}while(0);if(!((h&16|0)!=0&(n|0)==0)){break}r=b;c[r>>2]=0;c[r+4>>2]=0;r=b+8|0;c[r>>2]=-1;c[r+4>>2]=-1;i=j;return}}while(0);if((e|0)!=0){c[d+12>>2]=(c[d+8>>2]|0)+p;c[d+16>>2]=o}if((h&16|0)!=0){c[m>>2]=(c[d+20>>2]|0)+p}r=b;c[r>>2]=0;c[r+4>>2]=0;r=b+8|0;c[r>>2]=p;c[r+4>>2]=f;i=j;return}}while(0);f=b;c[f>>2]=0;c[f+4>>2]=0;f=b+8|0;c[f>>2]=-1;c[f+4>>2]=-1;i=j;return}function id(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=d+8|0;xc[c[(c[b>>2]|0)+16>>2]&31](a,b,c[g>>2]|0,c[g+4>>2]|0,0,e);i=f;return}function jd(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;e=a+44|0;f=c[e>>2]|0;g=c[a+24>>2]|0;if(f>>>0<g>>>0){c[e>>2]=g;h=g}else{h=f}if((c[a+48>>2]&8|0)==0){j=-1;i=b;return j|0}f=a+16|0;g=c[f>>2]|0;e=c[a+12>>2]|0;if(g>>>0<h>>>0){c[f>>2]=h;k=h}else{k=g}if(!(e>>>0<k>>>0)){j=-1;i=b;return j|0}j=d[e]|0;i=b;return j|0}function kd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b+44|0;g=c[f>>2]|0;h=c[b+24>>2]|0;if(g>>>0<h>>>0){c[f>>2]=h;j=h}else{j=g}g=b+8|0;h=c[g>>2]|0;f=b+12|0;k=c[f>>2]|0;if(!(h>>>0<k>>>0)){l=-1;i=e;return l|0}if((d|0)==-1){c[g>>2]=h;c[f>>2]=k+ -1;c[b+16>>2]=j;l=0;i=e;return l|0}do{if((c[b+48>>2]&16|0)==0){m=d&255;n=k+ -1|0;if(m<<24>>24==(a[n]|0)){o=m;p=n;break}else{l=-1}i=e;return l|0}else{o=d&255;p=k+ -1|0}}while(0);c[g>>2]=h;c[f>>2]=p;c[b+16>>2]=j;a[p]=o;l=d;i=e;return l|0}function ld(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;if((d|0)==-1){f=0;i=e;return f|0}g=b;h=b+12|0;j=b+8|0;k=(c[h>>2]|0)-(c[j>>2]|0)|0;l=b+24|0;m=c[l>>2]|0;n=b+28|0;o=c[n>>2]|0;if((m|0)==(o|0)){p=b+48|0;if((c[p>>2]&16|0)==0){f=-1;i=e;return f|0}q=b+20|0;r=c[q>>2]|0;s=m-r|0;t=b+44|0;u=(c[t>>2]|0)-r|0;r=b+32|0;v=r;w=a[v]|0;x=(w&1)!=0;if(x){y=(c[r>>2]&-2)+ -1|0;z=c[b+36>>2]|0}else{y=10;z=(w&255)>>>1}if((z|0)==(y|0)){Ee(r,y,1,y,y,0,0);if((a[v]&1)==0){A=11}else{A=12}}else{if(x){A=12}else{A=11}}if((A|0)==11){a[v]=(z<<1)+2;B=r+1|0;C=z+1|0}else if((A|0)==12){A=c[b+40>>2]|0;x=z+1|0;c[b+36>>2]=x;B=A;C=x}a[B+z|0]=0;a[B+C|0]=0;C=a[v]|0;if((C&1)==0){D=C;E=10}else{C=c[r>>2]|0;D=C&255;E=(C&-2)+ -1|0}C=(D&1)==0;if(C){F=(D&255)>>>1}else{F=c[b+36>>2]|0}do{if(F>>>0<E>>>0){ze(r,E-F|0,0)|0}else{if(C){a[r+E+1|0]=0;a[v]=E<<1;break}else{a[(c[b+40>>2]|0)+E|0]=0;c[b+36>>2]=E;break}}}while(0);E=a[v]|0;if((E&1)==0){G=r+1|0;H=(E&255)>>>1}else{G=c[b+40>>2]|0;H=c[b+36>>2]|0}E=G+H|0;c[q>>2]=G;c[n>>2]=E;n=G+s|0;c[l>>2]=n;s=G+u|0;c[t>>2]=s;I=p;J=s;K=E;L=n}else{I=b+48|0;J=c[b+44>>2]|0;K=o;L=m}m=L+1|0;o=m>>>0<J>>>0?J:m;c[b+44>>2]=o;if((c[I>>2]&8|0)!=0){I=b+32|0;if((a[I]&1)==0){M=I+1|0}else{M=c[b+40>>2]|0}c[j>>2]=M;c[h>>2]=M+k;c[b+16>>2]=o}if((L|0)==(K|0)){f=yc[c[(c[b>>2]|0)+52>>2]&31](g,d&255)|0;i=e;return f|0}else{c[l>>2]=m;a[L]=d;f=d&255;i=e;return f|0}return 0}function md(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;f=b+32|0;we(f,d)|0;d=b+44|0;c[d>>2]=0;g=b+48|0;h=c[g>>2]|0;if((h&8|0)!=0){j=a[f]|0;if((j&1)==0){k=f+((j&255)>>>1)+1|0;c[d>>2]=k;l=f+1|0;m=k;n=f+1|0}else{k=(c[b+40>>2]|0)+(c[b+36>>2]|0)|0;c[d>>2]=k;j=c[b+40>>2]|0;l=j;m=k;n=j}c[b+8>>2]=l;c[b+12>>2]=n;c[b+16>>2]=m}if((h&16|0)==0){i=e;return}h=f;m=a[h]|0;if((m&1)==0){n=(m&255)>>>1;c[d>>2]=f+n+1;o=n;p=m;q=10}else{m=c[b+36>>2]|0;c[d>>2]=(c[b+40>>2]|0)+m;d=c[f>>2]|0;o=m;p=d&255;q=(d&-2)+ -1|0}d=(p&1)==0;if(d){r=(p&255)>>>1}else{r=c[b+36>>2]|0}do{if(r>>>0<q>>>0){ze(f,q-r|0,0)|0}else{if(d){a[f+q+1|0]=0;a[h]=q<<1;break}else{a[(c[b+40>>2]|0)+q|0]=0;c[b+36>>2]=q;break}}}while(0);q=a[h]|0;if((q&1)==0){s=f+1|0;t=f+1|0;u=(q&255)>>>1}else{q=c[b+40>>2]|0;s=q;t=q;u=c[b+36>>2]|0}q=b+24|0;c[q>>2]=t;c[b+20>>2]=t;c[b+28>>2]=s+u;if((c[g>>2]&3|0)==0){i=e;return}c[q>>2]=t+o;i=e;return}function nd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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;d=i;e=a+4|0;f=c[e>>2]|0;g=a;h=c[g>>2]|0;j=h;k=(f-j|0)/12|0;l=k+1|0;if(l>>>0>357913941){Rj(0)}m=a+8|0;a=((c[m>>2]|0)-j|0)/12|0;if(a>>>0<178956970){j=a<<1;a=j>>>0<l>>>0?l:j;if((a|0)==0){n=0;o=0}else{p=a;q=5}}else{p=357913941;q=5}if((q|0)==5){n=p;o=Pm(p*12|0)|0}p=o+(k*12|0)|0;k=o+(n*12|0)|0;if((p|0)==0){r=f;s=h}else{od(p,b);r=c[e>>2]|0;s=c[g>>2]|0}b=o+(l*12|0)|0;do{if((r|0)==(s|0)){c[g>>2]=p;c[e>>2]=b;c[m>>2]=k;t=r}else{l=r;o=p;do{l=l+ -12|0;od(o+ -12|0,l);o=o+ -12|0;}while((l|0)!=(s|0));l=c[g>>2]|0;h=c[e>>2]|0;c[g>>2]=o;c[e>>2]=b;c[m>>2]=k;if((h|0)==(l|0)){t=l;break}else{u=h}while(1){h=u+ -12|0;f=c[h>>2]|0;if((f|0)!=0){n=u+ -8|0;q=c[n>>2]|0;if((q|0)!=(f|0)){c[n>>2]=q+(~((q+ -4+(0-f)|0)>>>2)<<2)}Rm(f)}if((h|0)==(l|0)){t=l;break}else{u=h}}}}while(0);if((t|0)==0){i=d;return}Rm(t);i=d;return}function od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a;c[e>>2]=0;f=a+4|0;c[f>>2]=0;g=a+8|0;c[g>>2]=0;a=b+4|0;h=b;b=(c[a>>2]|0)-(c[h>>2]|0)|0;j=b>>2;if((j|0)==0){i=d;return}if(j>>>0>1073741823){Rj(0)}k=Pm(b)|0;c[f>>2]=k;c[e>>2]=k;c[g>>2]=k+(j<<2);j=c[h>>2]|0;h=c[a>>2]|0;if((j|0)==(h|0)){i=d;return}a=(h+ -4+(0-j)|0)>>>2;g=j;j=k;while(1){if((j|0)!=0){c[j>>2]=c[g>>2]}e=g+4|0;if((e|0)==(h|0)){break}else{g=e;j=j+4|0}}c[f>>2]=k+(a+1<<2);i=d;return}function pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+16|0;f=e;g=a;h=a;c[h>>2]=0;j=a+4|0;c[j>>2]=0;k=a+8|0;c[k>>2]=0;a=b+4|0;l=b;m=(c[a>>2]|0)-(c[l>>2]|0)>>2;n=d+4|0;o=d;p=(c[n>>2]|0)-(c[o>>2]|0)>>2;q=m>>>0>p>>>0?m:p;if(m>>>0<q>>>0){qd(b,q-m|0)}m=c[n>>2]|0;b=c[o>>2]|0;p=m-b>>2;do{if(p>>>0<q>>>0){qd(d,q-p|0)}else{if(!(p>>>0>q>>>0)){break}r=b+(q<<2)|0;if((m|0)==(r|0)){break}c[n>>2]=m+(~((m+ -4+(0-r)|0)>>>2)<<2)}}while(0);m=c[j>>2]|0;n=c[h>>2]|0;b=m-n>>2;do{if(b>>>0<q>>>0){qd(g,q-b|0);s=c[h>>2]|0}else{if(!(b>>>0>q>>>0)){s=n;break}p=n+(q<<2)|0;if((m|0)==(p|0)){s=n;break}c[j>>2]=m+(~((m+ -4+(0-p)|0)>>>2)<<2);s=n}}while(0);c[8]=0;n=c[l>>2]|0;l=c[a>>2]|0;a=c[o>>2]|0;od(f,g);if((n|0)!=(l|0)){g=n;n=s;s=a;while(1){a=(c[s>>2]|0)+(c[g>>2]|0)+(c[8]|0)|0;c[8]=(a>>>0)/1e9|0;c[n>>2]=(a>>>0)%1e9|0;a=g+4|0;if((a|0)==(l|0)){break}else{s=s+4|0;n=n+4|0;g=a}}}g=c[f>>2]|0;if((g|0)!=0){n=f+4|0;f=c[n>>2]|0;if((f|0)!=(g|0)){c[n>>2]=f+(~((f+ -4+(0-g)|0)>>>2)<<2)}Rm(g)}g=c[8]|0;if((g|0)==0){i=e;return}f=c[j>>2]|0;if((f|0)!=(c[k>>2]|0)){if((f|0)!=0){c[f>>2]=g}c[j>>2]=f+4;i=e;return}n=c[h>>2]|0;s=f-n|0;f=s>>2;l=f+1|0;if(l>>>0>1073741823){Rj(0)}if(f>>>0<536870911){a=s>>1;o=a>>>0<l>>>0?l:a;if((o|0)==0){t=0;u=0}else{v=o;w=28}}else{v=1073741823;w=28}if((w|0)==28){t=v;u=Pm(v<<2)|0}v=u+(f<<2)|0;if((v|0)!=0){c[v>>2]=g}g=n;mn(u|0,g|0,s|0)|0;c[h>>2]=u;c[j>>2]=u+(l<<2);c[k>>2]=u+(t<<2);if((n|0)==0){i=e;return}Rm(g);i=e;return}function qd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;e=a+8|0;f=a+4|0;g=c[f>>2]|0;h=c[e>>2]|0;j=g;if(!(h-j>>2>>>0<b>>>0)){k=b;l=g;while(1){if((l|0)!=0){c[l>>2]=0}m=k+ -1|0;if((m|0)==0){break}else{k=m;l=l+4|0}}c[f>>2]=g+(b<<2);i=d;return}g=a;a=c[g>>2]|0;l=a;k=j-l|0;j=k>>2;m=j+b|0;if(m>>>0>1073741823){Rj(0)}n=h-l|0;if(n>>2>>>0<536870911){l=n>>1;n=l>>>0<m>>>0?m:l;if((n|0)==0){o=0;p=0}else{q=n;r=10}}else{q=1073741823;r=10}if((r|0)==10){o=q;p=Pm(q<<2)|0}q=b;b=p+(j<<2)|0;while(1){if((b|0)!=0){c[b>>2]=0}j=q+ -1|0;if((j|0)==0){break}else{q=j;b=b+4|0}}b=a;mn(p|0,b|0,k|0)|0;c[g>>2]=p;c[f>>2]=p+(m<<2);c[e>>2]=p+(o<<2);if((a|0)==0){i=d;return}Rm(b);i=d;return}function rd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+32|0;d=b;e=b+8|0;f=b+16|0;g=b+24|0;h=c[s>>2]|0;Nd(1104,h,1160);c[98]=2532;c[400>>2]=2552;c[396>>2]=0;Re(400|0,1104);c[472>>2]=0;c[476>>2]=-1;j=c[t>>2]|0;c[302]=2400;Xj(1212|0);c[1216>>2]=0;c[1220>>2]=0;c[1224>>2]=0;c[1228>>2]=0;c[1232>>2]=0;c[1236>>2]=0;c[302]=1720;c[1240>>2]=j;Yj(g,1212|0);k=_j(g,5192)|0;l=k;Zj(g);c[1244>>2]=l;c[1248>>2]=1168;a[1252|0]=(pc[c[(c[k>>2]|0)+28>>2]&127](l)|0)&1;c[120]=2612;c[484>>2]=2632;Re(484|0,1208);c[556>>2]=0;c[560>>2]=-1;l=c[r>>2]|0;c[314]=2400;Xj(1260|0);c[1264>>2]=0;c[1268>>2]=0;c[1272>>2]=0;c[1276>>2]=0;c[1280>>2]=0;c[1284>>2]=0;c[314]=1720;c[1288>>2]=l;Yj(f,1260|0);k=_j(f,5192)|0;g=k;Zj(f);c[1292>>2]=g;c[1296>>2]=1176;a[1300|0]=(pc[c[(c[k>>2]|0)+28>>2]&127](g)|0)&1;c[142]=2612;c[572>>2]=2632;Re(572|0,1256);c[644>>2]=0;c[648>>2]=-1;g=c[(c[(c[142]|0)+ -12>>2]|0)+592>>2]|0;c[164]=2612;c[660>>2]=2632;Re(660|0,g);c[732>>2]=0;c[736>>2]=-1;c[(c[(c[98]|0)+ -12>>2]|0)+464>>2]=480;g=(c[(c[142]|0)+ -12>>2]|0)+572|0;c[g>>2]=c[g>>2]|8192;c[(c[(c[142]|0)+ -12>>2]|0)+640>>2]=480;zd(1304,h,1184|0);c[186]=2572;c[752>>2]=2592;c[748>>2]=0;Re(752|0,1304);c[824>>2]=0;c[828>>2]=-1;c[340]=2464;Xj(1364|0);c[1368>>2]=0;c[1372>>2]=0;c[1376>>2]=0;c[1380>>2]=0;c[1384>>2]=0;c[1388>>2]=0;c[340]=1464;c[1392>>2]=j;Yj(e,1364|0);j=_j(e,5200)|0;h=j;Zj(e);c[1396>>2]=h;c[1400>>2]=1192;a[1404|0]=(pc[c[(c[j>>2]|0)+28>>2]&127](h)|0)&1;c[208]=2652;c[836>>2]=2672;Re(836|0,1360);c[908>>2]=0;c[912>>2]=-1;c[352]=2464;Xj(1412|0);c[1416>>2]=0;c[1420>>2]=0;c[1424>>2]=0;c[1428>>2]=0;c[1432>>2]=0;c[1436>>2]=0;c[352]=1464;c[1440>>2]=l;Yj(d,1412|0);l=_j(d,5200)|0;h=l;Zj(d);c[1444>>2]=h;c[1448>>2]=1200;a[1452|0]=(pc[c[(c[l>>2]|0)+28>>2]&127](h)|0)&1;c[230]=2652;c[924>>2]=2672;Re(924|0,1408);c[996>>2]=0;c[1e3>>2]=-1;h=c[(c[(c[230]|0)+ -12>>2]|0)+944>>2]|0;c[252]=2652;c[1012>>2]=2672;Re(1012|0,h);c[1084>>2]=0;c[1088>>2]=-1;c[(c[(c[186]|0)+ -12>>2]|0)+816>>2]=832;h=(c[(c[230]|0)+ -12>>2]|0)+924|0;c[h>>2]=c[h>>2]|8192;c[(c[(c[230]|0)+ -12>>2]|0)+992>>2]=832;i=b;return}function sd(a){a=a|0;a=i;xf(480)|0;xf(656)|0;Df(832)|0;Df(1008)|0;i=a;return}function td(a){a=a|0;var b=0;b=i;c[a>>2]=2464;Zj(a+4|0);i=b;return}function ud(a){a=a|0;var b=0;b=i;c[a>>2]=2464;Zj(a+4|0);Rm(a);i=b;return}function vd(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;pc[c[(c[b>>2]|0)+24>>2]&127](b)|0;f=_j(d,5200)|0;d=f;c[b+36>>2]=d;a[b+44|0]=(pc[c[(c[f>>2]|0)+28>>2]&127](d)|0)&1;i=e;return}function wd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=b+8|0;f=a+36|0;g=a+40|0;h=d;j=d+8|0;k=d;d=a+32|0;while(1){a=c[f>>2]|0;l=zc[c[(c[a>>2]|0)+20>>2]&15](a,c[g>>2]|0,h,j,e)|0;a=(c[e>>2]|0)-k|0;if((ob(h|0,1,a|0,c[d>>2]|0)|0)!=(a|0)){m=-1;n=5;break}if((l|0)==2){m=-1;n=5;break}else if((l|0)!=1){n=4;break}}if((n|0)==4){m=((Rb(c[d>>2]|0)|0)!=0)<<31>>31;i=b;return m|0}else if((n|0)==5){i=b;return m|0}return 0}function xd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((a[b+44|0]|0)!=0){g=ob(d|0,4,e|0,c[b+32>>2]|0)|0;i=f;return g|0}h=b;if((e|0)>0){j=d;k=0}else{g=0;i=f;return g|0}while(1){if((yc[c[(c[h>>2]|0)+52>>2]&31](b,c[j>>2]|0)|0)==-1){g=k;l=6;break}d=k+1|0;if((d|0)<(e|0)){j=j+4|0;k=d}else{g=d;l=6;break}}if((l|0)==6){i=f;return g|0}return 0}function yd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=(d|0)==-1;a:do{if(!k){c[g>>2]=d;if((a[b+44|0]|0)!=0){if((ob(g|0,4,1,c[b+32>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}m=f;c[h>>2]=m;n=g+4|0;o=b+36|0;p=b+40|0;q=f+8|0;r=f;s=b+32|0;t=g;while(1){u=c[o>>2]|0;v=uc[c[(c[u>>2]|0)+12>>2]&15](u,c[p>>2]|0,t,n,j,m,q,h)|0;if((c[j>>2]|0)==(t|0)){l=-1;w=12;break}if((v|0)==3){w=7;break}u=(v|0)==1;if(!(v>>>0<2)){l=-1;w=12;break}v=(c[h>>2]|0)-r|0;if((ob(m|0,1,v|0,c[s>>2]|0)|0)!=(v|0)){l=-1;w=12;break}if(u){t=u?c[j>>2]|0:t}else{break a}}if((w|0)==7){if((ob(t|0,1,1,c[s>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}else if((w|0)==12){i=e;return l|0}}}while(0);l=k?0:d;i=e;return l|0}function zd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f;h=b;c[h>>2]=2464;j=b+4|0;Xj(j);k=b+8|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[h>>2]=1576;c[b+32>>2]=d;c[b+40>>2]=e;c[b+48>>2]=-1;a[b+52|0]=0;Yj(g,j);j=_j(g,5200)|0;e=j;d=b+36|0;c[d>>2]=e;h=b+44|0;c[h>>2]=pc[c[(c[j>>2]|0)+24>>2]&127](e)|0;e=c[d>>2]|0;a[b+53|0]=(pc[c[(c[e>>2]|0)+28>>2]&127](e)|0)&1;if((c[h>>2]|0)>8){ij(1672)}else{Zj(g);i=f;return}}function Ad(a){a=a|0;var b=0;b=i;c[a>>2]=2464;Zj(a+4|0);i=b;return}function Bd(a){a=a|0;var b=0;b=i;c[a>>2]=2464;Zj(a+4|0);Rm(a);i=b;return}function Cd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=_j(d,5200)|0;d=f;g=b+36|0;c[g>>2]=d;h=b+44|0;c[h>>2]=pc[c[(c[f>>2]|0)+24>>2]&127](d)|0;d=c[g>>2]|0;a[b+53|0]=(pc[c[(c[d>>2]|0)+28>>2]&127](d)|0)&1;if((c[h>>2]|0)>8){ij(1672)}else{i=e;return}}function Dd(a){a=a|0;var b=0,c=0;b=i;c=Gd(a,0)|0;i=b;return c|0}function Ed(a){a=a|0;var b=0,c=0;b=i;c=Gd(a,1)|0;i=b;return c|0}function Fd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;l=(a[k]|0)!=0;if((d|0)==-1){if(l){m=-1;i=e;return m|0}n=c[b+48>>2]|0;a[k]=(n|0)!=-1|0;m=n;i=e;return m|0}n=b+48|0;a:do{if(l){c[h>>2]=c[n>>2];o=c[b+36>>2]|0;p=f;q=uc[c[(c[o>>2]|0)+12>>2]&15](o,c[b+40>>2]|0,h,h+4|0,j,p,f+8|0,g)|0;if((q|0)==1|(q|0)==2){m=-1;i=e;return m|0}else if((q|0)==3){a[p]=c[n>>2];c[g>>2]=f+1}q=b+32|0;while(1){o=c[g>>2]|0;if(!(o>>>0>p>>>0)){break a}r=o+ -1|0;c[g>>2]=r;if((Qb(a[r]|0,c[q>>2]|0)|0)==-1){m=-1;break}}i=e;return m|0}}while(0);c[n>>2]=d;a[k]=1;m=d;i=e;return m|0}function Gd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;if((a[k]|0)!=0){l=b+48|0;m=c[l>>2]|0;if(!d){n=m;i=e;return n|0}c[l>>2]=-1;a[k]=0;n=m;i=e;return n|0}m=c[b+44>>2]|0;k=(m|0)>1?m:1;a:do{if((k|0)>0){m=b+32|0;l=0;while(1){o=Jb(c[m>>2]|0)|0;if((o|0)==-1){n=-1;break}a[f+l|0]=o;l=l+1|0;if((l|0)>=(k|0)){break a}}i=e;return n|0}}while(0);b:do{if((a[b+53|0]|0)==0){l=b+40|0;m=b+36|0;o=f;p=g+4|0;q=b+32|0;r=k;while(1){s=c[l>>2]|0;t=s;u=c[t>>2]|0;v=c[t+4>>2]|0;t=c[m>>2]|0;w=f+r|0;x=uc[c[(c[t>>2]|0)+16>>2]&15](t,s,o,w,h,g,p,j)|0;if((x|0)==3){y=14;break}else if((x|0)==2){n=-1;y=22;break}else if((x|0)!=1){z=r;break b}x=c[l>>2]|0;c[x>>2]=u;c[x+4>>2]=v;if((r|0)==8){n=-1;y=22;break}v=Jb(c[q>>2]|0)|0;if((v|0)==-1){n=-1;y=22;break}a[w]=v;r=r+1|0}if((y|0)==14){c[g>>2]=a[o]|0;z=r;break}else if((y|0)==22){i=e;return n|0}}else{c[g>>2]=a[f]|0;z=k}}while(0);if(d){d=c[g>>2]|0;c[b+48>>2]=d;n=d;i=e;return n|0}d=b+32|0;b=z;while(1){if((b|0)<=0){break}z=b+ -1|0;if((Qb(a[f+z|0]|0,c[d>>2]|0)|0)==-1){n=-1;y=22;break}else{b=z}}if((y|0)==22){i=e;return n|0}n=c[g>>2]|0;i=e;return n|0}function Hd(a){a=a|0;var b=0;b=i;c[a>>2]=2400;Zj(a+4|0);i=b;return}function Id(a){a=a|0;var b=0;b=i;c[a>>2]=2400;Zj(a+4|0);Rm(a);i=b;return}function Jd(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;pc[c[(c[b>>2]|0)+24>>2]&127](b)|0;f=_j(d,5192)|0;d=f;c[b+36>>2]=d;a[b+44|0]=(pc[c[(c[f>>2]|0)+28>>2]&127](d)|0)&1;i=e;return}function Kd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=b+8|0;f=a+36|0;g=a+40|0;h=d;j=d+8|0;k=d;d=a+32|0;while(1){a=c[f>>2]|0;l=zc[c[(c[a>>2]|0)+20>>2]&15](a,c[g>>2]|0,h,j,e)|0;a=(c[e>>2]|0)-k|0;if((ob(h|0,1,a|0,c[d>>2]|0)|0)!=(a|0)){m=-1;n=5;break}if((l|0)==2){m=-1;n=5;break}else if((l|0)!=1){n=4;break}}if((n|0)==4){m=((Rb(c[d>>2]|0)|0)!=0)<<31>>31;i=b;return m|0}else if((n|0)==5){i=b;return m|0}return 0}function Ld(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;if((a[b+44|0]|0)!=0){h=ob(e|0,1,f|0,c[b+32>>2]|0)|0;i=g;return h|0}j=b;if((f|0)>0){k=e;l=0}else{h=0;i=g;return h|0}while(1){if((yc[c[(c[j>>2]|0)+52>>2]&31](b,d[k]|0)|0)==-1){h=l;m=6;break}e=l+1|0;if((e|0)<(f|0)){k=k+1|0;l=e}else{h=e;m=6;break}}if((m|0)==6){i=g;return h|0}return 0}function Md(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=(d|0)==-1;a:do{if(!k){a[g]=d;if((a[b+44|0]|0)!=0){if((ob(g|0,1,1,c[b+32>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}m=f;c[h>>2]=m;n=g+1|0;o=b+36|0;p=b+40|0;q=f+8|0;r=f;s=b+32|0;t=g;while(1){u=c[o>>2]|0;v=uc[c[(c[u>>2]|0)+12>>2]&15](u,c[p>>2]|0,t,n,j,m,q,h)|0;if((c[j>>2]|0)==(t|0)){l=-1;w=12;break}if((v|0)==3){w=7;break}u=(v|0)==1;if(!(v>>>0<2)){l=-1;w=12;break}v=(c[h>>2]|0)-r|0;if((ob(m|0,1,v|0,c[s>>2]|0)|0)!=(v|0)){l=-1;w=12;break}if(u){t=u?c[j>>2]|0:t}else{break a}}if((w|0)==7){if((ob(t|0,1,1,c[s>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}else if((w|0)==12){i=e;return l|0}}}while(0);l=k?0:d;i=e;return l|0}function Nd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f;h=b;c[h>>2]=2400;j=b+4|0;Xj(j);k=b+8|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[h>>2]=1832;c[b+32>>2]=d;c[b+40>>2]=e;c[b+48>>2]=-1;a[b+52|0]=0;Yj(g,j);j=_j(g,5192)|0;e=j;d=b+36|0;c[d>>2]=e;h=b+44|0;c[h>>2]=pc[c[(c[j>>2]|0)+24>>2]&127](e)|0;e=c[d>>2]|0;a[b+53|0]=(pc[c[(c[e>>2]|0)+28>>2]&127](e)|0)&1;if((c[h>>2]|0)>8){ij(1672)}else{Zj(g);i=f;return}}function Od(a){a=a|0;var b=0;b=i;c[a>>2]=2400;Zj(a+4|0);i=b;return}function Pd(a){a=a|0;var b=0;b=i;c[a>>2]=2400;Zj(a+4|0);Rm(a);i=b;return}function Qd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=_j(d,5192)|0;d=f;g=b+36|0;c[g>>2]=d;h=b+44|0;c[h>>2]=pc[c[(c[f>>2]|0)+24>>2]&127](d)|0;d=c[g>>2]|0;a[b+53|0]=(pc[c[(c[d>>2]|0)+28>>2]&127](d)|0)&1;if((c[h>>2]|0)>8){ij(1672)}else{i=e;return}}function Rd(a){a=a|0;var b=0,c=0;b=i;c=Ud(a,0)|0;i=b;return c|0}function Sd(a){a=a|0;var b=0,c=0;b=i;c=Ud(a,1)|0;i=b;return c|0}function Td(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;l=(a[k]|0)!=0;if((d|0)==-1){if(l){m=-1;i=e;return m|0}n=c[b+48>>2]|0;a[k]=(n|0)!=-1|0;m=n;i=e;return m|0}n=b+48|0;a:do{if(l){a[h]=c[n>>2];o=c[b+36>>2]|0;p=f;q=uc[c[(c[o>>2]|0)+12>>2]&15](o,c[b+40>>2]|0,h,h+1|0,j,p,f+8|0,g)|0;if((q|0)==1|(q|0)==2){m=-1;i=e;return m|0}else if((q|0)==3){a[p]=c[n>>2];c[g>>2]=f+1}q=b+32|0;while(1){o=c[g>>2]|0;if(!(o>>>0>p>>>0)){break a}r=o+ -1|0;c[g>>2]=r;if((Qb(a[r]|0,c[q>>2]|0)|0)==-1){m=-1;break}}i=e;return m|0}}while(0);c[n>>2]=d;a[k]=1;m=d;i=e;return m|0}function Ud(b,e){b=b|0;e=e|0;var f=0,g=0,h=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;f=i;i=i+32|0;g=f;h=f+8|0;j=f+16|0;k=f+24|0;l=b+52|0;if((a[l]|0)!=0){m=b+48|0;n=c[m>>2]|0;if(!e){o=n;i=f;return o|0}c[m>>2]=-1;a[l]=0;o=n;i=f;return o|0}n=c[b+44>>2]|0;l=(n|0)>1?n:1;a:do{if((l|0)>0){n=b+32|0;m=0;while(1){p=Jb(c[n>>2]|0)|0;if((p|0)==-1){o=-1;break}a[g+m|0]=p;m=m+1|0;if((m|0)>=(l|0)){break a}}i=f;return o|0}}while(0);b:do{if((a[b+53|0]|0)==0){m=b+40|0;n=b+36|0;p=g;q=h+1|0;r=b+32|0;s=l;while(1){t=c[m>>2]|0;u=t;v=c[u>>2]|0;w=c[u+4>>2]|0;u=c[n>>2]|0;x=g+s|0;y=uc[c[(c[u>>2]|0)+16>>2]&15](u,t,p,x,j,h,q,k)|0;if((y|0)==3){z=14;break}else if((y|0)==2){o=-1;z=23;break}else if((y|0)!=1){A=s;break b}y=c[m>>2]|0;c[y>>2]=v;c[y+4>>2]=w;if((s|0)==8){o=-1;z=23;break}w=Jb(c[r>>2]|0)|0;if((w|0)==-1){o=-1;z=23;break}a[x]=w;s=s+1|0}if((z|0)==14){a[h]=a[p]|0;A=s;break}else if((z|0)==23){i=f;return o|0}}else{a[h]=a[g]|0;A=l}}while(0);do{if(e){l=a[h]|0;c[b+48>>2]=l&255;B=l}else{l=b+32|0;k=A;while(1){if((k|0)<=0){z=21;break}j=k+ -1|0;if((Qb(d[g+j|0]|0,c[l>>2]|0)|0)==-1){o=-1;z=23;break}else{k=j}}if((z|0)==21){B=a[h]|0;break}else if((z|0)==23){i=f;return o|0}}}while(0);o=B&255;i=f;return o|0}function Vd(){var a=0;a=i;rd(0);gc(117,1096,q|0)|0;i=a;return}function Wd(a){a=a|0;i=i;return}function Xd(a){a=a|0;var b=0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;i=i;return}function Yd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;c[d>>2]=e+ -1;if((e|0)!=0){f=0;i=b;return f|0}mc[c[(c[a>>2]|0)+8>>2]&255](a);f=1;i=b;return f|0}function Zd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a>>2]=1976;e=on(b|0)|0;f=Qm(e+13|0)|0;c[f+4>>2]=e;c[f>>2]=e;g=f+12|0;c[a+4>>2]=g;c[f+8>>2]=0;mn(g|0,b|0,e+1|0)|0;i=d;return}function _d(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=1976;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Sm((c[d>>2]|0)+ -12|0)}Ta(a|0);Rm(a);i=b;return}function $d(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=1976;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)>=0){g=a;Ta(g|0);i=b;return}Sm((c[d>>2]|0)+ -12|0);g=a;Ta(g|0);i=b;return}function ae(a){a=a|0;i=i;return c[a+4>>2]|0}function be(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;c[b>>2]=2e3;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=on(f|0)|0;g=Qm(d+13|0)|0;c[g+4>>2]=d;c[g>>2]=d;h=g+12|0;c[b+4>>2]=h;c[g+8>>2]=0;mn(h|0,f|0,d+1|0)|0;i=e;return}function ce(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a>>2]=2e3;e=on(b|0)|0;f=Qm(e+13|0)|0;c[f+4>>2]=e;c[f>>2]=e;g=f+12|0;c[a+4>>2]=g;c[f+8>>2]=0;mn(g|0,b|0,e+1|0)|0;i=d;return}function de(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=2e3;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Sm((c[d>>2]|0)+ -12|0)}Ta(a|0);Rm(a);i=b;return}function ee(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=2e3;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)>=0){g=a;Ta(g|0);i=b;return}Sm((c[d>>2]|0)+ -12|0);g=a;Ta(g|0);i=b;return}function fe(a){a=a|0;i=i;return c[a+4>>2]|0}function ge(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=1976;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Sm((c[d>>2]|0)+ -12|0)}Ta(a|0);Rm(a);i=b;return}function he(a){a=a|0;i=i;return}function ie(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=d;c[a+4>>2]=b;i=i;return}function je(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e;rc[c[(c[a>>2]|0)+12>>2]&3](f,a,b);if((c[f+4>>2]|0)!=(c[d+4>>2]|0)){g=0;i=e;return g|0}g=(c[f>>2]|0)==(c[d>>2]|0);i=e;return g|0}function ke(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((c[b+4>>2]|0)!=(a|0)){f=0;i=e;return f|0}f=(c[b>>2]|0)==(d|0);i=e;return f|0}function le(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;d=i;f=ec(e|0)|0;e=on(f|0)|0;if(e>>>0>4294967279){re(0)}if(e>>>0<11){a[b]=e<<1;g=b+1|0;mn(g|0,f|0,e|0)|0;h=g+e|0;a[h]=0;i=d;return}else{j=e+16&-16;k=Pm(j)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=e;g=k;mn(g|0,f|0,e|0)|0;h=g+e|0;a[h]=0;i=d;return}}function me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f;h=d;j=c[h>>2]|0;k=e;do{if((j|0)!=0){l=a[k]|0;if((l&1)==0){m=(l&255)>>>1}else{m=c[e+4>>2]|0}if((m|0)==0){n=j}else{Ce(e,2152,2)|0;n=c[h>>2]|0}l=c[d+4>>2]|0;rc[c[(c[l>>2]|0)+24>>2]&3](g,l,n);l=g;o=a[l]|0;if((o&1)==0){p=g+1|0;q=(o&255)>>>1}else{p=c[g+8>>2]|0;q=c[g+4>>2]|0}Ce(e,p,q)|0;if((a[l]&1)==0){break}Rm(c[g+8>>2]|0)}}while(0);g=b;c[g+0>>2]=c[k+0>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;i=f;return}function ne(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+32|0;g=f;h=f+16|0;j=on(e|0)|0;if(j>>>0>4294967279){re(0)}if(j>>>0<11){a[h]=j<<1;k=h+1|0}else{l=j+16&-16;m=Pm(l)|0;c[h+8>>2]=m;c[h>>2]=l|1;c[h+4>>2]=j;k=m}mn(k|0,e|0,j|0)|0;a[k+j|0]=0;me(g,d,h);be(b,g);if(!((a[g]&1)==0)){Rm(c[g+8>>2]|0)}if(!((a[h]&1)==0)){Rm(c[h+8>>2]|0)}c[b>>2]=2168;h=d;d=c[h+4>>2]|0;g=b+8|0;c[g>>2]=c[h>>2];c[g+4>>2]=d;i=f;return}function oe(a){a=a|0;var b=0;b=i;ee(a);Rm(a);i=b;return}function pe(a){a=a|0;var b=0;b=i;ee(a);i=b;return}function qe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;qb(2304)|0;if((c[a>>2]|0)==1){do{Ob(2328,2304)|0;}while((c[a>>2]|0)==1)}if((c[a>>2]|0)==0){c[a>>2]=1;Zb(2304)|0;mc[d&255](b);qb(2304)|0;c[a>>2]=-1;Zb(2304)|0;Hb(2328)|0;i=e;return}else{Zb(2304)|0;i=e;return}}function re(a){a=a|0;a=vb(8)|0;Zd(a,2376);c[a>>2]=2056;cc(a|0,2096,19)}function se(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=d;if((a[f]&1)==0){g=b;c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];i=e;return}f=c[d+8>>2]|0;g=c[d+4>>2]|0;if(g>>>0>4294967279){re(0)}if(g>>>0<11){a[b]=g<<1;h=b+1|0}else{d=g+16&-16;j=Pm(d)|0;c[b+8>>2]=j;c[b>>2]=d|1;c[b+4>>2]=g;h=j}mn(h|0,f|0,g|0)|0;a[h+g|0]=0;i=e;return}function te(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(e>>>0>4294967279){re(0)}if(e>>>0<11){a[b]=e<<1;g=b+1|0}else{h=e+16&-16;j=Pm(h)|0;c[b+8>>2]=j;c[b>>2]=h|1;c[b+4>>2]=e;g=j}mn(g|0,d|0,e|0)|0;a[g+e|0]=0;i=f;return}function ue(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(d>>>0>4294967279){re(0)}if(d>>>0<11){a[b]=d<<1;g=b+1|0}else{h=d+16&-16;j=Pm(h)|0;c[b+8>>2]=j;c[b>>2]=h|1;c[b+4>>2]=d;g=j}jn(g|0,e|0,d|0)|0;a[g+d|0]=0;i=f;return}function ve(b){b=b|0;var d=0;d=i;if((a[b]&1)==0){i=d;return}Rm(c[b+8>>2]|0);i=d;return}function we(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;if((b|0)==(d|0)){i=e;return b|0}f=a[d]|0;if((f&1)==0){g=d+1|0;h=(f&255)>>>1}else{g=c[d+8>>2]|0;h=c[d+4>>2]|0}d=b;f=a[d]|0;if((f&1)==0){j=f;k=10}else{f=c[b>>2]|0;j=f&255;k=(f&-2)+ -1|0}f=(j&1)==0;if(k>>>0<h>>>0){if(f){l=(j&255)>>>1}else{l=c[b+4>>2]|0}De(b,k,h-k|0,l,0,l,h,g);i=e;return b|0}if(f){m=b+1|0}else{m=c[b+8>>2]|0}nn(m|0,g|0,h|0)|0;a[m+h|0]=0;if((a[d]&1)==0){a[d]=h<<1;i=e;return b|0}else{c[b+4>>2]=h;i=e;return b|0}return 0}function xe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=on(d|0)|0;g=b;h=a[g]|0;if((h&1)==0){j=h;k=10}else{h=c[b>>2]|0;j=h&255;k=(h&-2)+ -1|0}h=(j&1)==0;if(k>>>0<f>>>0){if(h){l=(j&255)>>>1}else{l=c[b+4>>2]|0}De(b,k,f-k|0,l,0,l,f,d);i=e;return b|0}if(h){m=b+1|0}else{m=c[b+8>>2]|0}nn(m|0,d|0,f|0)|0;a[m+f|0]=0;if((a[g]&1)==0){a[g]=f<<1;i=e;return b|0}else{c[b+4>>2]=f;i=e;return b|0}return 0}function ye(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=b;h=a[g]|0;j=(h&1)==0;if(j){k=(h&255)>>>1}else{k=c[b+4>>2]|0}if(k>>>0<d>>>0){ze(b,d-k|0,e)|0;i=f;return}if(j){a[b+d+1|0]=0;a[g]=d<<1;i=f;return}else{a[(c[b+8>>2]|0)+d|0]=0;c[b+4>>2]=d;i=f;return}}function ze(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((d|0)==0){i=f;return b|0}g=b;h=a[g]|0;if((h&1)==0){j=h;k=10}else{h=c[b>>2]|0;j=h&255;k=(h&-2)+ -1|0}if((j&1)==0){l=(j&255)>>>1}else{l=c[b+4>>2]|0}if((k-l|0)>>>0<d>>>0){Ee(b,k,d-k+l|0,l,l,0,0);m=a[g]|0}else{m=j}if((m&1)==0){n=b+1|0}else{n=c[b+8>>2]|0}jn(n+l|0,e|0,d|0)|0;e=l+d|0;if((a[g]&1)==0){a[g]=e<<1}else{c[b+4>>2]=e}a[n+e|0]=0;i=f;return b|0}function Ae(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if(d>>>0>4294967279){re(0)}f=b;g=a[f]|0;if((g&1)==0){h=g;j=10}else{g=c[b>>2]|0;h=g&255;j=(g&-2)+ -1|0}if((h&1)==0){k=(h&255)>>>1}else{k=c[b+4>>2]|0}g=k>>>0>d>>>0?k:d;if(g>>>0<11){l=10}else{l=(g+16&-16)+ -1|0}if((l|0)==(j|0)){i=e;return}do{if((l|0)==10){m=b+1|0;n=0;o=c[b+8>>2]|0;p=1}else{g=l+1|0;if(l>>>0>j>>>0){q=Pm(g)|0}else{q=Pm(g)|0}if((h&1)==0){m=q;n=1;o=b+1|0;p=0;break}else{m=q;n=1;o=c[b+8>>2]|0;p=1;break}}}while(0);if((h&1)==0){r=(h&255)>>>1}else{r=c[b+4>>2]|0}mn(m|0,o|0,r+1|0)|0;if(p){Rm(o)}if(n){c[b>>2]=l+1|1;c[b+4>>2]=k;c[b+8>>2]=m;i=e;return}else{a[f]=k<<1;i=e;return}}function Be(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b;g=a[f]|0;h=(g&1)!=0;if(h){j=(c[b>>2]&-2)+ -1|0;k=c[b+4>>2]|0}else{j=10;k=(g&255)>>>1}if((k|0)==(j|0)){Ee(b,j,1,j,j,0,0);if((a[f]&1)==0){l=7}else{l=8}}else{if(h){l=8}else{l=7}}if((l|0)==7){a[f]=(k<<1)+2;m=b+1|0;n=k+1|0;o=m+k|0;a[o]=d;p=m+n|0;a[p]=0;i=e;return}else if((l|0)==8){l=c[b+8>>2]|0;f=k+1|0;c[b+4>>2]=f;m=l;n=f;o=m+k|0;a[o]=d;p=m+n|0;a[p]=0;i=e;return}}function Ce(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b;h=a[g]|0;if((h&1)==0){j=10;k=h}else{h=c[b>>2]|0;j=(h&-2)+ -1|0;k=h&255}if((k&1)==0){l=(k&255)>>>1}else{l=c[b+4>>2]|0}if((j-l|0)>>>0<e>>>0){De(b,j,e-j+l|0,l,l,0,e,d);i=f;return b|0}if((e|0)==0){i=f;return b|0}if((k&1)==0){m=b+1|0}else{m=c[b+8>>2]|0}mn(m+l|0,d|0,e|0)|0;d=l+e|0;if((a[g]&1)==0){a[g]=d<<1}else{c[b+4>>2]=d}a[m+d|0]=0;i=f;return b|0}function De(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((-18-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){m=b+1|0}else{m=c[b+8>>2]|0}do{if(d>>>0<2147483623){n=e+d|0;o=d<<1;p=n>>>0<o>>>0?o:n;if(p>>>0<11){q=11;break}q=p+16&-16}else{q=-17}}while(0);e=Pm(q)|0;if((g|0)!=0){mn(e|0,m|0,g|0)|0}if((j|0)!=0){mn(e+g|0,k|0,j|0)|0}k=f-h|0;if((k|0)!=(g|0)){mn(e+(j+g)|0,m+(h+g)|0,k-g|0)|0}if((d|0)==10){r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+u|0;a[w]=0;i=l;return}Rm(m);r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+u|0;a[w]=0;i=l;return}function Ee(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=i;if((-17-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){l=b+1|0}else{l=c[b+8>>2]|0}do{if(d>>>0<2147483623){m=e+d|0;n=d<<1;o=m>>>0<n>>>0?n:m;if(o>>>0<11){p=11;break}p=o+16&-16}else{p=-17}}while(0);e=Pm(p)|0;if((g|0)!=0){mn(e|0,l|0,g|0)|0}o=f-h|0;if((o|0)!=(g|0)){mn(e+(j+g)|0,l+(h+g)|0,o-g|0)|0}if((d|0)==10){q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}Rm(l);q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}function Fe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(e>>>0>1073741807){re(0)}if(e>>>0<2){a[b]=e<<1;g=b+4|0;lm(g,d,e)|0;h=g+(e<<2)|0;c[h>>2]=0;i=f;return}else{j=e+4&-4;k=Pm(j<<2)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=e;g=k;lm(g,d,e)|0;h=g+(e<<2)|0;c[h>>2]=0;i=f;return}}function Ge(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(d>>>0>1073741807){re(0)}if(d>>>0<2){a[b]=d<<1;g=b+4|0;nm(g,e,d)|0;h=g+(d<<2)|0;c[h>>2]=0;i=f;return}else{j=d+4&-4;k=Pm(j<<2)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=d;g=k;nm(g,e,d)|0;h=g+(d<<2)|0;c[h>>2]=0;i=f;return}}function He(b){b=b|0;var d=0;d=i;if((a[b]&1)==0){i=d;return}Rm(c[b+8>>2]|0);i=d;return}function Ie(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Je(a,b,km(b)|0)|0;i=c;return d|0}function Je(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b;h=a[g]|0;if((h&1)==0){j=1;k=h}else{h=c[b>>2]|0;j=(h&-2)+ -1|0;k=h&255}h=(k&1)==0;if(j>>>0<e>>>0){if(h){l=(k&255)>>>1}else{l=c[b+4>>2]|0}Me(b,j,e-j|0,l,0,l,e,d);i=f;return b|0}if(h){m=b+4|0}else{m=c[b+8>>2]|0}mm(m,d,e)|0;c[m+(e<<2)>>2]=0;if((a[g]&1)==0){a[g]=e<<1;i=f;return b|0}else{c[b+4>>2]=e;i=f;return b|0}return 0}function Ke(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if(d>>>0>1073741807){re(0)}f=b;g=a[f]|0;if((g&1)==0){h=g;j=1}else{g=c[b>>2]|0;h=g&255;j=(g&-2)+ -1|0}if((h&1)==0){k=(h&255)>>>1}else{k=c[b+4>>2]|0}g=k>>>0>d>>>0?k:d;if(g>>>0<2){l=1}else{l=(g+4&-4)+ -1|0}if((l|0)==(j|0)){i=e;return}do{if((l|0)==1){m=b+4|0;n=0;o=c[b+8>>2]|0;p=1}else{g=(l<<2)+4|0;if(l>>>0>j>>>0){q=Pm(g)|0}else{q=Pm(g)|0}g=q;if((h&1)==0){m=g;n=1;o=b+4|0;p=0;break}else{m=g;n=1;o=c[b+8>>2]|0;p=1;break}}}while(0);if((h&1)==0){r=(h&255)>>>1}else{r=c[b+4>>2]|0}lm(m,o,r+1|0)|0;if(p){Rm(o)}if(n){c[b>>2]=l+1|1;c[b+4>>2]=k;c[b+8>>2]=m;i=e;return}else{a[f]=k<<1;i=e;return}}function Le(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b;g=a[f]|0;h=(g&1)!=0;if(h){j=(c[b>>2]&-2)+ -1|0;k=c[b+4>>2]|0}else{j=1;k=(g&255)>>>1}if((k|0)==(j|0)){Ne(b,j,1,j,j,0,0);if((a[f]&1)==0){l=7}else{l=8}}else{if(h){l=8}else{l=7}}if((l|0)==7){a[f]=(k<<1)+2;m=b+4|0;n=k+1|0;o=m+(k<<2)|0;c[o>>2]=d;p=m+(n<<2)|0;c[p>>2]=0;i=e;return}else if((l|0)==8){l=c[b+8>>2]|0;f=k+1|0;c[b+4>>2]=f;m=l;n=f;o=m+(k<<2)|0;c[o>>2]=d;p=m+(n<<2)|0;c[p>>2]=0;i=e;return}}function Me(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((1073741806-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){m=b+4|0}else{m=c[b+8>>2]|0}do{if(d>>>0<536870887){n=e+d|0;o=d<<1;p=n>>>0<o>>>0?o:n;if(p>>>0<2){q=2;break}q=p+4&-4}else{q=1073741807}}while(0);e=Pm(q<<2)|0;if((g|0)!=0){lm(e,m,g)|0}if((j|0)!=0){lm(e+(g<<2)|0,k,j)|0}k=f-h|0;if((k|0)!=(g|0)){lm(e+(j+g<<2)|0,m+(h+g<<2)|0,k-g|0)|0}if((d|0)==1){r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+(u<<2)|0;c[w>>2]=0;i=l;return}Rm(m);r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+(u<<2)|0;c[w>>2]=0;i=l;return}function Ne(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=i;if((1073741807-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){l=b+4|0}else{l=c[b+8>>2]|0}do{if(d>>>0<536870887){m=e+d|0;n=d<<1;o=m>>>0<n>>>0?n:m;if(o>>>0<2){p=2;break}p=o+4&-4}else{p=1073741807}}while(0);e=Pm(p<<2)|0;if((g|0)!=0){lm(e,l,g)|0}o=f-h|0;if((o|0)!=(g|0)){lm(e+(j+g<<2)|0,l+(h+g<<2)|0,o-g|0)|0}if((d|0)==1){q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}Rm(l);q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}function Oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=e+8|0;h=(c[b+24>>2]|0)==0;if(h){c[b+16>>2]=d|1}else{c[b+16>>2]=d}if(((h&1|d)&c[b+20>>2]|0)==0){i=e;return}e=vb(16)|0;do{if((a[2744]|0)==0){if((Ga(2744)|0)==0){break}c[684]=3440;gc(46,2736,q|0)|0;cb(2744)}}while(0);b=e;d=g;c[d>>2]=1;c[d+4>>2]=2736;d=f;h=g;c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];ne(b,f,2792);c[e>>2]=2760;cc(e|0,2840,42)}function Pe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=2784;d=c[a+40>>2]|0;e=a+32|0;f=a+36|0;if((d|0)!=0){g=d;do{g=g+ -1|0;rc[c[(c[e>>2]|0)+(g<<2)>>2]&3](0,a,c[(c[f>>2]|0)+(g<<2)>>2]|0);}while((g|0)!=0)}Zj(a+28|0);Lm(c[e>>2]|0);Lm(c[f>>2]|0);Lm(c[a+48>>2]|0);Lm(c[a+60>>2]|0);i=b;return}function Qe(a,b){a=a|0;b=b|0;var c=0;c=i;Yj(a,b+28|0);i=c;return}function Re(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a+24>>2]=b;c[a+16>>2]=(b|0)==0;c[a+20>>2]=0;c[a+4>>2]=4098;c[a+12>>2]=0;c[a+8>>2]=6;b=a+28|0;e=a+32|0;a=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(a|0));Xj(b);i=d;return}function Se(a){a=a|0;var b=0;b=i;c[a>>2]=2400;Zj(a+4|0);Rm(a);i=b;return}function Te(a){a=a|0;var b=0;b=i;c[a>>2]=2400;Zj(a+4|0);i=b;return}function Ue(a,b){a=a|0;b=b|0;i=i;return}function Ve(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return a|0}function We(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=a;c[g>>2]=0;c[g+4>>2]=0;g=a+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=i;return}function Xe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=a;c[e>>2]=0;c[e+4>>2]=0;e=a+8|0;c[e>>2]=-1;c[e+4>>2]=-1;i=i;return}function Ye(a){a=a|0;i=i;return 0}function Ze(a){a=a|0;i=i;return 0}function _e(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b;if((e|0)<=0){h=0;i=f;return h|0}j=b+12|0;k=b+16|0;l=d;d=0;while(1){m=c[j>>2]|0;if(m>>>0<(c[k>>2]|0)>>>0){c[j>>2]=m+1;n=a[m]|0}else{m=pc[c[(c[g>>2]|0)+40>>2]&127](b)|0;if((m|0)==-1){h=d;o=8;break}n=m&255}a[l]=n;m=d+1|0;if((m|0)<(e|0)){l=l+1|0;d=m}else{h=m;o=8;break}}if((o|0)==8){i=f;return h|0}return 0}function $e(a){a=a|0;i=i;return-1}function af(a){a=a|0;var b=0,e=0,f=0;b=i;if((pc[c[(c[a>>2]|0)+36>>2]&127](a)|0)==-1){e=-1;i=b;return e|0}f=a+12|0;a=c[f>>2]|0;c[f>>2]=a+1;e=d[a]|0;i=b;return e|0}function bf(a,b){a=a|0;b=b|0;i=i;return-1}function cf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=b;if((f|0)<=0){j=0;i=g;return j|0}k=b+24|0;l=b+28|0;m=e;e=0;while(1){n=c[k>>2]|0;if(n>>>0<(c[l>>2]|0)>>>0){o=a[m]|0;c[k>>2]=n+1;a[n]=o}else{if((yc[c[(c[h>>2]|0)+52>>2]&31](b,d[m]|0)|0)==-1){j=e;p=7;break}}o=e+1|0;if((o|0)<(f|0)){m=m+1|0;e=o}else{j=o;p=7;break}}if((p|0)==7){i=g;return j|0}return 0}function df(a,b){a=a|0;b=b|0;i=i;return-1}function ef(a){a=a|0;var b=0;b=i;c[a>>2]=2464;Zj(a+4|0);Rm(a);i=b;return}function ff(a){a=a|0;var b=0;b=i;c[a>>2]=2464;Zj(a+4|0);i=b;return}function gf(a,b){a=a|0;b=b|0;i=i;return}function hf(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return a|0}function jf(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=a;c[g>>2]=0;c[g+4>>2]=0;g=a+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=i;return}function kf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=a;c[e>>2]=0;c[e+4>>2]=0;e=a+8|0;c[e>>2]=-1;c[e+4>>2]=-1;i=i;return}function lf(a){a=a|0;i=i;return 0}function mf(a){a=a|0;i=i;return 0}function nf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a;if((d|0)<=0){g=0;i=e;return g|0}h=a+12|0;j=a+16|0;k=b;b=0;while(1){l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){c[h>>2]=l+4;m=c[l>>2]|0}else{l=pc[c[(c[f>>2]|0)+40>>2]&127](a)|0;if((l|0)==-1){g=b;n=8;break}else{m=l}}c[k>>2]=m;l=b+1|0;if((l|0)>=(d|0)){g=l;n=8;break}k=k+4|0;b=l}if((n|0)==8){i=e;return g|0}return 0}function of(a){a=a|0;i=i;return-1}function pf(a){a=a|0;var b=0,d=0,e=0;b=i;if((pc[c[(c[a>>2]|0)+36>>2]&127](a)|0)==-1){d=-1;i=b;return d|0}e=a+12|0;a=c[e>>2]|0;c[e>>2]=a+4;d=c[a>>2]|0;i=b;return d|0}function qf(a,b){a=a|0;b=b|0;i=i;return-1}function rf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a;if((d|0)<=0){g=0;i=e;return g|0}h=a+24|0;j=a+28|0;k=b;b=0;while(1){l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){m=c[k>>2]|0;c[h>>2]=l+4;c[l>>2]=m}else{if((yc[c[(c[f>>2]|0)+52>>2]&31](a,c[k>>2]|0)|0)==-1){g=b;n=8;break}}m=b+1|0;if((m|0)>=(d|0)){g=m;n=8;break}k=k+4|0;b=m}if((n|0)==8){i=e;return g|0}return 0}function sf(a,b){a=a|0;b=b|0;i=i;return-1}function tf(a){a=a|0;var b=0;b=i;Pe(a+8|0);Rm(a);i=b;return}function uf(a){a=a|0;var b=0;b=i;Pe(a+8|0);i=b;return}function vf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Pe(d+(e+8)|0);Rm(d+e|0);i=b;return}function wf(a){a=a|0;var b=0;b=i;Pe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+8)|0);i=b;return}function xf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d;f=b;g=c[(c[f>>2]|0)+ -12>>2]|0;h=b;if((c[h+(g+24)>>2]|0)==0){i=d;return b|0}j=e;a[j]=0;c[e+4>>2]=b;do{if((c[h+(g+16)>>2]|0)==0){k=c[h+(g+72)>>2]|0;if((k|0)==0){l=g}else{xf(k)|0;l=c[(c[f>>2]|0)+ -12>>2]|0}a[j]=1;k=c[h+(l+24)>>2]|0;if(!((pc[c[(c[k>>2]|0)+24>>2]&127](k)|0)==-1)){break}k=c[(c[f>>2]|0)+ -12>>2]|0;Oe(h+k|0,c[h+(k+16)>>2]|1)}}while(0);If(e);i=d;return b|0}function yf(a){a=a|0;var b=0;b=a+16|0;c[b>>2]=c[b>>2]|1;if((c[a+20>>2]&1|0)==0){i=i;return}else{Wa()}}function zf(a){a=a|0;var b=0;b=i;Pe(a+8|0);Rm(a);i=b;return}function Af(a){a=a|0;var b=0;b=i;Pe(a+8|0);i=b;return}function Bf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Pe(d+(e+8)|0);Rm(d+e|0);i=b;return}function Cf(a){a=a|0;var b=0;b=i;Pe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+8)|0);i=b;return}function Df(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d;f=b;g=c[(c[f>>2]|0)+ -12>>2]|0;h=b;if((c[h+(g+24)>>2]|0)==0){i=d;return b|0}j=e;a[j]=0;c[e+4>>2]=b;do{if((c[h+(g+16)>>2]|0)==0){k=c[h+(g+72)>>2]|0;if((k|0)==0){l=g}else{Df(k)|0;l=c[(c[f>>2]|0)+ -12>>2]|0}a[j]=1;k=c[h+(l+24)>>2]|0;if(!((pc[c[(c[k>>2]|0)+24>>2]&127](k)|0)==-1)){break}k=c[(c[f>>2]|0)+ -12>>2]|0;Oe(h+k|0,c[h+(k+16)>>2]|1)}}while(0);Pf(e);i=d;return b|0}function Ef(a){a=a|0;var b=0;b=i;Pe(a+4|0);Rm(a);i=b;return}function Ff(a){a=a|0;var b=0;b=i;Pe(a+4|0);i=b;return}function Gf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Pe(d+(e+4)|0);Rm(d+e|0);i=b;return}function Hf(a){a=a|0;var b=0;b=i;Pe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+4)|0);i=b;return}function If(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;a=c[d>>2]|0;e=c[(c[a>>2]|0)+ -12>>2]|0;f=a;if((c[f+(e+24)>>2]|0)==0){i=b;return}if((c[f+(e+16)>>2]|0)!=0){i=b;return}if((c[f+(e+4)>>2]&8192|0)==0){i=b;return}if(Ia()|0){i=b;return}e=c[d>>2]|0;f=c[e+((c[(c[e>>2]|0)+ -12>>2]|0)+24)>>2]|0;if(!((pc[c[(c[f>>2]|0)+24>>2]&127](f)|0)==-1)){i=b;return}f=c[d>>2]|0;d=c[(c[f>>2]|0)+ -12>>2]|0;e=f;Oe(e+d|0,c[e+(d+16)>>2]|1);i=b;return}function Jf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+48|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=j;a[m]=0;c[j+4>>2]=b;n=b;o=c[(c[n>>2]|0)+ -12>>2]|0;p=b;if((c[p+(o+16)>>2]|0)!=0){If(j);i=e;return b|0}q=c[p+(o+72)>>2]|0;if((q|0)==0){r=o}else{xf(q)|0;r=c[(c[n>>2]|0)+ -12>>2]|0}a[m]=1;Yj(k,p+(r+28)|0);r=_j(k,3848)|0;m=r;Zj(k);k=c[(c[n>>2]|0)+ -12>>2]|0;q=c[p+(k+24)>>2]|0;o=p+(k+76)|0;s=c[o>>2]|0;if((s|0)==-1){Yj(h,p+(k+28)|0);t=_j(h,5128)|0;u=yc[c[(c[t>>2]|0)+28>>2]&31](t,32)|0;Zj(h);h=u<<24>>24;c[o>>2]=h;v=h}else{v=s}s=v&255;v=p+k|0;k=c[(c[r>>2]|0)+24>>2]|0;c[g>>2]=q;q=f;r=g;c[q+0>>2]=c[r+0>>2];xc[k&31](l,m,f,v,s,d);if((c[l>>2]|0)!=0){If(j);i=e;return b|0}l=c[(c[n>>2]|0)+ -12>>2]|0;Oe(p+l|0,c[p+(l+16)>>2]|5);If(j);i=e;return b|0}function Kf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+48|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=j;a[m]=0;c[j+4>>2]=b;n=b;o=c[(c[n>>2]|0)+ -12>>2]|0;p=b;if((c[p+(o+16)>>2]|0)!=0){If(j);i=e;return b|0}q=c[p+(o+72)>>2]|0;if((q|0)==0){r=o}else{xf(q)|0;r=c[(c[n>>2]|0)+ -12>>2]|0}a[m]=1;Yj(k,p+(r+28)|0);r=_j(k,3848)|0;m=r;Zj(k);k=c[(c[n>>2]|0)+ -12>>2]|0;q=c[p+(k+24)>>2]|0;o=p+(k+76)|0;s=c[o>>2]|0;if((s|0)==-1){Yj(h,p+(k+28)|0);t=_j(h,5128)|0;u=yc[c[(c[t>>2]|0)+28>>2]&31](t,32)|0;Zj(h);h=u<<24>>24;c[o>>2]=h;v=h}else{v=s}s=v&255;v=p+k|0;k=c[(c[r>>2]|0)+24>>2]|0;c[g>>2]=q;q=f;r=g;c[q+0>>2]=c[r+0>>2];xc[k&31](l,m,f,v,s,d);if((c[l>>2]|0)!=0){If(j);i=e;return b|0}l=c[(c[n>>2]|0)+ -12>>2]|0;Oe(p+l|0,c[p+(l+16)>>2]|5);If(j);i=e;return b|0}function Lf(a){a=a|0;var b=0;b=i;Pe(a+4|0);Rm(a);i=b;return}function Mf(a){a=a|0;var b=0;b=i;Pe(a+4|0);i=b;return}function Nf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Pe(d+(e+4)|0);Rm(d+e|0);i=b;return}function Of(a){a=a|0;var b=0;b=i;Pe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+4)|0);i=b;return}function Pf(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;a=c[d>>2]|0;e=c[(c[a>>2]|0)+ -12>>2]|0;f=a;if((c[f+(e+24)>>2]|0)==0){i=b;return}if((c[f+(e+16)>>2]|0)!=0){i=b;return}if((c[f+(e+4)>>2]&8192|0)==0){i=b;return}if(Ia()|0){i=b;return}e=c[d>>2]|0;f=c[e+((c[(c[e>>2]|0)+ -12>>2]|0)+24)>>2]|0;if(!((pc[c[(c[f>>2]|0)+24>>2]&127](f)|0)==-1)){i=b;return}f=c[d>>2]|0;d=c[(c[f>>2]|0)+ -12>>2]|0;e=f;Oe(e+d|0,c[e+(d+16)>>2]|1);i=b;return}function Qf(a){a=a|0;i=i;return 2680}function Rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;if((c|0)==1){te(a,2696,35);i=d;return}else{le(a,b,c);i=d;return}}function Sf(a){a=a|0;i=i;return}function Tf(a){a=a|0;var b=0;b=i;pe(a);Rm(a);i=b;return}function Uf(a){a=a|0;var b=0;b=i;pe(a);i=b;return}function Vf(a){a=a|0;var b=0;b=i;Pe(a);Rm(a);i=b;return}function Wf(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Xf(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Yf(a){a=a|0;i=i;return}function Zf(a){a=a|0;i=i;return}function _f(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,j=0,k=0,l=0,m=0,n=0;b=i;a:do{if((e|0)==(f|0)){g=c;h=6}else{j=e;k=c;while(1){if((k|0)==(d|0)){l=-1;break a}m=a[k]|0;n=a[j]|0;if(m<<24>>24<n<<24>>24){l=-1;break a}if(n<<24>>24<m<<24>>24){l=1;break a}m=k+1|0;n=j+1|0;if((n|0)==(f|0)){g=m;h=6;break}else{j=n;k=m}}}}while(0);if((h|0)==6){l=(g|0)!=(d|0)|0}i=b;return l|0}function $f(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;g=e;h=f-g|0;if(h>>>0>4294967279){re(b)}if(h>>>0<11){a[b]=h<<1;j=b+1|0}else{k=h+16&-16;l=Pm(k)|0;c[b+8>>2]=l;c[b>>2]=k|1;c[b+4>>2]=h;j=l}if((e|0)==(f|0)){m=j;a[m]=0;i=d;return}else{n=e;o=j}while(1){a[o]=a[n]|0;e=n+1|0;if((e|0)==(f|0)){break}else{o=o+1|0;n=e}}m=j+(f+(0-g))|0;a[m]=0;i=d;return}function ag(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;b=i;if((c|0)==(d|0)){e=0;i=b;return e|0}else{f=0;g=c}while(1){c=(a[g]|0)+(f<<4)|0;h=c&-268435456;j=(h>>>24|h)^c;c=g+1|0;if((c|0)==(d|0)){e=j;break}else{g=c;f=j}}i=b;return e|0}function bg(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function cg(a){a=a|0;i=i;return}function dg(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,j=0,k=0,l=0,m=0,n=0;a=i;a:do{if((e|0)==(f|0)){g=b;h=6}else{j=e;k=b;while(1){if((k|0)==(d|0)){l=-1;break a}m=c[k>>2]|0;n=c[j>>2]|0;if((m|0)<(n|0)){l=-1;break a}if((n|0)<(m|0)){l=1;break a}m=k+4|0;n=j+4|0;if((n|0)==(f|0)){g=m;h=6;break}else{j=n;k=m}}}}while(0);if((h|0)==6){l=(g|0)!=(d|0)|0}i=a;return l|0}function eg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;d=i;g=e;h=f-g|0;j=h>>2;if(j>>>0>1073741807){re(b)}if(j>>>0<2){a[b]=h>>>1;k=b+4|0}else{h=j+4&-4;l=Pm(h<<2)|0;c[b+8>>2]=l;c[b>>2]=h|1;c[b+4>>2]=j;k=l}if((e|0)==(f|0)){m=k;c[m>>2]=0;i=d;return}l=f+ -4+(0-g)|0;g=e;e=k;while(1){c[e>>2]=c[g>>2];j=g+4|0;if((j|0)==(f|0)){break}else{e=e+4|0;g=j}}m=k+((l>>>2)+1<<2)|0;c[m>>2]=0;i=d;return}function fg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;a=i;if((b|0)==(d|0)){e=0;i=a;return e|0}else{f=0;g=b}while(1){b=(c[g>>2]|0)+(f<<4)|0;h=b&-268435456;j=(h>>>24|h)^b;b=g+4|0;if((b|0)==(d|0)){e=j;break}else{g=b;f=j}}i=a;return e|0}function gg(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function hg(a){a=a|0;i=i;return}function ig(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+136|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=k+40|0;q=k+56|0;r=k+64|0;s=k+72|0;t=k+80|0;u=k+88|0;v=k+96|0;w=k+104|0;x=k+128|0;if((c[g+4>>2]&1|0)==0){c[q>>2]=-1;y=c[(c[d>>2]|0)+16>>2]|0;z=e;c[s>>2]=c[z>>2];c[t>>2]=c[f>>2];A=n;B=s;c[A+0>>2]=c[B+0>>2];B=m;A=t;c[B+0>>2]=c[A+0>>2];kc[y&63](r,d,n,m,g,h,q);m=c[r>>2]|0;c[z>>2]=m;z=c[q>>2]|0;if((z|0)==0){a[j]=0}else if((z|0)==1){a[j]=1}else{a[j]=1;c[h>>2]=4}c[b>>2]=m;i=k;return}Qe(u,g);m=u;u=c[m>>2]|0;if(!((c[1282]|0)==-1)){c[p>>2]=5128;c[p+4>>2]=118;c[p+8>>2]=0;qe(5128,p,119)}p=(c[5132>>2]|0)+ -1|0;z=c[u+8>>2]|0;if(!((c[u+12>>2]|0)-z>>2>>>0>p>>>0)){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}u=c[z+(p<<2)>>2]|0;if((u|0)==0){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}C=u;Yd(c[m>>2]|0)|0;Qe(v,g);g=v;v=c[g>>2]|0;if(!((c[1318]|0)==-1)){c[o>>2]=5272;c[o+4>>2]=118;c[o+8>>2]=0;qe(5272,o,119)}o=(c[5276>>2]|0)+ -1|0;m=c[v+8>>2]|0;if(!((c[v+12>>2]|0)-m>>2>>>0>o>>>0)){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}v=c[m+(o<<2)>>2]|0;if((v|0)==0){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}E=v;Yd(c[g>>2]|0)|0;g=w;F=v;nc[c[(c[F>>2]|0)+24>>2]&63](g,E);nc[c[(c[F>>2]|0)+28>>2]&63](w+12|0,E);c[x>>2]=c[f>>2];f=w+24|0;E=l;F=x;c[E+0>>2]=c[F+0>>2];F=jg(e,l,g,f,C,h,1)|0;a[j]=(F|0)==(g|0)|0;c[b>>2]=c[e>>2];ve(w+12|0);ve(w);i=k;return}function jg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;l=i;i=i+104|0;m=(g-f|0)/12|0;n=l;do{if(m>>>0>100){o=Km(m)|0;if((o|0)!=0){p=o;q=o;break}Wm()}else{p=0;q=n}}while(0);n=(f|0)==(g|0);if(n){r=0;s=m}else{o=f;t=0;u=m;m=q;while(1){v=a[o]|0;if((v&1)==0){w=(v&255)>>>1}else{w=c[o+4>>2]|0}if((w|0)==0){a[m]=2;x=t+1|0;y=u+ -1|0}else{a[m]=1;x=t;y=u}v=o+12|0;if((v|0)==(g|0)){r=x;s=y;break}else{o=v;t=x;u=y;m=m+1|0}}}m=b;b=e;e=h;y=0;u=r;r=s;a:while(1){s=c[m>>2]|0;do{if((s|0)==0){z=0}else{if((c[s+12>>2]|0)!=(c[s+16>>2]|0)){z=s;break}if((pc[c[(c[s>>2]|0)+36>>2]&127](s)|0)==-1){c[m>>2]=0;z=0;break}else{z=c[m>>2]|0;break}}}while(0);s=(z|0)==0;x=c[b>>2]|0;do{if((x|0)==0){A=0}else{if((c[x+12>>2]|0)!=(c[x+16>>2]|0)){A=x;break}if(!((pc[c[(c[x>>2]|0)+36>>2]&127](x)|0)==-1)){A=x;break}c[b>>2]=0;A=0}}while(0);B=(A|0)==0;C=c[m>>2]|0;if(!((s^B)&(r|0)!=0)){break}x=c[C+12>>2]|0;if((x|0)==(c[C+16>>2]|0)){D=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{D=d[x]|0}x=D&255;if(k){E=x}else{E=yc[c[(c[e>>2]|0)+12>>2]&31](h,x)|0}x=y+1|0;if(n){y=x;r=r;u=u;continue}b:do{if(k){t=0;o=f;w=u;v=r;F=q;while(1){do{if((a[F]|0)==1){G=a[o]|0;H=(G&1)==0;if(H){I=o+1|0}else{I=c[o+8>>2]|0}if(!(E<<24>>24==(a[I+y|0]|0))){a[F]=0;J=t;K=w;L=v+ -1|0;break}if(H){M=(G&255)>>>1}else{M=c[o+4>>2]|0}if((M|0)!=(x|0)){J=1;K=w;L=v;break}a[F]=2;J=1;K=w+1|0;L=v+ -1|0}else{J=t;K=w;L=v}}while(0);G=o+12|0;if((G|0)==(g|0)){N=J;O=K;P=L;break b}t=J;o=G;w=K;v=L;F=F+1|0}}else{F=0;v=f;w=u;o=r;t=q;while(1){do{if((a[t]|0)==1){G=v;if((a[G]&1)==0){Q=v+1|0}else{Q=c[v+8>>2]|0}if(!(E<<24>>24==(yc[c[(c[e>>2]|0)+12>>2]&31](h,a[Q+y|0]|0)|0)<<24>>24)){a[t]=0;R=F;S=w;T=o+ -1|0;break}H=a[G]|0;if((H&1)==0){U=(H&255)>>>1}else{U=c[v+4>>2]|0}if((U|0)!=(x|0)){R=1;S=w;T=o;break}a[t]=2;R=1;S=w+1|0;T=o+ -1|0}else{R=F;S=w;T=o}}while(0);H=v+12|0;if((H|0)==(g|0)){N=R;O=S;P=T;break b}F=R;v=H;w=S;o=T;t=t+1|0}}}while(0);if(!N){y=x;u=O;r=P;continue}s=c[m>>2]|0;t=s+12|0;o=c[t>>2]|0;if((o|0)==(c[s+16>>2]|0)){pc[c[(c[s>>2]|0)+40>>2]&127](s)|0}else{c[t>>2]=o+1}if((P+O|0)>>>0<2){y=x;u=O;r=P;continue}else{V=f;W=O;X=q}while(1){do{if((a[X]|0)==2){o=a[V]|0;if((o&1)==0){Y=(o&255)>>>1}else{Y=c[V+4>>2]|0}if((Y|0)==(x|0)){Z=W;break}a[X]=0;Z=W+ -1|0}else{Z=W}}while(0);o=V+12|0;if((o|0)==(g|0)){y=x;u=Z;r=P;continue a}else{V=o;W=Z;X=X+1|0}}}do{if((C|0)==0){_=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){_=C;break}if((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1){c[m>>2]=0;_=0;break}else{_=c[m>>2]|0;break}}}while(0);m=(_|0)==0;do{if(B){$=78}else{if((c[A+12>>2]|0)!=(c[A+16>>2]|0)){if(m){break}else{$=80;break}}if((pc[c[(c[A>>2]|0)+36>>2]&127](A)|0)==-1){c[b>>2]=0;$=78;break}else{if(m){break}else{$=80;break}}}}while(0);if(($|0)==78){if(m){$=80}}if(($|0)==80){c[j>>2]=c[j>>2]|2}c:do{if(n){$=85}else{if((a[q]|0)==2){aa=f;break}else{ba=f;ca=q}while(1){m=ba+12|0;b=ca+1|0;if((m|0)==(g|0)){$=85;break c}if((a[b]|0)==2){aa=m;break}else{ca=b;ba=m}}}}while(0);if(($|0)==85){c[j>>2]=c[j>>2]|4;aa=g}if((p|0)==0){i=l;return aa|0}Lm(p);i=l;return aa|0}function kg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];lg(a,0,k,j,f,g,h);i=b;return}function lg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==0){u=0}else if((t|0)==8){u=16}else if((t|0)==64){u=8}else{u=10}t=l;bh(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((pc[c[(c[m>>2]|0)+36>>2]&127](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}ye(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}ye(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{Q=d[I]|0}if((Dg(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){pc[c[(c[C>>2]|0)+40>>2]&127](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Vl(H,c[p>>2]|0,j,u)|0;mj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}function mg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];ng(a,0,k,j,f,g,h);i=b;return}function ng(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;bh(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((pc[c[(c[m>>2]|0)+36>>2]&127](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){K=(D&255)>>>1}else{K=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(K|0)){if(I){L=(D&255)>>>1;M=(D&255)>>>1}else{D=c[z>>2]|0;L=D;M=D}ye(o,M<<1,0);if((a[h]&1)==0){N=10}else{N=(c[g>>2]&-2)+ -1|0}ye(o,N,0);if((a[h]&1)==0){O=v}else{O=c[w>>2]|0}c[p>>2]=O+L;P=O}else{P=B}D=C+12|0;I=c[D>>2]|0;Q=C+16|0;if((I|0)==(c[Q>>2]|0)){R=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{R=d[I]|0}if((Dg(R&255,u,P,p,s,A,n,l,r,t)|0)!=0){G=F;H=P;break}I=c[D>>2]|0;if((I|0)==(c[Q>>2]|0)){pc[c[(c[C>>2]|0)+40>>2]&127](C)|0;m=C;B=P;continue}else{c[D>>2]=I+1;m=C;B=P;continue}}P=a[n]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[n+4>>2]|0}do{if((S|0)!=0){P=c[r>>2]|0;if((P-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=P+4;c[P>>2]=B}}while(0);s=Ul(H,c[p>>2]|0,j,u)|0;u=k;c[u>>2]=s;c[u+4>>2]=J;mj(n,l,c[r>>2]|0,j);do{if((C|0)==0){T=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){T=C;break}if(!((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1)){T=C;break}c[y>>2]=0;T=0}}while(0);y=(T|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}function og(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];pg(a,0,k,j,f,g,h);i=b;return}function pg(e,f,g,h,j,k,l){e=e|0;f=f|0;g=g|0;h=h|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,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;f=i;i=i+256|0;m=f;n=f+32|0;o=f+40|0;p=f+56|0;q=f+72|0;r=f+80|0;s=f+240|0;t=f+248|0;u=c[j+4>>2]&74;if((u|0)==64){v=8}else if((u|0)==0){v=0}else if((u|0)==8){v=16}else{v=10}u=m;bh(o,j,u,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ye(p,10,0);if((a[j]&1)==0){m=p+1|0;w=m;x=p+8|0;y=m}else{m=p+8|0;w=p+1|0;x=m;y=c[m>>2]|0}c[q>>2]=y;m=r;c[s>>2]=m;c[t>>2]=0;z=g;g=h;h=p;A=p+4|0;B=a[n]|0;n=c[z>>2]|0;C=y;a:while(1){do{if((n|0)==0){D=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){D=n;break}if(!((pc[c[(c[n>>2]|0)+36>>2]&127](n)|0)==-1)){D=n;break}c[z>>2]=0;D=0}}while(0);y=(D|0)==0;E=c[g>>2]|0;do{if((E|0)==0){F=18}else{if((c[E+12>>2]|0)!=(c[E+16>>2]|0)){if(y){G=E;break}else{H=E;I=C;break a}}if((pc[c[(c[E>>2]|0)+36>>2]&127](E)|0)==-1){c[g>>2]=0;F=18;break}else{if(y){G=E;break}else{H=E;I=C;break a}}}}while(0);if((F|0)==18){F=0;if(y){H=0;I=C;break}else{G=0}}E=a[j]|0;J=(E&1)==0;if(J){K=(E&255)>>>1}else{K=c[A>>2]|0}if(((c[q>>2]|0)-C|0)==(K|0)){if(J){L=(E&255)>>>1;M=(E&255)>>>1}else{E=c[A>>2]|0;L=E;M=E}ye(p,M<<1,0);if((a[j]&1)==0){N=10}else{N=(c[h>>2]&-2)+ -1|0}ye(p,N,0);if((a[j]&1)==0){O=w}else{O=c[x>>2]|0}c[q>>2]=O+L;P=O}else{P=C}E=D+12|0;J=c[E>>2]|0;Q=D+16|0;if((J|0)==(c[Q>>2]|0)){R=pc[c[(c[D>>2]|0)+36>>2]&127](D)|0}else{R=d[J]|0}if((Dg(R&255,v,P,q,t,B,o,m,s,u)|0)!=0){H=G;I=P;break}J=c[E>>2]|0;if((J|0)==(c[Q>>2]|0)){pc[c[(c[D>>2]|0)+40>>2]&127](D)|0;n=D;C=P;continue}else{c[E>>2]=J+1;n=D;C=P;continue}}P=a[o]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[o+4>>2]|0}do{if((S|0)!=0){P=c[s>>2]|0;if((P-r|0)>=160){break}C=c[t>>2]|0;c[s>>2]=P+4;c[P>>2]=C}}while(0);b[l>>1]=Tl(I,c[q>>2]|0,k,v)|0;mj(o,m,c[s>>2]|0,k);do{if((D|0)==0){T=0}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){T=D;break}if(!((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1)){T=D;break}c[z>>2]=0;T=0}}while(0);z=(T|0)==0;do{if((H|0)==0){F=54}else{if((c[H+12>>2]|0)!=(c[H+16>>2]|0)){if(!z){break}U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}if((pc[c[(c[H>>2]|0)+36>>2]&127](H)|0)==-1){c[g>>2]=0;F=54;break}if(!(z^(H|0)==0)){break}U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}}while(0);do{if((F|0)==54){if(z){break}U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}}while(0);c[k>>2]=c[k>>2]|2;U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}function qg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];rg(a,0,k,j,f,g,h);i=b;return}function rg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;bh(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((pc[c[(c[m>>2]|0)+36>>2]&127](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}ye(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}ye(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{Q=d[I]|0}if((Dg(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){pc[c[(c[C>>2]|0)+40>>2]&127](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Sl(H,c[p>>2]|0,j,u)|0;mj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}function sg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];tg(a,0,k,j,f,g,h);i=b;return}function tg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;bh(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((pc[c[(c[m>>2]|0)+36>>2]&127](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}ye(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}ye(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{Q=d[I]|0}if((Dg(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){pc[c[(c[C>>2]|0)+40>>2]&127](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Rl(H,c[p>>2]|0,j,u)|0;mj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}function ug(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];vg(a,0,k,j,f,g,h);i=b;return}function vg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==0){u=0}else if((t|0)==64){u=8}else if((t|0)==8){u=16}else{u=10}t=l;bh(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((pc[c[(c[m>>2]|0)+36>>2]&127](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((pc[c[(c[D>>2]|0)+36>>2]&127](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){K=(D&255)>>>1}else{K=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(K|0)){if(I){L=(D&255)>>>1;M=(D&255)>>>1}else{D=c[z>>2]|0;L=D;M=D}ye(o,M<<1,0);if((a[h]&1)==0){N=10}else{N=(c[g>>2]&-2)+ -1|0}ye(o,N,0);if((a[h]&1)==0){O=v}else{O=c[w>>2]|0}c[p>>2]=O+L;P=O}else{P=B}D=C+12|0;I=c[D>>2]|0;Q=C+16|0;if((I|0)==(c[Q>>2]|0)){R=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{R=d[I]|0}if((Dg(R&255,u,P,p,s,A,n,l,r,t)|0)!=0){G=F;H=P;break}I=c[D>>2]|0;if((I|0)==(c[Q>>2]|0)){pc[c[(c[C>>2]|0)+40>>2]&127](C)|0;m=C;B=P;continue}else{c[D>>2]=I+1;m=C;B=P;continue}}P=a[n]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[n+4>>2]|0}do{if((S|0)!=0){P=c[r>>2]|0;if((P-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=P+4;c[P>>2]=B}}while(0);s=Ql(H,c[p>>2]|0,j,u)|0;u=k;c[u>>2]=s;c[u+4>>2]=J;mj(n,l,c[r>>2]|0,j);do{if((C|0)==0){T=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){T=C;break}if(!((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1)){T=C;break}c[y>>2]=0;T=0}}while(0);y=(T|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}function wg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];xg(a,0,k,j,f,g,h);i=b;return}function xg(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;ch(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ye(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=h;h=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((pc[c[(c[n>>2]|0)+36>>2]&127](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}ye(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[h>>2]&-2)+ -1|0}ye(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=pc[c[(c[F>>2]|0)+36>>2]&127](F)|0}else{T=d[L]|0}if((dh(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){pc[c[(c[F>>2]|0)+40>>2]&127](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);g[l>>2]=+Pl(K,c[q>>2]|0,k);mj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((pc[c[(c[F>>2]|0)+36>>2]&127](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}if((pc[c[(c[J>>2]|0)+36>>2]&127](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}function yg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];zg(a,0,k,j,f,g,h);i=b;return}function zg(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;ch(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ye(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=g;g=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((pc[c[(c[n>>2]|0)+36>>2]&127](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}ye(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[g>>2]&-2)+ -1|0}ye(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=pc[c[(c[F>>2]|0)+36>>2]&127](F)|0}else{T=d[L]|0}if((dh(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){pc[c[(c[F>>2]|0)+40>>2]&127](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);h[l>>3]=+Ol(K,c[q>>2]|0,k);mj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((pc[c[(c[F>>2]|0)+36>>2]&127](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}if((pc[c[(c[J>>2]|0)+36>>2]&127](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}function Ag(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Bg(a,0,k,j,f,g,h);i=b;return}function Bg(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;ch(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ye(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=g;g=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((pc[c[(c[n>>2]|0)+36>>2]&127](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((pc[c[(c[G>>2]|0)+36>>2]&127](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}ye(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[g>>2]&-2)+ -1|0}ye(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=pc[c[(c[F>>2]|0)+36>>2]&127](F)|0}else{T=d[L]|0}if((dh(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){pc[c[(c[F>>2]|0)+40>>2]&127](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);h[l>>3]=+Nl(K,c[q>>2]|0,k);mj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((pc[c[(c[F>>2]|0)+36>>2]&127](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}if((pc[c[(c[J>>2]|0)+36>>2]&127](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}function Cg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;e=i;i=i+8|0;l=e;m=i;i=i+16|0;n=i;i=i+32|0;o=i;i=i+16|0;p=i;i=i+8|0;q=i;i=i+16|0;r=i;i=i+160|0;s=o;c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;Qe(p,h);h=p;p=c[h>>2]|0;if(!((c[1282]|0)==-1)){c[m>>2]=5128;c[m+4>>2]=118;c[m+8>>2]=0;qe(5128,m,119)}m=(c[5132>>2]|0)+ -1|0;t=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-t>>2>>>0>m>>>0)){u=vb(4)|0;v=u;pm(v);cc(u|0,13088,107)}p=c[t+(m<<2)>>2]|0;if((p|0)==0){u=vb(4)|0;v=u;pm(v);cc(u|0,13088,107)}u=n;vc[c[(c[p>>2]|0)+32>>2]&7](p,3672,3698|0,u)|0;Yd(c[h>>2]|0)|0;h=q;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(q,10,0);if((a[h]&1)==0){p=q+1|0;w=p;x=q+8|0;y=p}else{p=q+8|0;w=q+1|0;x=p;y=c[p>>2]|0}p=f;f=g;g=q;v=q+4|0;m=n+24|0;t=n+25|0;z=r;A=n+26|0;B=n;n=o+4|0;C=c[p>>2]|0;D=y;E=r;r=0;F=y;a:while(1){do{if((C|0)==0){G=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){G=C;break}if(!((pc[c[(c[C>>2]|0)+36>>2]&127](C)|0)==-1)){G=C;break}c[p>>2]=0;G=0}}while(0);y=(G|0)==0;H=c[f>>2]|0;do{if((H|0)==0){I=19}else{if((c[H+12>>2]|0)!=(c[H+16>>2]|0)){if(y){break}else{J=F;break a}}if((pc[c[(c[H>>2]|0)+36>>2]&127](H)|0)==-1){c[f>>2]=0;I=19;break}else{if(y){break}else{J=F;break a}}}}while(0);if((I|0)==19){I=0;if(y){J=F;break}}H=a[h]|0;K=(H&1)==0;if(K){L=(H&255)>>>1}else{L=c[v>>2]|0}if((D-F|0)==(L|0)){if(K){M=(H&255)>>>1;N=(H&255)>>>1}else{H=c[v>>2]|0;M=H;N=H}ye(q,N<<1,0);if((a[h]&1)==0){O=10}else{O=(c[g>>2]&-2)+ -1|0}ye(q,O,0);if((a[h]&1)==0){P=w}else{P=c[x>>2]|0}Q=P+M|0;R=P}else{Q=D;R=F}H=c[G+12>>2]|0;if((H|0)==(c[G+16>>2]|0)){S=pc[c[(c[G>>2]|0)+36>>2]&127](G)|0}else{S=d[H]|0}H=S&255;K=(Q|0)==(R|0);do{if(K){T=(a[m]|0)==H<<24>>24;if(!T){if(!((a[t]|0)==H<<24>>24)){I=40;break}}a[Q]=T?43:45;U=Q+1|0;V=E;W=0}else{I=40}}while(0);do{if((I|0)==40){I=0;y=a[s]|0;if((y&1)==0){X=(y&255)>>>1}else{X=c[n>>2]|0}if((X|0)!=0&H<<24>>24==0){if((E-z|0)>=160){U=Q;V=E;W=r;break}c[E>>2]=r;U=Q;V=E+4|0;W=0;break}else{Y=u}while(1){y=Y+1|0;if((a[Y]|0)==H<<24>>24){Z=Y;break}if((y|0)==(A|0)){Z=A;break}else{Y=y}}y=Z-B|0;if((y|0)>23){J=R;break a}if((y|0)<22){a[Q]=a[3672+y|0]|0;U=Q+1|0;V=E;W=r+1|0;break}if(K){J=Q;break a}if((Q-R|0)>=3){J=R;break a}if((a[Q+ -1|0]|0)!=48){J=R;break a}a[Q]=a[3672+y|0]|0;U=Q+1|0;V=E;W=0}}while(0);K=c[p>>2]|0;H=K+12|0;y=c[H>>2]|0;if((y|0)==(c[K+16>>2]|0)){pc[c[(c[K>>2]|0)+40>>2]&127](K)|0;C=K;D=U;E=V;r=W;F=R;continue}else{c[H>>2]=y+1;C=K;D=U;E=V;r=W;F=R;continue}}a[J+3|0]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);R=c[1254]|0;c[l>>2]=k;if((Eg(J,R,3712,l)|0)!=1){c[j>>2]=4}l=c[p>>2]|0;do{if((l|0)==0){_=0}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){_=l;break}if(!((pc[c[(c[l>>2]|0)+36>>2]&127](l)|0)==-1)){_=l;break}c[p>>2]=0;_=0}}while(0);p=(_|0)==0;l=c[f>>2]|0;do{if((l|0)==0){I=72}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){if(!p){break}$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}if((pc[c[(c[l>>2]|0)+36>>2]&127](l)|0)==-1){c[f>>2]=0;I=72;break}if(!(p^(l|0)==0)){break}$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}}while(0);do{if((I|0)==72){if(p){break}$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}function Dg(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;o=c[f>>2]|0;p=(o|0)==(e|0);do{if(p){q=(a[m+24|0]|0)==b<<24>>24;if(!q){if(!((a[m+25|0]|0)==b<<24>>24)){break}}c[f>>2]=e+1;a[e]=q?43:45;c[g>>2]=0;r=0;i=n;return r|0}}while(0);q=a[j]|0;if((q&1)==0){s=(q&255)>>>1}else{s=c[j+4>>2]|0}if((s|0)!=0&b<<24>>24==h<<24>>24){h=c[l>>2]|0;if((h-k|0)>=160){r=0;i=n;return r|0}k=c[g>>2]|0;c[l>>2]=h+4;c[h>>2]=k;c[g>>2]=0;r=0;i=n;return r|0}k=m+26|0;h=m;while(1){l=h+1|0;if((a[h]|0)==b<<24>>24){t=h;break}if((l|0)==(k|0)){t=k;break}else{h=l}}h=t-m|0;if((h|0)>23){r=-1;i=n;return r|0}do{if((d|0)==10|(d|0)==8){if((h|0)<(d|0)){break}else{r=-1}i=n;return r|0}else if((d|0)==16){if((h|0)<22){break}if(p){r=-1;i=n;return r|0}if((o-e|0)>=3){r=-1;i=n;return r|0}if((a[o+ -1|0]|0)!=48){r=-1;i=n;return r|0}c[g>>2]=0;m=a[3672+h|0]|0;c[f>>2]=o+1;a[o]=m;r=0;i=n;return r|0}}while(0);e=a[3672+h|0]|0;c[f>>2]=o+1;a[o]=e;c[g>>2]=(c[g>>2]|0)+1;r=0;i=n;return r|0}function Eg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=zb(b|0)|0;b=Ea(a|0,d|0,g|0)|0;if((e|0)==0){i=f;return b|0}zb(e|0)|0;i=f;return b|0}function Fg(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Gg(a){a=a|0;i=i;return}function Hg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+136|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=k+40|0;q=k+56|0;r=k+64|0;s=k+72|0;t=k+80|0;u=k+88|0;v=k+96|0;w=k+104|0;x=k+128|0;if((c[g+4>>2]&1|0)==0){c[q>>2]=-1;y=c[(c[d>>2]|0)+16>>2]|0;z=e;c[s>>2]=c[z>>2];c[t>>2]=c[f>>2];A=n;B=s;c[A+0>>2]=c[B+0>>2];B=m;A=t;c[B+0>>2]=c[A+0>>2];kc[y&63](r,d,n,m,g,h,q);m=c[r>>2]|0;c[z>>2]=m;z=c[q>>2]|0;if((z|0)==1){a[j]=1}else if((z|0)==0){a[j]=0}else{a[j]=1;c[h>>2]=4}c[b>>2]=m;i=k;return}Qe(u,g);m=u;u=c[m>>2]|0;if(!((c[1280]|0)==-1)){c[p>>2]=5120;c[p+4>>2]=118;c[p+8>>2]=0;qe(5120,p,119)}p=(c[5124>>2]|0)+ -1|0;z=c[u+8>>2]|0;if(!((c[u+12>>2]|0)-z>>2>>>0>p>>>0)){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}u=c[z+(p<<2)>>2]|0;if((u|0)==0){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}C=u;Yd(c[m>>2]|0)|0;Qe(v,g);g=v;v=c[g>>2]|0;if(!((c[1320]|0)==-1)){c[o>>2]=5280;c[o+4>>2]=118;c[o+8>>2]=0;qe(5280,o,119)}o=(c[5284>>2]|0)+ -1|0;m=c[v+8>>2]|0;if(!((c[v+12>>2]|0)-m>>2>>>0>o>>>0)){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}v=c[m+(o<<2)>>2]|0;if((v|0)==0){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}E=v;Yd(c[g>>2]|0)|0;g=w;F=v;nc[c[(c[F>>2]|0)+24>>2]&63](g,E);nc[c[(c[F>>2]|0)+28>>2]&63](w+12|0,E);c[x>>2]=c[f>>2];f=w+24|0;E=l;F=x;c[E+0>>2]=c[F+0>>2];F=Ig(e,l,g,f,C,h,1)|0;a[j]=(F|0)==(g|0)|0;c[b>>2]=c[e>>2];He(w+12|0);He(w);i=k;return}function Ig(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;k=i;i=i+104|0;l=(f-e|0)/12|0;m=k;do{if(l>>>0>100){n=Km(l)|0;if((n|0)!=0){o=n;p=n;break}Wm()}else{o=0;p=m}}while(0);m=(e|0)==(f|0);if(m){q=0;r=l}else{n=e;s=0;t=l;l=p;while(1){u=a[n]|0;if((u&1)==0){v=(u&255)>>>1}else{v=c[n+4>>2]|0}if((v|0)==0){a[l]=2;w=s+1|0;x=t+ -1|0}else{a[l]=1;w=s;x=t}u=n+12|0;if((u|0)==(f|0)){q=w;r=x;break}else{n=u;s=w;t=x;l=l+1|0}}}l=b;b=d;d=g;x=0;t=q;q=r;a:while(1){r=c[l>>2]|0;do{if((r|0)==0){y=1}else{w=c[r+12>>2]|0;if((w|0)==(c[r+16>>2]|0)){z=pc[c[(c[r>>2]|0)+36>>2]&127](r)|0}else{z=c[w>>2]|0}if((z|0)==-1){c[l>>2]=0;y=1;break}else{y=(c[l>>2]|0)==0;break}}}while(0);r=c[b>>2]|0;do{if((r|0)==0){A=0;B=1}else{w=c[r+12>>2]|0;if((w|0)==(c[r+16>>2]|0)){C=pc[c[(c[r>>2]|0)+36>>2]&127](r)|0}else{C=c[w>>2]|0}if(!((C|0)==-1)){A=r;B=0;break}c[b>>2]=0;A=0;B=1}}while(0);D=c[l>>2]|0;if(!((y^B)&(q|0)!=0)){break}r=c[D+12>>2]|0;if((r|0)==(c[D+16>>2]|0)){E=pc[c[(c[D>>2]|0)+36>>2]&127](D)|0}else{E=c[r>>2]|0}if(j){F=E}else{F=yc[c[(c[d>>2]|0)+28>>2]&31](g,E)|0}r=x+1|0;if(m){x=r;q=q;t=t;continue}b:do{if(j){w=0;s=e;n=t;v=q;u=p;while(1){do{if((a[u]|0)==1){G=a[s]|0;H=(G&1)==0;if(H){I=s+4|0}else{I=c[s+8>>2]|0}if((F|0)!=(c[I+(x<<2)>>2]|0)){a[u]=0;J=w;K=n;L=v+ -1|0;break}if(H){M=(G&255)>>>1}else{M=c[s+4>>2]|0}if((M|0)!=(r|0)){J=1;K=n;L=v;break}a[u]=2;J=1;K=n+1|0;L=v+ -1|0}else{J=w;K=n;L=v}}while(0);G=s+12|0;if((G|0)==(f|0)){N=J;O=K;P=L;break b}w=J;s=G;n=K;v=L;u=u+1|0}}else{u=0;v=e;n=t;s=q;w=p;while(1){do{if((a[w]|0)==1){G=v;if((a[G]&1)==0){Q=v+4|0}else{Q=c[v+8>>2]|0}if((F|0)!=(yc[c[(c[d>>2]|0)+28>>2]&31](g,c[Q+(x<<2)>>2]|0)|0)){a[w]=0;R=u;S=n;T=s+ -1|0;break}H=a[G]|0;if((H&1)==0){U=(H&255)>>>1}else{U=c[v+4>>2]|0}if((U|0)!=(r|0)){R=1;S=n;T=s;break}a[w]=2;R=1;S=n+1|0;T=s+ -1|0}else{R=u;S=n;T=s}}while(0);H=v+12|0;if((H|0)==(f|0)){N=R;O=S;P=T;break b}u=R;v=H;n=S;s=T;w=w+1|0}}}while(0);if(!N){x=r;t=O;q=P;continue}w=c[l>>2]|0;s=w+12|0;n=c[s>>2]|0;if((n|0)==(c[w+16>>2]|0)){pc[c[(c[w>>2]|0)+40>>2]&127](w)|0}else{c[s>>2]=n+4}if((P+O|0)>>>0<2){x=r;t=O;q=P;continue}else{V=e;W=O;X=p}while(1){do{if((a[X]|0)==2){n=a[V]|0;if((n&1)==0){Y=(n&255)>>>1}else{Y=c[V+4>>2]|0}if((Y|0)==(r|0)){Z=W;break}a[X]=0;Z=W+ -1|0}else{Z=W}}while(0);n=V+12|0;if((n|0)==(f|0)){x=r;t=Z;q=P;continue a}else{V=n;W=Z;X=X+1|0}}}do{if((D|0)==0){_=1}else{X=c[D+12>>2]|0;if((X|0)==(c[D+16>>2]|0)){$=pc[c[(c[D>>2]|0)+36>>2]&127](D)|0}else{$=c[X>>2]|0}if(($|0)==-1){c[l>>2]=0;_=1;break}else{_=(c[l>>2]|0)==0;break}}}while(0);do{if((A|0)==0){aa=85}else{l=c[A+12>>2]|0;if((l|0)==(c[A+16>>2]|0)){ba=pc[c[(c[A>>2]|0)+36>>2]&127](A)|0}else{ba=c[l>>2]|0}if((ba|0)==-1){c[b>>2]=0;aa=85;break}else{if(_){break}else{aa=87;break}}}}while(0);if((aa|0)==85){if(_){aa=87}}if((aa|0)==87){c[h>>2]=c[h>>2]|2}c:do{if(m){aa=92}else{if((a[p]|0)==2){ca=e;break}else{da=e;ea=p}while(1){_=da+12|0;b=ea+1|0;if((_|0)==(f|0)){aa=92;break c}if((a[b]|0)==2){ca=_;break}else{ea=b;da=_}}}}while(0);if((aa|0)==92){c[h>>2]=c[h>>2]|4;ca=f}if((o|0)==0){i=k;return ca|0}Lm(o);i=k;return ca|0}function Jg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Kg(a,0,k,j,f,g,h);i=b;return}function Kg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==64){t=8}else if((s|0)==0){t=0}else{t=10}s=k;eh(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=pc[c[(c[l>>2]|0)+36>>2]&127](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=pc[c[(c[w>>2]|0)+36>>2]&127](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}ye(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}ye(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{R=c[F>>2]|0}if((ah(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){pc[c[(c[B>>2]|0)+40>>2]&127](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Vl(J,c[o>>2]|0,h,t)|0;mj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=pc[c[(c[I>>2]|0)+36>>2]&127](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}function Lg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Mg(a,0,k,j,f,g,h);i=b;return}function Mg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==64){t=8}else if((s|0)==0){t=0}else{t=10}s=k;eh(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=pc[c[(c[l>>2]|0)+36>>2]&127](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=pc[c[(c[w>>2]|0)+36>>2]&127](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;K=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;K=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){L=(w&255)>>>1}else{L=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(L|0)){if(F){M=(w&255)>>>1;N=(w&255)>>>1}else{w=c[y>>2]|0;M=w;N=w}ye(n,N<<1,0);if((a[g]&1)==0){O=10}else{O=(c[f>>2]&-2)+ -1|0}ye(n,O,0);if((a[g]&1)==0){P=u}else{P=c[v>>2]|0}c[o>>2]=P+M;Q=P}else{Q=A}w=B+12|0;F=c[w>>2]|0;R=B+16|0;if((F|0)==(c[R>>2]|0)){S=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{S=c[F>>2]|0}if((ah(S,t,Q,o,r,z,m,k,q,s)|0)!=0){I=H;K=Q;break}F=c[w>>2]|0;if((F|0)==(c[R>>2]|0)){pc[c[(c[B>>2]|0)+40>>2]&127](B)|0;l=B;A=Q;continue}else{c[w>>2]=F+4;l=B;A=Q;continue}}Q=a[m]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[m+4>>2]|0}do{if((T|0)!=0){Q=c[q>>2]|0;if((Q-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=Q+4;c[Q>>2]=A}}while(0);r=Ul(K,c[o>>2]|0,h,t)|0;t=j;c[t>>2]=r;c[t+4>>2]=J;mj(m,k,c[q>>2]|0,h);do{if((B|0)==0){U=0;V=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){W=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{W=c[q>>2]|0}if(!((W|0)==-1)){U=B;V=0;break}c[x>>2]=0;U=0;V=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){X=pc[c[(c[I>>2]|0)+36>>2]&127](I)|0}else{X=c[x>>2]|0}if((X|0)==-1){c[e>>2]=0;E=60;break}if(!V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}function Ng(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Og(a,0,k,j,f,g,h);i=b;return}function Og(d,e,f,g,h,j,k){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;e=i;i=i+328|0;l=e;m=e+104|0;n=e+112|0;o=e+128|0;p=e+144|0;q=e+152|0;r=e+312|0;s=e+320|0;t=c[h+4>>2]&74;if((t|0)==0){u=0}else if((t|0)==64){u=8}else if((t|0)==8){u=16}else{u=10}t=l;eh(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=c[m>>2]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0;D=1}else{x=c[m+12>>2]|0;if((x|0)==(c[m+16>>2]|0)){E=pc[c[(c[m>>2]|0)+36>>2]&127](m)|0}else{E=c[x>>2]|0}if(!((E|0)==-1)){C=m;D=0;break}c[y>>2]=0;C=0;D=1}}while(0);x=c[f>>2]|0;do{if((x|0)==0){F=21}else{G=c[x+12>>2]|0;if((G|0)==(c[x+16>>2]|0)){H=pc[c[(c[x>>2]|0)+36>>2]&127](x)|0}else{H=c[G>>2]|0}if((H|0)==-1){c[f>>2]=0;F=21;break}else{if(D){I=x;break}else{J=x;K=B;break a}}}}while(0);if((F|0)==21){F=0;if(D){J=0;K=B;break}else{I=0}}x=a[h]|0;G=(x&1)==0;if(G){L=(x&255)>>>1}else{L=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(L|0)){if(G){M=(x&255)>>>1;N=(x&255)>>>1}else{x=c[z>>2]|0;M=x;N=x}ye(o,N<<1,0);if((a[h]&1)==0){O=10}else{O=(c[g>>2]&-2)+ -1|0}ye(o,O,0);if((a[h]&1)==0){P=v}else{P=c[w>>2]|0}c[p>>2]=P+M;Q=P}else{Q=B}x=C+12|0;G=c[x>>2]|0;R=C+16|0;if((G|0)==(c[R>>2]|0)){S=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{S=c[G>>2]|0}if((ah(S,u,Q,p,s,A,n,l,r,t)|0)!=0){J=I;K=Q;break}G=c[x>>2]|0;if((G|0)==(c[R>>2]|0)){pc[c[(c[C>>2]|0)+40>>2]&127](C)|0;m=C;B=Q;continue}else{c[x>>2]=G+4;m=C;B=Q;continue}}Q=a[n]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[n+4>>2]|0}do{if((T|0)!=0){Q=c[r>>2]|0;if((Q-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=Q+4;c[Q>>2]=B}}while(0);b[k>>1]=Tl(K,c[p>>2]|0,j,u)|0;mj(n,l,c[r>>2]|0,j);do{if((C|0)==0){U=0;V=1}else{r=c[C+12>>2]|0;if((r|0)==(c[C+16>>2]|0)){W=pc[c[(c[C>>2]|0)+36>>2]&127](C)|0}else{W=c[r>>2]|0}if(!((W|0)==-1)){U=C;V=0;break}c[y>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){F=60}else{y=c[J+12>>2]|0;if((y|0)==(c[J+16>>2]|0)){X=pc[c[(c[J>>2]|0)+36>>2]&127](J)|0}else{X=c[y>>2]|0}if((X|0)==-1){c[f>>2]=0;F=60;break}if(!V){break}Y=d;c[Y>>2]=U;ve(o);ve(n);i=e;return}}while(0);do{if((F|0)==60){if(V){break}Y=d;c[Y>>2]=U;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;Y=d;c[Y>>2]=U;ve(o);ve(n);i=e;return}function Pg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Qg(a,0,k,j,f,g,h);i=b;return}function Qg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==64){t=8}else if((s|0)==0){t=0}else if((s|0)==8){t=16}else{t=10}s=k;eh(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=pc[c[(c[l>>2]|0)+36>>2]&127](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=pc[c[(c[w>>2]|0)+36>>2]&127](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}ye(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}ye(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{R=c[F>>2]|0}if((ah(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){pc[c[(c[B>>2]|0)+40>>2]&127](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Sl(J,c[o>>2]|0,h,t)|0;mj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=pc[c[(c[I>>2]|0)+36>>2]&127](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}function Rg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Sg(a,0,k,j,f,g,h);i=b;return}function Sg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==64){t=8}else if((s|0)==0){t=0}else{t=10}s=k;eh(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=pc[c[(c[l>>2]|0)+36>>2]&127](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=pc[c[(c[w>>2]|0)+36>>2]&127](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}ye(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}ye(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{R=c[F>>2]|0}if((ah(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){pc[c[(c[B>>2]|0)+40>>2]&127](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Rl(J,c[o>>2]|0,h,t)|0;mj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=pc[c[(c[I>>2]|0)+36>>2]&127](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}function Tg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Ug(a,0,k,j,f,g,h);i=b;return}function Ug(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==64){t=8}else if((s|0)==0){t=0}else{t=10}s=k;eh(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;ye(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=pc[c[(c[l>>2]|0)+36>>2]&127](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=pc[c[(c[w>>2]|0)+36>>2]&127](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;K=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;K=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){L=(w&255)>>>1}else{L=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(L|0)){if(F){M=(w&255)>>>1;N=(w&255)>>>1}else{w=c[y>>2]|0;M=w;N=w}ye(n,N<<1,0);if((a[g]&1)==0){O=10}else{O=(c[f>>2]&-2)+ -1|0}ye(n,O,0);if((a[g]&1)==0){P=u}else{P=c[v>>2]|0}c[o>>2]=P+M;Q=P}else{Q=A}w=B+12|0;F=c[w>>2]|0;R=B+16|0;if((F|0)==(c[R>>2]|0)){S=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{S=c[F>>2]|0}if((ah(S,t,Q,o,r,z,m,k,q,s)|0)!=0){I=H;K=Q;break}F=c[w>>2]|0;if((F|0)==(c[R>>2]|0)){pc[c[(c[B>>2]|0)+40>>2]&127](B)|0;l=B;A=Q;continue}else{c[w>>2]=F+4;l=B;A=Q;continue}}Q=a[m]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[m+4>>2]|0}do{if((T|0)!=0){Q=c[q>>2]|0;if((Q-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=Q+4;c[Q>>2]=A}}while(0);r=Ql(K,c[o>>2]|0,h,t)|0;t=j;c[t>>2]=r;c[t+4>>2]=J;mj(m,k,c[q>>2]|0,h);do{if((B|0)==0){U=0;V=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){W=pc[c[(c[B>>2]|0)+36>>2]&127](B)|0}else{W=c[q>>2]|0}if(!((W|0)==-1)){U=B;V=0;break}c[x>>2]=0;U=0;V=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){X=pc[c[(c[I>>2]|0)+36>>2]&127](I)|0}else{X=c[x>>2]|0}if((X|0)==-1){c[e>>2]=0;E=60;break}if(!V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}function Vg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Wg(a,0,k,j,f,g,h);i=b;return}function Wg(b,d,e,f,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;fh(n,h,v,l,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ye(o,10,0);if((a[h]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=pc[c[(c[m>>2]|0)+36>>2]&127](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=pc[c[(c[z>>2]|0)+36>>2]&127](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[h]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}ye(o,P<<1,0);if((a[h]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}ye(o,Q,0);if((a[h]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=pc[c[(c[E>>2]|0)+36>>2]&127](E)|0}else{U=c[I>>2]|0}if((gh(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){pc[c[(c[E>>2]|0)+40>>2]&127](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);g[k>>2]=+Pl(M,c[p>>2]|0,j);mj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=pc[c[(c[E>>2]|0)+36>>2]&127](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=pc[c[(c[L>>2]|0)+36>>2]&127](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}function Xg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Yg(a,0,k,j,f,g,h);i=b;return}\n\n\n\nfunction qj(b,e,f,g,h,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var 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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,kc=0,lc=0,nc=0,oc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0;p=i;i=i+408|0;q=p;r=p+400|0;s=r;t=i;i=i+8|0;u=i;i=i+8|0;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+8|0;B=i;i=i+8|0;C=q;c[r>>2]=0;D=v;c[D+0>>2]=0;c[D+4>>2]=0;c[D+8>>2]=0;E=w;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;F=x;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;G=y;c[G+0>>2]=0;c[G+4>>2]=0;c[G+8>>2]=0;H=z;c[H+0>>2]=0;c[H+4>>2]=0;c[H+8>>2]=0;tj(f,g,s,t,u,v,w,x,y,A);s=m;c[n>>2]=c[s>>2];g=b;b=e;e=r;r=l;f=y+4|0;I=y+8|0;J=x+4|0;K=x+8|0;L=(h&512|0)!=0;h=w+4|0;M=w+8|0;N=z+4|0;O=z+8|0;P=e+3|0;Q=m+4|0;m=v+4|0;R=q+400|0;q=C;S=C;C=o;o=0;T=0;U=120;a:while(1){V=c[g>>2]|0;do{if((V|0)==0){W=1}else{X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){Y=pc[c[(c[V>>2]|0)+36>>2]&127](V)|0}else{Y=c[X>>2]|0}if((Y|0)==-1){c[g>>2]=0;W=1;break}else{W=(c[g>>2]|0)==0;break}}}while(0);V=c[b>>2]|0;do{if((V|0)==0){Z=15}else{X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){_=pc[c[(c[V>>2]|0)+36>>2]&127](V)|0}else{_=c[X>>2]|0}if((_|0)==-1){c[b>>2]=0;Z=15;break}else{if(W){$=V;break}else{aa=S;ba=q;ca=T;da=U;Z=292;break a}}}}while(0);if((Z|0)==15){Z=0;if(W){aa=S;ba=q;ca=T;da=U;Z=292;break}else{$=0}}b:do{switch(a[e+o|0]|0){case 2:{if(!((T|0)!=0|o>>>0<2)){if((o|0)==2){ea=(a[P]|0)!=0}else{ea=0}if(!(L|ea)){fa=C;ga=S;ha=q;ia=R;ja=0;ka=U;break b}}V=a[E]|0;X=(V&1)==0?h:c[M>>2]|0;c:do{if((o|0)==0){la=$;ma=$;na=V;oa=X}else{if((d[e+(o+ -1)|0]|0)<2){pa=V;qa=X}else{la=$;ma=$;na=V;oa=X;break}while(1){if((pa&1)==0){ra=h;sa=(pa&255)>>>1}else{ra=c[M>>2]|0;sa=c[h>>2]|0}if((qa|0)==(ra+(sa<<2)|0)){ta=pa;break}if(!(jc[c[(c[r>>2]|0)+12>>2]&31](l,8192,c[qa>>2]|0)|0)){Z=129;break}pa=a[E]|0;qa=qa+4|0}if((Z|0)==129){Z=0;ta=a[E]|0}ua=(ta&1)==0;va=qa-(ua?h:c[M>>2]|0)>>2;wa=a[H]|0;xa=(wa&1)==0;if(xa){ya=(wa&255)>>>1}else{ya=c[N>>2]|0}d:do{if(!(va>>>0>ya>>>0)){if(xa){za=N+(((wa&255)>>>1)-va<<2)|0;Aa=N;Ba=(wa&255)>>>1}else{Ca=c[O>>2]|0;Da=c[N>>2]|0;za=Ca+(Da-va<<2)|0;Aa=Ca;Ba=Da}Da=Aa+(Ba<<2)|0;if((za|0)==(Da|0)){la=$;ma=$;na=ta;oa=qa;break c}else{Ea=ua?h:c[M>>2]|0;Fa=za}while(1){if((c[Fa>>2]|0)!=(c[Ea>>2]|0)){break d}Ca=Fa+4|0;if((Ca|0)==(Da|0)){la=$;ma=$;na=ta;oa=qa;break c}Ea=Ea+4|0;Fa=Ca}}}while(0);la=$;ma=$;na=ta;oa=ua?h:c[M>>2]|0}}while(0);e:while(1){if((na&1)==0){Ga=h;Ha=(na&255)>>>1}else{Ga=c[M>>2]|0;Ha=c[h>>2]|0}if((oa|0)==(Ga+(Ha<<2)|0)){break}X=c[g>>2]|0;do{if((X|0)==0){Ia=1}else{V=c[X+12>>2]|0;if((V|0)==(c[X+16>>2]|0)){Ja=pc[c[(c[X>>2]|0)+36>>2]&127](X)|0}else{Ja=c[V>>2]|0}if((Ja|0)==-1){c[g>>2]=0;Ia=1;break}else{Ia=(c[g>>2]|0)==0;break}}}while(0);do{if((ma|0)==0){Ka=la;Z=159}else{X=c[ma+12>>2]|0;if((X|0)==(c[ma+16>>2]|0)){La=pc[c[(c[ma>>2]|0)+36>>2]&127](ma)|0}else{La=c[X>>2]|0}if((La|0)==-1){c[b>>2]=0;Ka=0;Z=159;break}else{if(Ia^(la|0)==0){Ma=la;Na=la;break}else{break e}}}}while(0);if((Z|0)==159){Z=0;if(Ia){break}else{Ma=Ka;Na=0}}X=c[g>>2]|0;ua=c[X+12>>2]|0;if((ua|0)==(c[X+16>>2]|0)){Oa=pc[c[(c[X>>2]|0)+36>>2]&127](X)|0}else{Oa=c[ua>>2]|0}if((Oa|0)!=(c[oa>>2]|0)){break}ua=c[g>>2]|0;X=ua+12|0;V=c[X>>2]|0;if((V|0)==(c[ua+16>>2]|0)){pc[c[(c[ua>>2]|0)+40>>2]&127](ua)|0}else{c[X>>2]=V+4}la=Ma;ma=Na;na=a[E]|0;oa=oa+4|0}if(!L){fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break b}V=a[E]|0;if((V&1)==0){Pa=h;Qa=(V&255)>>>1}else{Pa=c[M>>2]|0;Qa=c[h>>2]|0}if((oa|0)==(Pa+(Qa<<2)|0)){fa=C;ga=S;ha=q;ia=R;ja=T;ka=U}else{Z=174;break a}break};case 4:{V=C;X=S;ua=q;va=R;wa=0;xa=U;f:while(1){Da=c[g>>2]|0;do{if((Da|0)==0){Ra=1}else{Ca=c[Da+12>>2]|0;if((Ca|0)==(c[Da+16>>2]|0)){Sa=pc[c[(c[Da>>2]|0)+36>>2]&127](Da)|0}else{Sa=c[Ca>>2]|0}if((Sa|0)==-1){c[g>>2]=0;Ra=1;break}else{Ra=(c[g>>2]|0)==0;break}}}while(0);Da=c[b>>2]|0;do{if((Da|0)==0){Z=188}else{Ca=c[Da+12>>2]|0;if((Ca|0)==(c[Da+16>>2]|0)){Ta=pc[c[(c[Da>>2]|0)+36>>2]&127](Da)|0}else{Ta=c[Ca>>2]|0}if((Ta|0)==-1){c[b>>2]=0;Z=188;break}else{if(Ra){break}else{break f}}}}while(0);if((Z|0)==188){Z=0;if(Ra){break}}Da=c[g>>2]|0;Ca=c[Da+12>>2]|0;if((Ca|0)==(c[Da+16>>2]|0)){Ua=pc[c[(c[Da>>2]|0)+36>>2]&127](Da)|0}else{Ua=c[Ca>>2]|0}if(jc[c[(c[r>>2]|0)+12>>2]&31](l,2048,Ua)|0){Ca=c[n>>2]|0;if((Ca|0)==(V|0)){Da=(c[Q>>2]|0)!=120;Va=c[s>>2]|0;Wa=V-Va|0;Xa=Wa>>>0<2147483647?Wa<<1:-1;Ya=Wa>>2;if(Da){Za=Va}else{Za=0}Va=Mm(Za,Xa)|0;Wa=Va;if((Va|0)==0){Z=198;break a}do{if(Da){c[s>>2]=Wa;_a=Wa}else{Va=c[s>>2]|0;c[s>>2]=Wa;if((Va|0)==0){_a=Wa;break}mc[c[Q>>2]&255](Va);_a=c[s>>2]|0}}while(0);c[Q>>2]=121;Wa=_a+(Ya<<2)|0;c[n>>2]=Wa;$a=Wa;ab=(c[s>>2]|0)+(Xa>>>2<<2)|0}else{$a=Ca;ab=V}c[n>>2]=$a+4;c[$a>>2]=Ua;bb=ab;cb=X;db=ua;eb=va;fb=wa+1|0;gb=xa}else{Wa=a[D]|0;if((Wa&1)==0){hb=(Wa&255)>>>1}else{hb=c[m>>2]|0}if((hb|0)==0|(wa|0)==0){break}if((Ua|0)!=(c[u>>2]|0)){break}if((ua|0)==(va|0)){Wa=ua-X|0;Da=Wa>>>0<2147483647?Wa<<1:-1;if((xa|0)!=120){ib=X}else{ib=0}Va=Mm(ib,Da)|0;jb=Va;if((Va|0)==0){Z=214;break a}kb=jb;lb=jb+(Wa>>2<<2)|0;mb=jb+(Da>>>2<<2)|0;nb=121}else{kb=X;lb=ua;mb=va;nb=xa}c[lb>>2]=wa;bb=V;cb=kb;db=lb+4|0;eb=mb;fb=0;gb=nb}Da=c[g>>2]|0;jb=Da+12|0;Wa=c[jb>>2]|0;if((Wa|0)==(c[Da+16>>2]|0)){pc[c[(c[Da>>2]|0)+40>>2]&127](Da)|0;V=bb;X=cb;ua=db;va=eb;wa=fb;xa=gb;continue}else{c[jb>>2]=Wa+4;V=bb;X=cb;ua=db;va=eb;wa=fb;xa=gb;continue}}if((X|0)==(ua|0)|(wa|0)==0){ob=X;pb=ua;qb=va;rb=xa}else{if((ua|0)==(va|0)){Wa=ua-X|0;jb=Wa>>>0<2147483647?Wa<<1:-1;if((xa|0)!=120){sb=X}else{sb=0}Da=Mm(sb,jb)|0;Va=Da;if((Da|0)==0){Z=225;break a}tb=Va;ub=Va+(Wa>>2<<2)|0;vb=Va+(jb>>>2<<2)|0;wb=121}else{tb=X;ub=ua;vb=va;wb=xa}c[ub>>2]=wa;ob=tb;pb=ub+4|0;qb=vb;rb=wb}jb=c[A>>2]|0;if((jb|0)>0){Va=c[g>>2]|0;do{if((Va|0)==0){xb=1}else{Wa=c[Va+12>>2]|0;if((Wa|0)==(c[Va+16>>2]|0)){yb=pc[c[(c[Va>>2]|0)+36>>2]&127](Va)|0}else{yb=c[Wa>>2]|0}if((yb|0)==-1){c[g>>2]=0;xb=1;break}else{xb=(c[g>>2]|0)==0;break}}}while(0);Va=c[b>>2]|0;do{if((Va|0)==0){Z=242}else{wa=c[Va+12>>2]|0;if((wa|0)==(c[Va+16>>2]|0)){zb=pc[c[(c[Va>>2]|0)+36>>2]&127](Va)|0}else{zb=c[wa>>2]|0}if((zb|0)==-1){c[b>>2]=0;Z=242;break}else{if(xb){Ab=Va;break}else{Z=248;break a}}}}while(0);if((Z|0)==242){Z=0;if(xb){Z=248;break a}else{Ab=0}}Va=c[g>>2]|0;wa=c[Va+12>>2]|0;if((wa|0)==(c[Va+16>>2]|0)){Bb=pc[c[(c[Va>>2]|0)+36>>2]&127](Va)|0}else{Bb=c[wa>>2]|0}if((Bb|0)!=(c[t>>2]|0)){Z=248;break a}wa=c[g>>2]|0;Va=wa+12|0;xa=c[Va>>2]|0;if((xa|0)==(c[wa+16>>2]|0)){pc[c[(c[wa>>2]|0)+40>>2]&127](wa)|0;Cb=Ab;Db=jb;Eb=Ab;Fb=V}else{c[Va>>2]=xa+4;Cb=Ab;Db=jb;Eb=Ab;Fb=V}while(1){xa=c[g>>2]|0;do{if((xa|0)==0){Gb=1}else{Va=c[xa+12>>2]|0;if((Va|0)==(c[xa+16>>2]|0)){Hb=pc[c[(c[xa>>2]|0)+36>>2]&127](xa)|0}else{Hb=c[Va>>2]|0}if((Hb|0)==-1){c[g>>2]=0;Gb=1;break}else{Gb=(c[g>>2]|0)==0;break}}}while(0);do{if((Eb|0)==0){Ib=Cb;Z=265}else{xa=c[Eb+12>>2]|0;if((xa|0)==(c[Eb+16>>2]|0)){Jb=pc[c[(c[Eb>>2]|0)+36>>2]&127](Eb)|0}else{Jb=c[xa>>2]|0}if((Jb|0)==-1){c[b>>2]=0;Ib=0;Z=265;break}else{if(Gb^(Cb|0)==0){Kb=Cb;Lb=Cb;break}else{Z=271;break a}}}}while(0);if((Z|0)==265){Z=0;if(Gb){Z=271;break a}else{Kb=Ib;Lb=0}}xa=c[g>>2]|0;Ca=c[xa+12>>2]|0;if((Ca|0)==(c[xa+16>>2]|0)){Mb=pc[c[(c[xa>>2]|0)+36>>2]&127](xa)|0}else{Mb=c[Ca>>2]|0}if(!(jc[c[(c[r>>2]|0)+12>>2]&31](l,2048,Mb)|0)){Z=271;break a}Ca=c[n>>2]|0;if((Ca|0)==(Fb|0)){xa=(c[Q>>2]|0)!=120;Xa=c[s>>2]|0;Ya=Fb-Xa|0;Va=Ya>>>0<2147483647?Ya<<1:-1;wa=Ya>>2;if(xa){Nb=Xa}else{Nb=0}Xa=Mm(Nb,Va)|0;Ya=Xa;if((Xa|0)==0){Z=276;break a}do{if(xa){c[s>>2]=Ya;Ob=Ya}else{Xa=c[s>>2]|0;c[s>>2]=Ya;if((Xa|0)==0){Ob=Ya;break}mc[c[Q>>2]&255](Xa);Ob=c[s>>2]|0}}while(0);c[Q>>2]=121;Ya=Ob+(wa<<2)|0;c[n>>2]=Ya;Pb=Ya;Qb=(c[s>>2]|0)+(Va>>>2<<2)|0}else{Pb=Ca;Qb=Fb}Ya=c[g>>2]|0;xa=c[Ya+12>>2]|0;if((xa|0)==(c[Ya+16>>2]|0)){Xa=pc[c[(c[Ya>>2]|0)+36>>2]&127](Ya)|0;Rb=Xa;Sb=c[n>>2]|0}else{Rb=c[xa>>2]|0;Sb=Pb}c[n>>2]=Sb+4;c[Sb>>2]=Rb;xa=Db+ -1|0;c[A>>2]=xa;Xa=c[g>>2]|0;Ya=Xa+12|0;va=c[Ya>>2]|0;if((va|0)==(c[Xa+16>>2]|0)){pc[c[(c[Xa>>2]|0)+40>>2]&127](Xa)|0}else{c[Ya>>2]=va+4}if((xa|0)>0){Cb=Kb;Db=xa;Eb=Lb;Fb=Qb}else{Tb=Qb;break}}}else{Tb=V}if((c[n>>2]|0)==(c[s>>2]|0)){Z=290;break a}else{fa=Tb;ga=ob;ha=pb;ia=qb;ja=T;ka=rb}break};case 3:{jb=a[F]|0;xa=(jb&1)==0;if(xa){Ub=(jb&255)>>>1}else{Ub=c[J>>2]|0}va=a[G]|0;Ya=(va&1)==0;if(Ya){Vb=(va&255)>>>1}else{Vb=c[f>>2]|0}if((Ub|0)==(0-Vb|0)){fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break b}if(xa){Wb=(jb&255)>>>1}else{Wb=c[J>>2]|0}do{if((Wb|0)!=0){if(Ya){Xb=(va&255)>>>1}else{Xb=c[f>>2]|0}if((Xb|0)==0){break}Xa=c[g>>2]|0;ua=c[Xa+12>>2]|0;if((ua|0)==(c[Xa+16>>2]|0)){X=pc[c[(c[Xa>>2]|0)+36>>2]&127](Xa)|0;Yb=X;Zb=a[F]|0}else{Yb=c[ua>>2]|0;Zb=jb}ua=c[g>>2]|0;X=ua+12|0;Xa=c[X>>2]|0;Wa=(Xa|0)==(c[ua+16>>2]|0);if((Yb|0)==(c[((Zb&1)==0?J:c[K>>2]|0)>>2]|0)){if(Wa){pc[c[(c[ua>>2]|0)+40>>2]&127](ua)|0}else{c[X>>2]=Xa+4}X=a[F]|0;if((X&1)==0){_b=(X&255)>>>1}else{_b=c[J>>2]|0}fa=C;ga=S;ha=q;ia=R;ja=_b>>>0>1?x:T;ka=U;break b}if(Wa){$b=pc[c[(c[ua>>2]|0)+36>>2]&127](ua)|0}else{$b=c[Xa>>2]|0}if(($b|0)!=(c[((a[G]&1)==0?f:c[I>>2]|0)>>2]|0)){Z=116;break a}Xa=c[g>>2]|0;ua=Xa+12|0;Wa=c[ua>>2]|0;if((Wa|0)==(c[Xa+16>>2]|0)){pc[c[(c[Xa>>2]|0)+40>>2]&127](Xa)|0}else{c[ua>>2]=Wa+4}a[k]=1;Wa=a[G]|0;if((Wa&1)==0){ac=(Wa&255)>>>1}else{ac=c[f>>2]|0}fa=C;ga=S;ha=q;ia=R;ja=ac>>>0>1?y:T;ka=U;break b}}while(0);if(xa){bc=(jb&255)>>>1}else{bc=c[J>>2]|0}Ya=c[g>>2]|0;V=c[Ya+12>>2]|0;Wa=(V|0)==(c[Ya+16>>2]|0);if((bc|0)==0){if(Wa){ua=pc[c[(c[Ya>>2]|0)+36>>2]&127](Ya)|0;cc=ua;dc=a[G]|0}else{cc=c[V>>2]|0;dc=va}if((cc|0)!=(c[((dc&1)==0?f:c[I>>2]|0)>>2]|0)){fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break b}ua=c[g>>2]|0;Xa=ua+12|0;X=c[Xa>>2]|0;if((X|0)==(c[ua+16>>2]|0)){pc[c[(c[ua>>2]|0)+40>>2]&127](ua)|0}else{c[Xa>>2]=X+4}a[k]=1;X=a[G]|0;if((X&1)==0){ec=(X&255)>>>1}else{ec=c[f>>2]|0}fa=C;ga=S;ha=q;ia=R;ja=ec>>>0>1?y:T;ka=U;break b}if(Wa){Wa=pc[c[(c[Ya>>2]|0)+36>>2]&127](Ya)|0;fc=Wa;gc=a[F]|0}else{fc=c[V>>2]|0;gc=jb}if((fc|0)!=(c[((gc&1)==0?J:c[K>>2]|0)>>2]|0)){a[k]=1;fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break b}V=c[g>>2]|0;Wa=V+12|0;Ya=c[Wa>>2]|0;if((Ya|0)==(c[V+16>>2]|0)){pc[c[(c[V>>2]|0)+40>>2]&127](V)|0}else{c[Wa>>2]=Ya+4}Ya=a[F]|0;if((Ya&1)==0){hc=(Ya&255)>>>1}else{hc=c[J>>2]|0}fa=C;ga=S;ha=q;ia=R;ja=hc>>>0>1?x:T;ka=U;break};case 1:{if((o|0)==3){aa=S;ba=q;ca=T;da=U;Z=292;break a}Ya=c[g>>2]|0;Wa=c[Ya+12>>2]|0;if((Wa|0)==(c[Ya+16>>2]|0)){ic=pc[c[(c[Ya>>2]|0)+36>>2]&127](Ya)|0}else{ic=c[Wa>>2]|0}if(!(jc[c[(c[r>>2]|0)+12>>2]&31](l,8192,ic)|0)){Z=27;break a}Wa=c[g>>2]|0;Ya=Wa+12|0;V=c[Ya>>2]|0;if((V|0)==(c[Wa+16>>2]|0)){kc=pc[c[(c[Wa>>2]|0)+40>>2]&127](Wa)|0}else{c[Ya>>2]=V+4;kc=c[V>>2]|0}Le(z,kc);Z=28;break};case 0:{Z=28;break};default:{fa=C;ga=S;ha=q;ia=R;ja=T;ka=U}}}while(0);g:do{if((Z|0)==28){Z=0;if((o|0)==3){aa=S;ba=q;ca=T;da=U;Z=292;break a}else{lc=$;nc=$}while(1){V=c[g>>2]|0;do{if((V|0)==0){oc=1}else{Ya=c[V+12>>2]|0;if((Ya|0)==(c[V+16>>2]|0)){qc=pc[c[(c[V>>2]|0)+36>>2]&127](V)|0}else{qc=c[Ya>>2]|0}if((qc|0)==-1){c[g>>2]=0;oc=1;break}else{oc=(c[g>>2]|0)==0;break}}}while(0);do{if((nc|0)==0){rc=lc;Z=42}else{V=c[nc+12>>2]|0;if((V|0)==(c[nc+16>>2]|0)){sc=pc[c[(c[nc>>2]|0)+36>>2]&127](nc)|0}else{sc=c[V>>2]|0}if((sc|0)==-1){c[b>>2]=0;rc=0;Z=42;break}else{if(oc^(lc|0)==0){tc=lc;uc=lc;break}else{fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break g}}}}while(0);if((Z|0)==42){Z=0;if(oc){fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break g}else{tc=rc;uc=0}}V=c[g>>2]|0;Ca=c[V+12>>2]|0;if((Ca|0)==(c[V+16>>2]|0)){vc=pc[c[(c[V>>2]|0)+36>>2]&127](V)|0}else{vc=c[Ca>>2]|0}if(!(jc[c[(c[r>>2]|0)+12>>2]&31](l,8192,vc)|0)){fa=C;ga=S;ha=q;ia=R;ja=T;ka=U;break g}Ca=c[g>>2]|0;V=Ca+12|0;Va=c[V>>2]|0;if((Va|0)==(c[Ca+16>>2]|0)){wc=pc[c[(c[Ca>>2]|0)+40>>2]&127](Ca)|0}else{c[V>>2]=Va+4;wc=c[Va>>2]|0}Le(z,wc);lc=tc;nc=uc}}}while(0);jb=o+1|0;if(jb>>>0<4){R=ia;q=ha;S=ga;C=fa;o=jb;T=ja;U=ka}else{aa=ga;ba=ha;ca=ja;da=ka;Z=292;break}}h:do{if((Z|0)==27){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==116){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==174){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==198){Wm()}else if((Z|0)==214){Wm()}else if((Z|0)==225){Wm()}else if((Z|0)==248){c[j>>2]=c[j>>2]|4;xc=0;yc=ob;zc=rb}else if((Z|0)==271){c[j>>2]=c[j>>2]|4;xc=0;yc=ob;zc=rb}else if((Z|0)==276){Wm()}else if((Z|0)==290){c[j>>2]=c[j>>2]|4;xc=0;yc=ob;zc=rb}else if((Z|0)==292){i:do{if((ca|0)!=0){ka=ca;ja=ca+4|0;ha=ca+8|0;ga=1;j:while(1){T=a[ka]|0;if((T&1)==0){Ac=(T&255)>>>1}else{Ac=c[ja>>2]|0}if(!(ga>>>0<Ac>>>0)){break i}T=c[g>>2]|0;do{if((T|0)==0){Bc=1}else{o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Cc=pc[c[(c[T>>2]|0)+36>>2]&127](T)|0}else{Cc=c[o>>2]|0}if((Cc|0)==-1){c[g>>2]=0;Bc=1;break}else{Bc=(c[g>>2]|0)==0;break}}}while(0);T=c[b>>2]|0;do{if((T|0)==0){Z=311}else{o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Dc=pc[c[(c[T>>2]|0)+36>>2]&127](T)|0}else{Dc=c[o>>2]|0}if((Dc|0)==-1){c[b>>2]=0;Z=311;break}else{if(Bc){break}else{break j}}}}while(0);if((Z|0)==311){Z=0;if(Bc){break}}T=c[g>>2]|0;o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Ec=pc[c[(c[T>>2]|0)+36>>2]&127](T)|0}else{Ec=c[o>>2]|0}if((a[ka]&1)==0){Fc=ja}else{Fc=c[ha>>2]|0}if((Ec|0)!=(c[Fc+(ga<<2)>>2]|0)){break}o=ga+1|0;T=c[g>>2]|0;fa=T+12|0;C=c[fa>>2]|0;if((C|0)==(c[T+16>>2]|0)){pc[c[(c[T>>2]|0)+40>>2]&127](T)|0;ga=o;continue}else{c[fa>>2]=C+4;ga=o;continue}}c[j>>2]=c[j>>2]|4;xc=0;yc=aa;zc=da;break h}}while(0);if((aa|0)==(ba|0)){xc=1;yc=ba;zc=da;break}c[B>>2]=0;mj(v,aa,ba,B);if((c[B>>2]|0)==0){xc=1;yc=aa;zc=da;break}c[j>>2]=c[j>>2]|4;xc=0;yc=aa;zc=da}}while(0);He(z);He(y);He(x);He(w);ve(v);if((yc|0)==0){i=p;return xc|0}mc[zc&255](yc);i=p;return xc|0}function rj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;d=i;i=i+464|0;l=d;m=d+8|0;n=d+24|0;o=d+424|0;p=d+432|0;q=d+440|0;r=d+448|0;s=d+456|0;t=o;c[t>>2]=n;u=o+4|0;c[u>>2]=120;v=n+400|0;Qe(q,h);n=q;w=c[n>>2]|0;if(!((c[1280]|0)==-1)){c[m>>2]=5120;c[m+4>>2]=118;c[m+8>>2]=0;qe(5120,m,119)}m=(c[5124>>2]|0)+ -1|0;x=c[w+8>>2]|0;if(!((c[w+12>>2]|0)-x>>2>>>0>m>>>0)){y=vb(4)|0;z=y;pm(z);cc(y|0,13088,107)}w=c[x+(m<<2)>>2]|0;if((w|0)==0){y=vb(4)|0;z=y;pm(z);cc(y|0,13088,107)}y=w;a[r]=0;z=f;f=c[z>>2]|0;c[s>>2]=f;m=c[h+4>>2]|0;h=l;x=s;c[h+0>>2]=c[x+0>>2];x=qj(e,l,g,q,m,j,r,y,o,p,v)|0;if(x){x=k;if((a[x]&1)==0){c[k+4>>2]=0;a[x]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}x=w;if((a[r]|0)!=0){Le(k,yc[c[(c[x>>2]|0)+44>>2]&31](y,45)|0)}r=yc[c[(c[x>>2]|0)+44>>2]&31](y,48)|0;y=c[t>>2]|0;x=c[p>>2]|0;p=x+ -4|0;a:do{if(y>>>0<p>>>0){w=y;while(1){v=w+4|0;if((c[w>>2]|0)!=(r|0)){A=w;break a}if(v>>>0<p>>>0){w=v}else{A=v;break}}}else{A=y}}while(0);sj(k,A,x)|0}x=e;e=c[x>>2]|0;do{if((e|0)==0){B=1}else{A=c[e+12>>2]|0;if((A|0)==(c[e+16>>2]|0)){C=pc[c[(c[e>>2]|0)+36>>2]&127](e)|0}else{C=c[A>>2]|0}if((C|0)==-1){c[x>>2]=0;B=1;break}else{B=(c[x>>2]|0)==0;break}}}while(0);do{if((f|0)==0){D=29}else{C=c[f+12>>2]|0;if((C|0)==(c[f+16>>2]|0)){E=pc[c[(c[f>>2]|0)+36>>2]&127](f)|0}else{E=c[C>>2]|0}if((E|0)==-1){c[z>>2]=0;D=29;break}else{if(B){break}else{D=31;break}}}}while(0);if((D|0)==29){if(B){D=31}}if((D|0)==31){c[j>>2]=c[j>>2]|2}c[b>>2]=c[x>>2];Yd(c[n>>2]|0)|0;n=c[t>>2]|0;c[t>>2]=0;if((n|0)==0){i=d;return}mc[c[u>>2]&255](n);i=d;return}function sj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;g=b;h=d;j=a[g]|0;if((j&1)==0){k=(j&255)>>>1;l=j;m=1}else{j=c[b>>2]|0;k=c[b+4>>2]|0;l=j&255;m=(j&-2)+ -1|0}j=e-h>>2;if((j|0)==0){i=f;return b|0}if((m-k|0)>>>0<j>>>0){Ne(b,m,k+j-m|0,k,k,0,0);n=a[g]|0}else{n=l}if((n&1)==0){o=b+4|0}else{o=c[b+8>>2]|0}n=o+(k<<2)|0;if((d|0)==(e|0)){p=n}else{l=k+((e+ -4+(0-h)|0)>>>2)+1|0;h=d;d=n;while(1){c[d>>2]=c[h>>2];n=h+4|0;if((n|0)==(e|0)){break}else{d=d+4|0;h=n}}p=o+(l<<2)|0}c[p>>2]=0;p=k+j|0;if((a[g]&1)==0){a[g]=p<<1;i=f;return b|0}else{c[b+4>>2]=p;i=f;return b|0}return 0}function tj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;i=i+176|0;o=n;p=n+16|0;q=n+32|0;r=n+40|0;s=n+56|0;t=n+72|0;u=n+88|0;v=n+104|0;w=n+112|0;x=n+128|0;y=n+144|0;z=n+160|0;if(b){b=c[d>>2]|0;if(!((c[1174]|0)==-1)){c[p>>2]=4696;c[p+4>>2]=118;c[p+8>>2]=0;qe(4696,p,119)}p=(c[4700>>2]|0)+ -1|0;A=c[b+8>>2]|0;if(!((c[b+12>>2]|0)-A>>2>>>0>p>>>0)){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}b=c[A+(p<<2)>>2]|0;if((b|0)==0){B=vb(4)|0;C=B;pm(C);cc(B|0,13088,107)}B=b;nc[c[(c[b>>2]|0)+44>>2]&63](q,B);C=e;p=c[q>>2]|0;a[C]=p;a[C+1|0]=p>>8;a[C+2|0]=p>>16;a[C+3|0]=p>>24;p=b;nc[c[(c[p>>2]|0)+32>>2]&63](r,B);C=l;if((a[C]&1)==0){c[l+4>>2]=0;a[C]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ke(l,0);q=r;c[C+0>>2]=c[q+0>>2];c[C+4>>2]=c[q+4>>2];c[C+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;He(r);nc[c[(c[p>>2]|0)+28>>2]&63](s,B);r=k;if((a[r]&1)==0){c[k+4>>2]=0;a[r]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ke(k,0);q=s;c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;He(s);s=b;c[f>>2]=pc[c[(c[s>>2]|0)+12>>2]&127](B)|0;c[g>>2]=pc[c[(c[s>>2]|0)+16>>2]&127](B)|0;nc[c[(c[b>>2]|0)+20>>2]&63](t,B);b=h;if((a[b]&1)==0){a[h+1|0]=0;a[b]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}Ae(h,0);q=t;c[b+0>>2]=c[q+0>>2];c[b+4>>2]=c[q+4>>2];c[b+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(t);nc[c[(c[p>>2]|0)+24>>2]&63](u,B);p=j;if((a[p]&1)==0){c[j+4>>2]=0;a[p]=0}else{c[c[j+8>>2]>>2]=0;c[j+4>>2]=0}Ke(j,0);t=u;c[p+0>>2]=c[t+0>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;He(u);D=pc[c[(c[s>>2]|0)+36>>2]&127](B)|0;c[m>>2]=D;i=n;return}else{B=c[d>>2]|0;if(!((c[1158]|0)==-1)){c[o>>2]=4632;c[o+4>>2]=118;c[o+8>>2]=0;qe(4632,o,119)}o=(c[4636>>2]|0)+ -1|0;d=c[B+8>>2]|0;if(!((c[B+12>>2]|0)-d>>2>>>0>o>>>0)){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}B=c[d+(o<<2)>>2]|0;if((B|0)==0){E=vb(4)|0;F=E;pm(F);cc(E|0,13088,107)}E=B;nc[c[(c[B>>2]|0)+44>>2]&63](v,E);F=e;e=c[v>>2]|0;a[F]=e;a[F+1|0]=e>>8;a[F+2|0]=e>>16;a[F+3|0]=e>>24;e=B;nc[c[(c[e>>2]|0)+32>>2]&63](w,E);F=l;if((a[F]&1)==0){c[l+4>>2]=0;a[F]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ke(l,0);l=w;c[F+0>>2]=c[l+0>>2];c[F+4>>2]=c[l+4>>2];c[F+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;He(w);nc[c[(c[e>>2]|0)+28>>2]&63](x,E);w=k;if((a[w]&1)==0){c[k+4>>2]=0;a[w]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ke(k,0);k=x;c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;He(x);x=B;c[f>>2]=pc[c[(c[x>>2]|0)+12>>2]&127](E)|0;c[g>>2]=pc[c[(c[x>>2]|0)+16>>2]&127](E)|0;nc[c[(c[B>>2]|0)+20>>2]&63](y,E);B=h;if((a[B]&1)==0){a[h+1|0]=0;a[B]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}Ae(h,0);h=y;c[B+0>>2]=c[h+0>>2];c[B+4>>2]=c[h+4>>2];c[B+8>>2]=c[h+8>>2];c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ve(y);nc[c[(c[e>>2]|0)+24>>2]&63](z,E);e=j;if((a[e]&1)==0){c[j+4>>2]=0;a[e]=0}else{c[c[j+8>>2]>>2]=0;c[j+4>>2]=0}Ke(j,0);j=z;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;He(z);D=pc[c[(c[x>>2]|0)+36>>2]&127](E)|0;c[m>>2]=D;i=n;return}}function uj(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function vj(a){a=a|0;i=i;return}function wj(b,d,e,f,g,j,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;l=+l;var 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;d=i;i=i+16|0;m=d;n=d+8|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+104|0;r=i;i=i+8|0;s=i;i=i+104|0;t=i;i=i+8|0;u=i;i=i+8|0;v=u;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+104|0;D=i;i=i+8|0;E=i;i=i+8|0;F=i;i=i+8|0;G=q;c[r>>2]=G;q=s;s=o;h[k>>3]=l;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];s=Ab(G|0,100,4880,o|0)|0;do{if(s>>>0>99){do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);o=c[1254]|0;G=n;h[k>>3]=l;c[G>>2]=c[k>>2];c[G+4>>2]=c[k+4>>2];G=rh(r,o,4880,n)|0;o=c[r>>2]|0;if((o|0)==0){Wm()}H=Km(G)|0;if((H|0)!=0){I=o;J=H;K=H;L=G;break}Wm()}else{I=0;J=0;K=q;L=s}}while(0);Qe(t,g);s=t;q=c[s>>2]|0;if(!((c[1282]|0)==-1)){c[p>>2]=5128;c[p+4>>2]=118;c[p+8>>2]=0;qe(5128,p,119)}p=(c[5132>>2]|0)+ -1|0;n=c[q+8>>2]|0;if(!((c[q+12>>2]|0)-n>>2>>>0>p>>>0)){M=vb(4)|0;N=M;pm(N);cc(M|0,13088,107)}q=c[n+(p<<2)>>2]|0;if((q|0)==0){M=vb(4)|0;N=M;pm(N);cc(M|0,13088,107)}M=q;N=c[r>>2]|0;vc[c[(c[q>>2]|0)+32>>2]&7](M,N,N+L|0,K)|0;if((L|0)==0){O=0}else{O=(a[c[r>>2]|0]|0)==45}c[u>>2]=0;u=y;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;u=z;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;r=A;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;xj(f,O,t,v,w,x,y,z,A,B);t=C;C=c[B>>2]|0;if((L|0)>(C|0)){B=a[r]|0;if((B&1)==0){P=(B&255)>>>1}else{P=c[A+4>>2]|0}B=a[u]|0;if((B&1)==0){Q=(B&255)>>>1}else{Q=c[z+4>>2]|0}R=P+(L-C<<1|1)+Q|0}else{Q=a[r]|0;if((Q&1)==0){S=(Q&255)>>>1}else{S=c[A+4>>2]|0}Q=a[u]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[z+4>>2]|0}R=S+2+T|0}T=R+C|0;do{if(T>>>0>100){R=Km(T)|0;if((R|0)!=0){U=R;V=R;break}Wm()}else{U=0;V=t}}while(0);yj(V,D,E,c[g+4>>2]|0,K,K+L|0,M,O,v,a[w]|0,a[x]|0,y,z,A,C);c[F>>2]=c[e>>2];e=c[D>>2]|0;D=c[E>>2]|0;E=m;C=F;c[E+0>>2]=c[C+0>>2];ad(b,m,V,e,D,g,j);if((U|0)!=0){Lm(U)}ve(A);ve(z);ve(y);Yd(c[s>>2]|0)|0;if((J|0)!=0){Lm(J)}if((I|0)==0){i=d;return}Lm(I);i=d;return}function xj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,K=0,L=0;n=i;i=i+40|0;o=n;p=n+16|0;q=n+32|0;r=q;s=i;i=i+16|0;t=i;i=i+8|0;u=t;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+8|0;z=y;A=i;i=i+16|0;B=i;i=i+8|0;C=B;D=i;i=i+16|0;E=i;i=i+16|0;F=i;i=i+16|0;G=c[e>>2]|0;if(b){if(!((c[1142]|0)==-1)){c[p>>2]=4568;c[p+4>>2]=118;c[p+8>>2]=0;qe(4568,p,119)}p=(c[4572>>2]|0)+ -1|0;b=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-b>>2>>>0>p>>>0)){H=vb(4)|0;I=H;pm(I);cc(H|0,13088,107)}e=c[b+(p<<2)>>2]|0;if((e|0)==0){H=vb(4)|0;I=H;pm(I);cc(H|0,13088,107)}H=e;I=c[e>>2]|0;if(d){nc[c[I+44>>2]&63](r,H);r=f;p=c[q>>2]|0;a[r]=p;a[r+1|0]=p>>8;a[r+2|0]=p>>16;a[r+3|0]=p>>24;nc[c[(c[e>>2]|0)+32>>2]&63](s,H);p=l;if((a[p]&1)==0){a[l+1|0]=0;a[p]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}Ae(l,0);r=s;c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;ve(s)}else{nc[c[I+40>>2]&63](u,H);u=f;I=c[t>>2]|0;a[u]=I;a[u+1|0]=I>>8;a[u+2|0]=I>>16;a[u+3|0]=I>>24;nc[c[(c[e>>2]|0)+28>>2]&63](v,H);I=l;if((a[I]&1)==0){a[l+1|0]=0;a[I]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}Ae(l,0);u=v;c[I+0>>2]=c[u+0>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;ve(v)}v=e;a[g]=pc[c[(c[v>>2]|0)+12>>2]&127](H)|0;a[h]=pc[c[(c[v>>2]|0)+16>>2]&127](H)|0;v=e;nc[c[(c[v>>2]|0)+20>>2]&63](w,H);u=j;if((a[u]&1)==0){a[j+1|0]=0;a[u]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}Ae(j,0);I=w;c[u+0>>2]=c[I+0>>2];c[u+4>>2]=c[I+4>>2];c[u+8>>2]=c[I+8>>2];c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;ve(w);nc[c[(c[v>>2]|0)+24>>2]&63](x,H);v=k;if((a[v]&1)==0){a[k+1|0]=0;a[v]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}Ae(k,0);w=x;c[v+0>>2]=c[w+0>>2];c[v+4>>2]=c[w+4>>2];c[v+8>>2]=c[w+8>>2];c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;ve(x);J=pc[c[(c[e>>2]|0)+36>>2]&127](H)|0;c[m>>2]=J;i=n;return}else{if(!((c[1126]|0)==-1)){c[o>>2]=4504;c[o+4>>2]=118;c[o+8>>2]=0;qe(4504,o,119)}o=(c[4508>>2]|0)+ -1|0;H=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-H>>2>>>0>o>>>0)){K=vb(4)|0;L=K;pm(L);cc(K|0,13088,107)}G=c[H+(o<<2)>>2]|0;if((G|0)==0){K=vb(4)|0;L=K;pm(L);cc(K|0,13088,107)}K=G;L=c[G>>2]|0;if(d){nc[c[L+44>>2]&63](z,K);z=f;d=c[y>>2]|0;a[z]=d;a[z+1|0]=d>>8;a[z+2|0]=d>>16;a[z+3|0]=d>>24;nc[c[(c[G>>2]|0)+32>>2]&63](A,K);d=l;if((a[d]&1)==0){a[l+1|0]=0;a[d]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}Ae(l,0);z=A;c[d+0>>2]=c[z+0>>2];c[d+4>>2]=c[z+4>>2];c[d+8>>2]=c[z+8>>2];c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;ve(A)}else{nc[c[L+40>>2]&63](C,K);C=f;f=c[B>>2]|0;a[C]=f;a[C+1|0]=f>>8;a[C+2|0]=f>>16;a[C+3|0]=f>>24;nc[c[(c[G>>2]|0)+28>>2]&63](D,K);f=l;if((a[f]&1)==0){a[l+1|0]=0;a[f]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}Ae(l,0);l=D;c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;ve(D)}D=G;a[g]=pc[c[(c[D>>2]|0)+12>>2]&127](K)|0;a[h]=pc[c[(c[D>>2]|0)+16>>2]&127](K)|0;D=G;nc[c[(c[D>>2]|0)+20>>2]&63](E,K);h=j;if((a[h]&1)==0){a[j+1|0]=0;a[h]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}Ae(j,0);j=E;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ve(E);nc[c[(c[D>>2]|0)+24>>2]&63](F,K);D=k;if((a[D]&1)==0){a[k+1|0]=0;a[D]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}Ae(k,0);k=F;c[D+0>>2]=c[k+0>>2];c[D+4>>2]=c[k+4>>2];c[D+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;ve(F);J=pc[c[(c[G>>2]|0)+36>>2]&127](K)|0;c[m>>2]=J;i=n;return}}function yj(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s){d=d|0;e=e|0;f=f|0;g=g|0;h=h|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;r=r|0;s=s|0;var 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;t=i;c[f>>2]=d;u=k;v=r;w=r+1|0;x=r+8|0;y=r+4|0;r=q;z=(g&512|0)==0;A=q+1|0;B=q+8|0;C=q+4|0;q=(s|0)>0;D=p;E=p+1|0;F=p+8|0;G=p+4|0;p=k+8|0;H=0-s|0;I=h;h=0;while(1){a:do{switch(a[m+h|0]|0){case 0:{c[e>>2]=c[f>>2];J=I;break};case 2:{K=a[r]|0;L=(K&1)==0;if(L){M=(K&255)>>>1}else{M=c[C>>2]|0}if((M|0)==0|z){J=I;break a}if(L){N=A;O=(K&255)>>>1}else{N=c[B>>2]|0;O=c[C>>2]|0}K=N+O|0;L=c[f>>2]|0;if((N|0)==(K|0)){P=L}else{Q=L;L=N;while(1){a[Q]=a[L]|0;R=L+1|0;S=Q+1|0;if((R|0)==(K|0)){P=S;break}else{L=R;Q=S}}}c[f>>2]=P;J=I;break};case 1:{c[e>>2]=c[f>>2];Q=yc[c[(c[u>>2]|0)+28>>2]&31](k,32)|0;L=c[f>>2]|0;c[f>>2]=L+1;a[L]=Q;J=I;break};case 4:{Q=c[f>>2]|0;L=l?I+1|0:I;b:do{if(L>>>0<j>>>0){K=L;while(1){S=a[K]|0;if(!(S<<24>>24>-1)){T=K;break b}R=K+1|0;if((b[(c[p>>2]|0)+(S<<24>>24<<1)>>1]&2048)==0){T=K;break b}if(R>>>0<j>>>0){K=R}else{T=R;break}}}else{T=L}}while(0);K=T;if(q){if(T>>>0>L>>>0){R=L+(0-K)|0;K=R>>>0<H>>>0?H:R;R=K+s|0;S=Q;U=T;V=s;while(1){W=U+ -1|0;X=a[W]|0;c[f>>2]=S+1;a[S]=X;X=V+ -1|0;Y=(X|0)>0;if(!(W>>>0>L>>>0&Y)){break}S=c[f>>2]|0;V=X;U=W}U=T+K|0;if(Y){Z=U;_=R;$=32}else{aa=0;ba=U;ca=R}}else{Z=T;_=s;$=32}if(($|0)==32){$=0;aa=yc[c[(c[u>>2]|0)+28>>2]&31](k,48)|0;ba=Z;ca=_}U=c[f>>2]|0;c[f>>2]=U+1;if((ca|0)>0){V=U;S=ca;while(1){a[V]=aa;W=S+ -1|0;X=c[f>>2]|0;c[f>>2]=X+1;if((W|0)>0){S=W;V=X}else{da=X;break}}}else{da=U}a[da]=n;ea=ba}else{ea=T}if((ea|0)==(L|0)){V=yc[c[(c[u>>2]|0)+28>>2]&31](k,48)|0;S=c[f>>2]|0;c[f>>2]=S+1;a[S]=V}else{V=a[D]|0;S=(V&1)==0;if(S){fa=(V&255)>>>1}else{fa=c[G>>2]|0}if((fa|0)==0){ga=ea;ha=-1;ia=0;ja=0}else{if(S){ka=E}else{ka=c[F>>2]|0}ga=ea;ha=a[ka]|0;ia=0;ja=0}while(1){do{if((ja|0)==(ha|0)){S=c[f>>2]|0;c[f>>2]=S+1;a[S]=o;S=ia+1|0;V=a[D]|0;R=(V&1)==0;if(R){la=(V&255)>>>1}else{la=c[G>>2]|0}if(!(S>>>0<la>>>0)){ma=ha;na=S;oa=0;break}if(R){pa=E}else{pa=c[F>>2]|0}if((a[pa+S|0]|0)==127){ma=-1;na=S;oa=0;break}if(R){qa=E}else{qa=c[F>>2]|0}ma=a[qa+S|0]|0;na=S;oa=0}else{ma=ha;na=ia;oa=ja}}while(0);S=ga+ -1|0;R=a[S]|0;V=c[f>>2]|0;c[f>>2]=V+1;a[V]=R;if((S|0)==(L|0)){break}else{ga=S;ha=ma;ia=na;ja=oa+1|0}}}U=c[f>>2]|0;if((Q|0)==(U|0)){J=L;break a}S=U+ -1|0;if(S>>>0>Q>>>0){ra=Q;sa=S}else{J=L;break a}while(1){S=a[ra]|0;a[ra]=a[sa]|0;a[sa]=S;S=ra+1|0;U=sa+ -1|0;if(S>>>0<U>>>0){sa=U;ra=S}else{J=L;break}}break};case 3:{L=a[v]|0;Q=(L&1)==0;if(Q){ta=(L&255)>>>1}else{ta=c[y>>2]|0}if((ta|0)==0){J=I;break a}if(Q){ua=w}else{ua=c[x>>2]|0}Q=a[ua]|0;L=c[f>>2]|0;c[f>>2]=L+1;a[L]=Q;J=I;break};default:{J=I}}}while(0);Q=h+1|0;if((Q|0)==4){break}else{I=J;h=Q}}h=a[v]|0;v=(h&1)==0;if(v){va=(h&255)>>>1}else{va=c[y>>2]|0}if(va>>>0>1){if(v){wa=w;xa=(h&255)>>>1}else{wa=c[x>>2]|0;xa=c[y>>2]|0}y=wa+1|0;x=wa+xa|0;xa=c[f>>2]|0;if((y|0)==(x|0)){ya=xa}else{wa=xa;xa=y;while(1){a[wa]=a[xa]|0;y=xa+1|0;h=wa+1|0;if((y|0)==(x|0)){ya=h;break}else{xa=y;wa=h}}}c[f>>2]=ya}ya=g&176;if((ya|0)==32){c[e>>2]=c[f>>2];i=t;return}else if((ya|0)==16){i=t;return}else{c[e>>2]=d;i=t;return}}function zj(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+40|0;k=d;l=d+8|0;m=d+24|0;n=d+32|0;o=n;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+16|0;s=i;i=i+16|0;t=i;i=i+16|0;u=i;i=i+8|0;v=i;i=i+104|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;Qe(m,g);z=m;A=c[z>>2]|0;if(!((c[1282]|0)==-1)){c[l>>2]=5128;c[l+4>>2]=118;c[l+8>>2]=0;qe(5128,l,119)}l=(c[5132>>2]|0)+ -1|0;B=c[A+8>>2]|0;if(!((c[A+12>>2]|0)-B>>2>>>0>l>>>0)){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}A=c[B+(l<<2)>>2]|0;if((A|0)==0){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}C=A;D=j;l=a[D]|0;B=(l&1)==0;if(B){E=(l&255)>>>1}else{E=c[j+4>>2]|0}if((E|0)==0){F=0}else{if(B){G=j+1|0}else{G=c[j+8>>2]|0}B=a[G]|0;F=B<<24>>24==(yc[c[(c[A>>2]|0)+28>>2]&31](C,45)|0)<<24>>24}c[n>>2]=0;n=r;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;n=s;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;A=t;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;xj(f,F,m,o,p,q,r,s,t,u);m=v;v=a[D]|0;D=(v&1)==0;if(D){H=(v&255)>>>1}else{H=c[j+4>>2]|0}f=c[u>>2]|0;if((H|0)>(f|0)){if(D){I=(v&255)>>>1}else{I=c[j+4>>2]|0}D=a[A]|0;if((D&1)==0){J=(D&255)>>>1}else{J=c[t+4>>2]|0}D=a[n]|0;if((D&1)==0){K=(D&255)>>>1}else{K=c[s+4>>2]|0}L=J+(I-f<<1|1)+K|0}else{K=a[A]|0;if((K&1)==0){M=(K&255)>>>1}else{M=c[t+4>>2]|0}K=a[n]|0;if((K&1)==0){N=(K&255)>>>1}else{N=c[s+4>>2]|0}L=M+2+N|0}N=L+f|0;do{if(N>>>0>100){L=Km(N)|0;if((L|0)!=0){O=L;P=L;break}Wm()}else{O=0;P=m}}while(0);if((v&1)==0){Q=j+1|0;R=(v&255)>>>1}else{Q=c[j+8>>2]|0;R=c[j+4>>2]|0}yj(P,w,x,c[g+4>>2]|0,Q,Q+R|0,C,F,o,a[p]|0,a[q]|0,r,s,t,f);c[y>>2]=c[e>>2];e=c[w>>2]|0;w=c[x>>2]|0;x=k;f=y;c[x+0>>2]=c[f+0>>2];ad(b,k,P,e,w,g,h);if((O|0)==0){ve(t);ve(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}Lm(O);ve(t);ve(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}function Aj(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Bj(a){a=a|0;i=i;return}function Cj(b,d,e,f,g,j,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;l=+l;var 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;d=i;i=i+16|0;m=d;n=d+8|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+104|0;r=i;i=i+8|0;s=i;i=i+400|0;t=i;i=i+8|0;u=i;i=i+8|0;v=u;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+400|0;D=i;i=i+8|0;E=i;i=i+8|0;F=i;i=i+8|0;G=q;c[r>>2]=G;q=s;s=o;h[k>>3]=l;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];s=Ab(G|0,100,4880,o|0)|0;do{if(s>>>0>99){do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);o=c[1254]|0;G=n;h[k>>3]=l;c[G>>2]=c[k>>2];c[G+4>>2]=c[k+4>>2];G=rh(r,o,4880,n)|0;o=c[r>>2]|0;if((o|0)==0){Wm()}H=Km(G<<2)|0;I=H;if((H|0)!=0){J=o;K=I;L=I;M=G;break}Wm()}else{J=0;K=0;L=q;M=s}}while(0);Qe(t,g);s=t;q=c[s>>2]|0;if(!((c[1280]|0)==-1)){c[p>>2]=5120;c[p+4>>2]=118;c[p+8>>2]=0;qe(5120,p,119)}p=(c[5124>>2]|0)+ -1|0;n=c[q+8>>2]|0;if(!((c[q+12>>2]|0)-n>>2>>>0>p>>>0)){N=vb(4)|0;O=N;pm(O);cc(N|0,13088,107)}q=c[n+(p<<2)>>2]|0;if((q|0)==0){N=vb(4)|0;O=N;pm(O);cc(N|0,13088,107)}N=q;O=c[r>>2]|0;vc[c[(c[q>>2]|0)+48>>2]&7](N,O,O+M|0,L)|0;if((M|0)==0){P=0}else{P=(a[c[r>>2]|0]|0)==45}c[u>>2]=0;u=y;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;u=z;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;r=A;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;Dj(f,P,t,v,w,x,y,z,A,B);t=C;C=c[B>>2]|0;if((M|0)>(C|0)){B=a[r]|0;if((B&1)==0){Q=(B&255)>>>1}else{Q=c[A+4>>2]|0}B=a[u]|0;if((B&1)==0){R=(B&255)>>>1}else{R=c[z+4>>2]|0}S=Q+(M-C<<1|1)+R|0}else{R=a[r]|0;if((R&1)==0){T=(R&255)>>>1}else{T=c[A+4>>2]|0}R=a[u]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[z+4>>2]|0}S=T+2+U|0}U=S+C|0;do{if(U>>>0>100){S=Km(U<<2)|0;T=S;if((S|0)!=0){V=T;W=T;break}Wm()}else{V=0;W=t}}while(0);Ej(W,D,E,c[g+4>>2]|0,L,L+(M<<2)|0,N,P,v,c[w>>2]|0,c[x>>2]|0,y,z,A,C);c[F>>2]=c[e>>2];e=c[D>>2]|0;D=c[E>>2]|0;E=m;C=F;c[E+0>>2]=c[C+0>>2];Ah(b,m,W,e,D,g,j);if((V|0)!=0){Lm(V)}He(A);He(z);ve(y);Yd(c[s>>2]|0)|0;if((K|0)!=0){Lm(K)}if((J|0)==0){i=d;return}Lm(J);i=d;return}function Dj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,K=0,L=0;n=i;i=i+40|0;o=n;p=n+16|0;q=n+32|0;r=q;s=i;i=i+16|0;t=i;i=i+8|0;u=t;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+8|0;z=y;A=i;i=i+16|0;B=i;i=i+8|0;C=B;D=i;i=i+16|0;E=i;i=i+16|0;F=i;i=i+16|0;G=c[e>>2]|0;if(b){if(!((c[1174]|0)==-1)){c[p>>2]=4696;c[p+4>>2]=118;c[p+8>>2]=0;qe(4696,p,119)}p=(c[4700>>2]|0)+ -1|0;b=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-b>>2>>>0>p>>>0)){H=vb(4)|0;I=H;pm(I);cc(H|0,13088,107)}e=c[b+(p<<2)>>2]|0;if((e|0)==0){H=vb(4)|0;I=H;pm(I);cc(H|0,13088,107)}H=e;I=c[e>>2]|0;if(d){nc[c[I+44>>2]&63](r,H);r=f;p=c[q>>2]|0;a[r]=p;a[r+1|0]=p>>8;a[r+2|0]=p>>16;a[r+3|0]=p>>24;nc[c[(c[e>>2]|0)+32>>2]&63](s,H);p=l;if((a[p]&1)==0){c[l+4>>2]=0;a[p]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ke(l,0);r=s;c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;He(s)}else{nc[c[I+40>>2]&63](u,H);u=f;I=c[t>>2]|0;a[u]=I;a[u+1|0]=I>>8;a[u+2|0]=I>>16;a[u+3|0]=I>>24;nc[c[(c[e>>2]|0)+28>>2]&63](v,H);I=l;if((a[I]&1)==0){c[l+4>>2]=0;a[I]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ke(l,0);u=v;c[I+0>>2]=c[u+0>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;He(v)}v=e;c[g>>2]=pc[c[(c[v>>2]|0)+12>>2]&127](H)|0;c[h>>2]=pc[c[(c[v>>2]|0)+16>>2]&127](H)|0;nc[c[(c[e>>2]|0)+20>>2]&63](w,H);u=j;if((a[u]&1)==0){a[j+1|0]=0;a[u]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}Ae(j,0);I=w;c[u+0>>2]=c[I+0>>2];c[u+4>>2]=c[I+4>>2];c[u+8>>2]=c[I+8>>2];c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;ve(w);nc[c[(c[e>>2]|0)+24>>2]&63](x,H);e=k;if((a[e]&1)==0){c[k+4>>2]=0;a[e]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ke(k,0);w=x;c[e+0>>2]=c[w+0>>2];c[e+4>>2]=c[w+4>>2];c[e+8>>2]=c[w+8>>2];c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;He(x);J=pc[c[(c[v>>2]|0)+36>>2]&127](H)|0;c[m>>2]=J;i=n;return}else{if(!((c[1158]|0)==-1)){c[o>>2]=4632;c[o+4>>2]=118;c[o+8>>2]=0;qe(4632,o,119)}o=(c[4636>>2]|0)+ -1|0;H=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-H>>2>>>0>o>>>0)){K=vb(4)|0;L=K;pm(L);cc(K|0,13088,107)}G=c[H+(o<<2)>>2]|0;if((G|0)==0){K=vb(4)|0;L=K;pm(L);cc(K|0,13088,107)}K=G;L=c[G>>2]|0;if(d){nc[c[L+44>>2]&63](z,K);z=f;d=c[y>>2]|0;a[z]=d;a[z+1|0]=d>>8;a[z+2|0]=d>>16;a[z+3|0]=d>>24;nc[c[(c[G>>2]|0)+32>>2]&63](A,K);d=l;if((a[d]&1)==0){c[l+4>>2]=0;a[d]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ke(l,0);z=A;c[d+0>>2]=c[z+0>>2];c[d+4>>2]=c[z+4>>2];c[d+8>>2]=c[z+8>>2];c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;He(A)}else{nc[c[L+40>>2]&63](C,K);C=f;f=c[B>>2]|0;a[C]=f;a[C+1|0]=f>>8;a[C+2|0]=f>>16;a[C+3|0]=f>>24;nc[c[(c[G>>2]|0)+28>>2]&63](D,K);f=l;if((a[f]&1)==0){c[l+4>>2]=0;a[f]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ke(l,0);l=D;c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;He(D)}D=G;c[g>>2]=pc[c[(c[D>>2]|0)+12>>2]&127](K)|0;c[h>>2]=pc[c[(c[D>>2]|0)+16>>2]&127](K)|0;nc[c[(c[G>>2]|0)+20>>2]&63](E,K);h=j;if((a[h]&1)==0){a[j+1|0]=0;a[h]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}Ae(j,0);j=E;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ve(E);nc[c[(c[G>>2]|0)+24>>2]&63](F,K);G=k;if((a[G]&1)==0){c[k+4>>2]=0;a[G]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ke(k,0);k=F;c[G+0>>2]=c[k+0>>2];c[G+4>>2]=c[k+4>>2];c[G+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;He(F);J=pc[c[(c[D>>2]|0)+36>>2]&127](K)|0;c[m>>2]=J;i=n;return}}function Ej(b,d,e,f,g,h,j,k,l,m,n,o,p,q,r){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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;r=r|0;var 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;s=i;c[e>>2]=b;t=j;u=q;v=q+4|0;w=q+8|0;q=p;x=(f&512|0)==0;y=p+4|0;z=p+8|0;p=(r|0)>0;A=o;B=o+1|0;C=o+8|0;D=o+4|0;o=j;E=g;g=0;while(1){a:do{switch(a[l+g|0]|0){case 1:{c[d>>2]=c[e>>2];F=yc[c[(c[t>>2]|0)+44>>2]&31](j,32)|0;G=c[e>>2]|0;c[e>>2]=G+4;c[G>>2]=F;H=E;break};case 4:{F=c[e>>2]|0;G=k?E+4|0:E;b:do{if(G>>>0<h>>>0){I=G;while(1){J=I+4|0;if(!(jc[c[(c[o>>2]|0)+12>>2]&31](j,2048,c[I>>2]|0)|0)){K=I;break b}if(J>>>0<h>>>0){I=J}else{K=J;break}}}else{K=G}}while(0);if(p){do{if(K>>>0>G>>>0){I=c[e>>2]|0;J=K;L=r;while(1){M=J+ -4|0;N=I+4|0;c[I>>2]=c[M>>2];O=L+ -1|0;P=(O|0)>0;if(M>>>0>G>>>0&P){L=O;J=M;I=N}else{break}}c[e>>2]=N;if(P){Q=M;R=O;S=34;break}I=c[e>>2]|0;c[e>>2]=I+4;T=I;U=M}else{Q=K;R=r;S=34}}while(0);do{if((S|0)==34){S=0;I=yc[c[(c[t>>2]|0)+44>>2]&31](j,48)|0;J=c[e>>2]|0;L=J+4|0;c[e>>2]=L;if((R|0)>0){V=L;W=J;X=R}else{T=J;U=Q;break}while(1){c[W>>2]=I;L=X+ -1|0;if((L|0)>0){X=L;W=V;V=V+4|0}else{break}}c[e>>2]=J+(R+1<<2);T=J+(R<<2)|0;U=Q}}while(0);c[T>>2]=m;Y=U}else{Y=K}if((Y|0)==(G|0)){I=yc[c[(c[t>>2]|0)+44>>2]&31](j,48)|0;L=c[e>>2]|0;Z=L+4|0;c[e>>2]=Z;c[L>>2]=I;_=Z}else{Z=a[A]|0;I=(Z&1)==0;if(I){$=(Z&255)>>>1}else{$=c[D>>2]|0}if(($|0)==0){aa=Y;ba=-1;ca=0;da=0}else{if(I){ea=B}else{ea=c[C>>2]|0}aa=Y;ba=a[ea]|0;ca=0;da=0}while(1){I=c[e>>2]|0;do{if((da|0)==(ba|0)){Z=I+4|0;c[e>>2]=Z;c[I>>2]=n;L=ca+1|0;fa=a[A]|0;ga=(fa&1)==0;if(ga){ha=(fa&255)>>>1}else{ha=c[D>>2]|0}if(!(L>>>0<ha>>>0)){ia=Z;ja=ba;ka=L;la=0;break}if(ga){ma=B}else{ma=c[C>>2]|0}if((a[ma+L|0]|0)==127){ia=Z;ja=-1;ka=L;la=0;break}if(ga){na=B}else{na=c[C>>2]|0}ia=Z;ja=a[na+L|0]|0;ka=L;la=0}else{ia=I;ja=ba;ka=ca;la=da}}while(0);I=aa+ -4|0;J=c[I>>2]|0;L=ia+4|0;c[e>>2]=L;c[ia>>2]=J;if((I|0)==(G|0)){_=L;break}else{aa=I;ba=ja;ca=ka;da=la+1|0}}}if((F|0)==(_|0)){H=G;break a}I=_+ -4|0;if(I>>>0>F>>>0){oa=F;pa=I}else{H=G;break a}while(1){I=c[oa>>2]|0;c[oa>>2]=c[pa>>2];c[pa>>2]=I;I=oa+4|0;L=pa+ -4|0;if(I>>>0<L>>>0){pa=L;oa=I}else{H=G;break}}break};case 3:{G=a[u]|0;F=(G&1)==0;if(F){qa=(G&255)>>>1}else{qa=c[v>>2]|0}if((qa|0)==0){H=E;break a}if(F){ra=v}else{ra=c[w>>2]|0}F=c[ra>>2]|0;G=c[e>>2]|0;c[e>>2]=G+4;c[G>>2]=F;H=E;break};case 0:{c[d>>2]=c[e>>2];H=E;break};case 2:{F=a[q]|0;G=(F&1)==0;if(G){sa=(F&255)>>>1}else{sa=c[y>>2]|0}if((sa|0)==0|x){H=E;break a}if(G){ta=y;ua=(F&255)>>>1}else{ta=c[z>>2]|0;ua=c[y>>2]|0}F=ta+(ua<<2)|0;G=c[e>>2]|0;if((ta|0)==(F|0)){va=G}else{I=(ta+(ua+ -1<<2)+(0-ta)|0)>>>2;L=G;J=ta;while(1){c[L>>2]=c[J>>2];Z=J+4|0;if((Z|0)==(F|0)){break}L=L+4|0;J=Z}va=G+(I+1<<2)|0}c[e>>2]=va;H=E;break};default:{H=E}}}while(0);J=g+1|0;if((J|0)==4){break}else{E=H;g=J}}g=a[u]|0;u=(g&1)==0;if(u){wa=(g&255)>>>1}else{wa=c[v>>2]|0}if(wa>>>0>1){if(u){xa=v;ya=(g&255)>>>1}else{xa=c[w>>2]|0;ya=c[v>>2]|0}v=xa+4|0;w=xa+(ya<<2)|0;g=c[e>>2]|0;if((v|0)==(w|0)){za=g}else{u=(xa+(ya+ -1<<2)+(0-v)|0)>>>2;ya=g;xa=v;while(1){c[ya>>2]=c[xa>>2];v=xa+4|0;if((v|0)==(w|0)){break}else{xa=v;ya=ya+4|0}}za=g+(u+1<<2)|0}c[e>>2]=za}za=f&176;if((za|0)==32){c[d>>2]=c[e>>2];i=s;return}else if((za|0)==16){i=s;return}else{c[d>>2]=b;i=s;return}}function Fj(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+40|0;k=d;l=d+8|0;m=d+24|0;n=d+32|0;o=n;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+16|0;s=i;i=i+16|0;t=i;i=i+16|0;u=i;i=i+8|0;v=i;i=i+400|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;Qe(m,g);z=m;A=c[z>>2]|0;if(!((c[1280]|0)==-1)){c[l>>2]=5120;c[l+4>>2]=118;c[l+8>>2]=0;qe(5120,l,119)}l=(c[5124>>2]|0)+ -1|0;B=c[A+8>>2]|0;if(!((c[A+12>>2]|0)-B>>2>>>0>l>>>0)){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}A=c[B+(l<<2)>>2]|0;if((A|0)==0){C=vb(4)|0;D=C;pm(D);cc(C|0,13088,107)}C=A;D=j;l=a[D]|0;B=(l&1)==0;if(B){E=(l&255)>>>1}else{E=c[j+4>>2]|0}if((E|0)==0){F=0}else{if(B){G=j+4|0}else{G=c[j+8>>2]|0}B=c[G>>2]|0;F=(B|0)==(yc[c[(c[A>>2]|0)+44>>2]&31](C,45)|0)}c[n>>2]=0;n=r;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;n=s;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;A=t;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;Dj(f,F,m,o,p,q,r,s,t,u);m=v;v=a[D]|0;D=(v&1)==0;if(D){H=(v&255)>>>1}else{H=c[j+4>>2]|0}f=c[u>>2]|0;if((H|0)>(f|0)){if(D){I=(v&255)>>>1}else{I=c[j+4>>2]|0}D=a[A]|0;if((D&1)==0){J=(D&255)>>>1}else{J=c[t+4>>2]|0}D=a[n]|0;if((D&1)==0){K=(D&255)>>>1}else{K=c[s+4>>2]|0}L=J+(I-f<<1|1)+K|0}else{K=a[A]|0;if((K&1)==0){M=(K&255)>>>1}else{M=c[t+4>>2]|0}K=a[n]|0;if((K&1)==0){N=(K&255)>>>1}else{N=c[s+4>>2]|0}L=M+2+N|0}N=L+f|0;do{if(N>>>0>100){L=Km(N<<2)|0;M=L;if((L|0)!=0){O=M;P=M;break}Wm()}else{O=0;P=m}}while(0);if((v&1)==0){Q=j+4|0;R=(v&255)>>>1}else{Q=c[j+8>>2]|0;R=c[j+4>>2]|0}Ej(P,w,x,c[g+4>>2]|0,Q,Q+(R<<2)|0,C,F,o,c[p>>2]|0,c[q>>2]|0,r,s,t,f);c[y>>2]=c[e>>2];e=c[w>>2]|0;w=c[x>>2]|0;x=k;f=y;c[x+0>>2]=c[f+0>>2];Ah(b,k,P,e,w,g,h);if((O|0)==0){He(t);He(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}Lm(O);He(t);He(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}function Gj(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Hj(a){a=a|0;i=i;return}function Ij(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=rb(f|0,1)|0;i=e;return d>>>((d|0)!=(-1|0)|0)|0}function Jj(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+16|0;j=d;k=j;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;l=a[h]|0;if((l&1)==0){m=h+1|0;n=h+1|0;o=(l&255)>>>1}else{l=c[h+8>>2]|0;m=l;n=l;o=c[h+4>>2]|0}h=m+o|0;do{if(n>>>0<h>>>0){o=n;do{Be(j,a[o]|0);o=o+1|0;}while((o|0)!=(h|0));o=(e|0)==-1?-1:e<<1;if((a[k]&1)==0){p=o;q=9;break}r=o;s=c[j+8>>2]|0}else{p=(e|0)==-1?-1:e<<1;q=9}}while(0);if((q|0)==9){r=p;s=j+1|0}p=Ub(r|0,f|0,g|0,s|0)|0;s=b;c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;s=on(p|0)|0;g=p+s|0;if((s|0)>0){t=p}else{ve(j);i=d;return}do{Be(b,a[t]|0);t=t+1|0;}while((t|0)!=(g|0));ve(j);i=d;return}function Kj(a,b){a=a|0;b=b|0;a=i;Xa(((b|0)==-1?-1:b<<1)|0)|0;i=a;return}function Lj(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Mj(a){a=a|0;i=i;return}function Nj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=rb(f|0,1)|0;i=e;return d>>>((d|0)!=(-1|0)|0)|0}function Oj(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 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;d=i;i=i+240|0;j=d;k=d+8|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+192|0;q=d+200|0;r=d+208|0;s=d+224|0;t=d+232|0;u=r;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[s+4>>2]=0;c[s>>2]=6784;v=a[h]|0;if((v&1)==0){w=h+4|0;x=h+4|0;y=(v&255)>>>1}else{v=c[h+8>>2]|0;w=v;x=v;y=c[h+4>>2]|0}h=w+(y<<2)|0;y=k;w=j;v=j;c[v>>2]=0;c[v+4>>2]=0;a:do{if(x>>>0<h>>>0){v=s;j=s;z=k+32|0;A=x;B=6784|0;while(1){c[m>>2]=A;C=(uc[c[B+12>>2]&15](v,w,A,h,m,y,z,l)|0)==2;D=c[m>>2]|0;if(C|(D|0)==(A|0)){break}if(y>>>0<(c[l>>2]|0)>>>0){C=y;do{Be(r,a[C]|0);C=C+1|0;}while(C>>>0<(c[l>>2]|0)>>>0);E=c[m>>2]|0}else{E=D}if(!(E>>>0<h>>>0)){break a}A=E;B=c[j>>2]|0}ij(6008)}}while(0);if((a[u]&1)==0){F=r+1|0}else{F=c[r+8>>2]|0}u=Ub(((e|0)==-1?-1:e<<1)|0,f|0,g|0,F|0)|0;F=b;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[t+4>>2]=0;c[t>>2]=6888;F=on(u|0)|0;g=u+F|0;f=n;e=n;c[e>>2]=0;c[e+4>>2]=0;if((F|0)<=0){ve(r);i=d;return}F=t;e=t;t=g;n=o;E=o+128|0;o=u;u=6888|0;while(1){c[q>>2]=o;h=(uc[c[u+16>>2]&15](F,f,o,(t-o|0)>32?o+32|0:g,q,n,E,p)|0)==2;m=c[q>>2]|0;if(h|(m|0)==(o|0)){G=20;break}if(n>>>0<(c[p>>2]|0)>>>0){h=n;do{Le(b,c[h>>2]|0);h=h+4|0;}while(h>>>0<(c[p>>2]|0)>>>0);H=c[q>>2]|0}else{H=m}if(!(H>>>0<g>>>0)){G=25;break}o=H;u=c[e>>2]|0}if((G|0)==20){ij(6008)}else if((G|0)==25){ve(r);i=d;return}}function Pj(a,b){a=a|0;b=b|0;a=i;Xa(((b|0)==-1?-1:b<<1)|0)|0;i=a;return}function Qj(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=5216;e=b+8|0;b=c[e>>2]|0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);if((b|0)==(c[1254]|0)){i=d;return}ib(c[e>>2]|0);i=d;return}function Rj(a){a=a|0;a=vb(8)|0;Zd(a,5008);c[a>>2]=2056;cc(a|0,2096,19)}function Sj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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,N=0,O=0;e=i;i=i+448|0;f=e;g=e+16|0;h=e+32|0;j=e+48|0;k=e+64|0;l=e+80|0;m=e+96|0;n=e+112|0;o=e+128|0;p=e+144|0;q=e+160|0;r=e+176|0;s=e+192|0;t=e+208|0;u=e+224|0;v=e+240|0;w=e+256|0;x=e+272|0;y=e+288|0;z=e+304|0;A=e+320|0;B=e+336|0;C=e+352|0;D=e+368|0;E=e+384|0;F=e+400|0;G=e+416|0;H=e+432|0;c[b+4>>2]=d+ -1;c[b>>2]=5048;d=b+8|0;I=b+12|0;J=b+136|0;a[J]=1;K=b+24|0;c[I>>2]=K;c[d>>2]=K;c[b+16>>2]=J;J=28;L=K;do{if((L|0)==0){M=0}else{c[L>>2]=0;M=c[I>>2]|0}L=M+4|0;c[I>>2]=L;J=J+ -1|0;}while((J|0)!=0);te(b+144|0,5032,1);J=c[d>>2]|0;d=c[I>>2]|0;if((d|0)!=(J|0)){c[I>>2]=d+(~((d+ -4+(0-J)|0)>>>2)<<2)}c[9940>>2]=0;c[2484]=3528;if(!((c[888]|0)==-1)){c[G>>2]=3552;c[G+4>>2]=118;c[G+8>>2]=0;qe(3552,G,119)}Tj(b,9936,(c[3556>>2]|0)+ -1|0);c[9932>>2]=0;c[2482]=3568;if(!((c[898]|0)==-1)){c[F>>2]=3592;c[F+4>>2]=118;c[F+8>>2]=0;qe(3592,F,119)}Tj(b,9928,(c[3596>>2]|0)+ -1|0);c[9916>>2]=0;c[2478]=5144;c[9920>>2]=0;a[9924|0]=0;c[9920>>2]=c[(tb()|0)>>2];if(!((c[1282]|0)==-1)){c[E>>2]=5128;c[E+4>>2]=118;c[E+8>>2]=0;qe(5128,E,119)}Tj(b,9912,(c[5132>>2]|0)+ -1|0);c[9908>>2]=0;c[2476]=6104;if(!((c[1280]|0)==-1)){c[D>>2]=5120;c[D+4>>2]=118;c[D+8>>2]=0;qe(5120,D,119)}Tj(b,9904,(c[5124>>2]|0)+ -1|0);c[9900>>2]=0;c[2474]=6320;if(!((c[1298]|0)==-1)){c[C>>2]=5192;c[C+4>>2]=118;c[C+8>>2]=0;qe(5192,C,119)}Tj(b,9896,(c[5196>>2]|0)+ -1|0);c[9884>>2]=0;c[2470]=5216;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);c[9888>>2]=c[1254];if(!((c[1300]|0)==-1)){c[B>>2]=5200;c[B+4>>2]=118;c[B+8>>2]=0;qe(5200,B,119)}Tj(b,9880,(c[5204>>2]|0)+ -1|0);c[9876>>2]=0;c[2468]=6544;if(!((c[1314]|0)==-1)){c[A>>2]=5256;c[A+4>>2]=118;c[A+8>>2]=0;qe(5256,A,119)}Tj(b,9872,(c[5260>>2]|0)+ -1|0);c[9868>>2]=0;c[2466]=6664;if(!((c[1316]|0)==-1)){c[z>>2]=5264;c[z+4>>2]=118;c[z+8>>2]=0;qe(5264,z,119)}Tj(b,9864,(c[5268>>2]|0)+ -1|0);c[9844>>2]=0;c[2460]=5296;a[9848|0]=46;a[9849|0]=44;c[9852>>2]=0;c[9856>>2]=0;c[9860>>2]=0;if(!((c[1318]|0)==-1)){c[y>>2]=5272;c[y+4>>2]=118;c[y+8>>2]=0;qe(5272,y,119)}Tj(b,9840,(c[5276>>2]|0)+ -1|0);c[9812>>2]=0;c[2452]=5336;c[9816>>2]=46;c[9820>>2]=44;c[9824>>2]=0;c[9828>>2]=0;c[9832>>2]=0;if(!((c[1320]|0)==-1)){c[x>>2]=5280;c[x+4>>2]=118;c[x+8>>2]=0;qe(5280,x,119)}Tj(b,9808,(c[5284>>2]|0)+ -1|0);c[9804>>2]=0;c[2450]=3608;if(!((c[916]|0)==-1)){c[w>>2]=3664;c[w+4>>2]=118;c[w+8>>2]=0;qe(3664,w,119)}Tj(b,9800,(c[3668>>2]|0)+ -1|0);c[9796>>2]=0;c[2448]=3728;if(!((c[946]|0)==-1)){c[v>>2]=3784;c[v+4>>2]=118;c[v+8>>2]=0;qe(3784,v,119)}Tj(b,9792,(c[3788>>2]|0)+ -1|0);c[9788>>2]=0;c[2446]=3800;if(!((c[962]|0)==-1)){c[u>>2]=3848;c[u+4>>2]=118;c[u+8>>2]=0;qe(3848,u,119)}Tj(b,9784,(c[3852>>2]|0)+ -1|0);c[9780>>2]=0;c[2444]=3864;if(!((c[978]|0)==-1)){c[t>>2]=3912;c[t+4>>2]=118;c[t+8>>2]=0;qe(3912,t,119)}Tj(b,9776,(c[3916>>2]|0)+ -1|0);c[9772>>2]=0;c[2442]=4456;if(!((c[1126]|0)==-1)){c[s>>2]=4504;c[s+4>>2]=118;c[s+8>>2]=0;qe(4504,s,119)}Tj(b,9768,(c[4508>>2]|0)+ -1|0);c[9764>>2]=0;c[2440]=4520;if(!((c[1142]|0)==-1)){c[r>>2]=4568;c[r+4>>2]=118;c[r+8>>2]=0;qe(4568,r,119)}Tj(b,9760,(c[4572>>2]|0)+ -1|0);c[9756>>2]=0;c[2438]=4584;if(!((c[1158]|0)==-1)){c[q>>2]=4632;c[q+4>>2]=118;c[q+8>>2]=0;qe(4632,q,119)}Tj(b,9752,(c[4636>>2]|0)+ -1|0);c[9748>>2]=0;c[2436]=4648;if(!((c[1174]|0)==-1)){c[p>>2]=4696;c[p+4>>2]=118;c[p+8>>2]=0;qe(4696,p,119)}Tj(b,9744,(c[4700>>2]|0)+ -1|0);c[9740>>2]=0;c[2434]=4712;if(!((c[1184]|0)==-1)){c[o>>2]=4736;c[o+4>>2]=118;c[o+8>>2]=0;qe(4736,o,119)}Tj(b,9736,(c[4740>>2]|0)+ -1|0);c[9732>>2]=0;c[2432]=4792;if(!((c[1204]|0)==-1)){c[n>>2]=4816;c[n+4>>2]=118;c[n+8>>2]=0;qe(4816,n,119)}Tj(b,9728,(c[4820>>2]|0)+ -1|0);c[9724>>2]=0;c[2430]=4848;if(!((c[1218]|0)==-1)){c[m>>2]=4872;c[m+4>>2]=118;c[m+8>>2]=0;qe(4872,m,119)}Tj(b,9720,(c[4876>>2]|0)+ -1|0);c[9716>>2]=0;c[2428]=4896;if(!((c[1230]|0)==-1)){c[l>>2]=4920;c[l+4>>2]=118;c[l+8>>2]=0;qe(4920,l,119)}Tj(b,9712,(c[4924>>2]|0)+ -1|0);c[9700>>2]=0;c[2424]=3944;c[9704>>2]=3992;if(!((c[1006]|0)==-1)){c[k>>2]=4024;c[k+4>>2]=118;c[k+8>>2]=0;qe(4024,k,119)}Tj(b,9696,(c[4028>>2]|0)+ -1|0);c[9684>>2]=0;c[2420]=4096;c[9688>>2]=4144;if(!((c[1044]|0)==-1)){c[j>>2]=4176;c[j+4>>2]=118;c[j+8>>2]=0;qe(4176,j,119)}Tj(b,9680,(c[4180>>2]|0)+ -1|0);c[9668>>2]=0;c[2416]=6040;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);c[9672>>2]=c[1254];c[2416]=4392;if(!((c[1102]|0)==-1)){c[h>>2]=4408;c[h+4>>2]=118;c[h+8>>2]=0;qe(4408,h,119)}Tj(b,9664,(c[4412>>2]|0)+ -1|0);c[9652>>2]=0;c[2412]=6040;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);c[9656>>2]=c[1254];c[2412]=4424;if(!((c[1110]|0)==-1)){c[g>>2]=4440;c[g+4>>2]=118;c[g+8>>2]=0;qe(4440,g,119)}Tj(b,9648,(c[4444>>2]|0)+ -1|0);c[9644>>2]=0;c[2410]=4936;if(!((c[1240]|0)==-1)){c[f>>2]=4960;c[f+4>>2]=118;c[f+8>>2]=0;qe(4960,f,119)}Tj(b,9640,(c[4964>>2]|0)+ -1|0);c[9636>>2]=0;c[2408]=4976;if((c[1250]|0)==-1){N=c[5004>>2]|0;O=N+ -1|0;Tj(b,9632,O);i=e;return}c[H>>2]=5e3;c[H+4>>2]=118;c[H+8>>2]=0;qe(5e3,H,119);N=c[5004>>2]|0;O=N+ -1|0;Tj(b,9632,O);i=e;return}function Tj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;Xd(b);f=a+8|0;g=a+12|0;a=c[g>>2]|0;h=f;j=c[h>>2]|0;k=a-j>>2;do{if(k>>>0>d>>>0){l=j}else{m=d+1|0;if(k>>>0<m>>>0){Xl(f,m-k|0);l=c[h>>2]|0;break}if(!(k>>>0>m>>>0)){l=j;break}n=j+(m<<2)|0;if((a|0)==(n|0)){l=j;break}c[g>>2]=a+(~((a+ -4+(0-n)|0)>>>2)<<2);l=j}}while(0);j=c[l+(d<<2)>>2]|0;if((j|0)==0){o=l;p=o+(d<<2)|0;c[p>>2]=b;i=e;return}Yd(j)|0;o=c[h>>2]|0;p=o+(d<<2)|0;c[p>>2]=b;i=e;return}function Uj(a){a=a|0;var b=0;b=i;Vj(a);Rm(a);i=b;return}function Vj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;c[b>>2]=5048;e=b+12|0;f=c[e>>2]|0;g=b+8|0;h=c[g>>2]|0;if((f|0)!=(h|0)){j=f;f=h;h=0;while(1){k=c[f+(h<<2)>>2]|0;if((k|0)==0){l=f;m=j}else{Yd(k)|0;l=c[g>>2]|0;m=c[e>>2]|0}k=h+1|0;if(k>>>0<m-l>>2>>>0){j=m;f=l;h=k}else{break}}}ve(b+144|0);h=c[g>>2]|0;if((h|0)==0){i=d;return}g=c[e>>2]|0;if((g|0)!=(h|0)){c[e>>2]=g+(~((g+ -4+(0-h)|0)>>>2)<<2)}if((b+24|0)==(h|0)){a[b+136|0]=0;i=d;return}else{Rm(h);i=d;return}}function Wj(){var b=0,d=0,e=0;b=i;if((a[5104]|0)!=0){d=c[1274]|0;i=b;return d|0}if((Ga(5104)|0)==0){d=c[1274]|0;i=b;return d|0}do{if((a[5080]|0)==0){if((Ga(5080)|0)==0){break}Sj(9472,1);c[1266]=9472;c[1268]=5064;cb(5080)}}while(0);e=c[c[1268]>>2]|0;c[1272]=e;Xd(e);c[1274]=5088;cb(5104);d=c[1274]|0;i=b;return d|0}function Xj(a){a=a|0;var b=0,d=0;b=i;d=c[(Wj()|0)>>2]|0;c[a>>2]=d;Xd(d);i=b;return}function Yj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;c[a>>2]=e;Xd(e);i=d;return}function Zj(a){a=a|0;var b=0;b=i;Yd(c[a>>2]|0)|0;i=b;return}function _j(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=c[a>>2]|0;a=b;if(!((c[a>>2]|0)==-1)){c[e>>2]=b;c[e+4>>2]=118;c[e+8>>2]=0;qe(a,e,119)}e=(c[b+4>>2]|0)+ -1|0;b=c[f+8>>2]|0;if(!((c[f+12>>2]|0)-b>>2>>>0>e>>>0)){g=vb(4)|0;h=g;pm(h);cc(g|0,13088,107)}f=c[b+(e<<2)>>2]|0;if((f|0)==0){g=vb(4)|0;h=g;pm(h);cc(g|0,13088,107)}else{i=d;return f|0}return 0}function $j(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function ak(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}mc[c[(c[a>>2]|0)+4>>2]&255](a);i=b;return}function bk(a){a=a|0;var b=0;b=c[1278]|0;c[1278]=b+1;c[a+4>>2]=b+1;i=i;return}function ck(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function dk(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;a=i;if(!(e>>>0<128)){f=0;i=a;return f|0}f=(b[(c[(tb()|0)>>2]|0)+(e<<1)>>1]&d)<<16>>16!=0;i=a;return f|0}function ek(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;if((d|0)==(e|0)){g=d;i=a;return g|0}else{h=d;j=f}while(1){f=c[h>>2]|0;if(f>>>0<128){k=b[(c[(tb()|0)>>2]|0)+(f<<1)>>1]|0}else{k=0}b[j>>1]=k;f=h+4|0;if((f|0)==(e|0)){g=e;break}else{h=f;j=j+2|0}}i=a;return g|0}function fk(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;a=i;a:do{if((e|0)==(f|0)){g=e}else{h=e;while(1){j=c[h>>2]|0;if(j>>>0<128){if(!((b[(c[(tb()|0)>>2]|0)+(j<<1)>>1]&d)<<16>>16==0)){g=h;break a}}j=h+4|0;if((j|0)==(f|0)){g=f;break}else{h=j}}}}while(0);i=a;return g|0}function gk(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;a:do{if((e|0)==(f|0)){g=e}else{h=e;while(1){j=c[h>>2]|0;if(!(j>>>0<128)){g=h;break a}k=h+4|0;if((b[(c[(tb()|0)>>2]|0)+(j<<1)>>1]&d)<<16>>16==0){g=h;break a}if((k|0)==(f|0)){g=f;break}else{h=k}}}}while(0);i=a;return g|0}function hk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b>>>0<128)){d=b;i=a;return d|0}d=c[(c[(Ja()|0)>>2]|0)+(b<<2)>>2]|0;i=a;return d|0}function ik(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;a=i;if((b|0)==(d|0)){e=b;i=a;return e|0}else{f=b}while(1){b=c[f>>2]|0;if(b>>>0<128){g=c[(c[(Ja()|0)>>2]|0)+(b<<2)>>2]|0}else{g=b}c[f>>2]=g;b=f+4|0;if((b|0)==(d|0)){e=d;break}else{f=b}}i=a;return e|0}function jk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b>>>0<128)){d=b;i=a;return d|0}d=c[(c[(Yb()|0)>>2]|0)+(b<<2)>>2]|0;i=a;return d|0}function kk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;a=i;if((b|0)==(d|0)){e=b;i=a;return e|0}else{f=b}while(1){b=c[f>>2]|0;if(b>>>0<128){g=c[(c[(Yb()|0)>>2]|0)+(b<<2)>>2]|0}else{g=b}c[f>>2]=g;b=f+4|0;if((b|0)==(d|0)){e=d;break}else{f=b}}i=a;return e|0}function lk(a,b){a=a|0;b=b|0;i=i;return b<<24>>24|0}function mk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;b=i;if((d|0)==(e|0)){g=d;i=b;return g|0}else{h=d;j=f}while(1){c[j>>2]=a[h]|0;f=h+1|0;if((f|0)==(e|0)){g=e;break}else{j=j+4|0;h=f}}i=b;return g|0}function nk(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return(b>>>0<128?b&255:c)|0}function ok(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;b=i;if((d|0)==(e|0)){h=d;i=b;return h|0}j=((e+ -4+(0-d)|0)>>>2)+1|0;k=d;l=g;while(1){g=c[k>>2]|0;a[l]=g>>>0<128?g&255:f;g=k+4|0;if((g|0)==(e|0)){break}else{l=l+1|0;k=g}}h=d+(j<<2)|0;i=b;return h|0}function pk(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=5144;e=c[b+8>>2]|0;do{if((e|0)!=0){if((a[b+12|0]|0)==0){break}Sm(e)}}while(0);Rm(b);i=d;return}function qk(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=5144;e=c[b+8>>2]|0;if((e|0)==0){i=d;return}if((a[b+12|0]|0)==0){i=d;return}Sm(e);i=d;return}function rk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b<<24>>24>-1)){d=b;i=a;return d|0}d=c[(c[(Ja()|0)>>2]|0)+((b&255)<<2)>>2]&255;i=a;return d|0}function sk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;if((d|0)==(e|0)){f=d;i=b;return f|0}else{g=d}while(1){d=a[g]|0;if(d<<24>>24>-1){h=c[(c[(Ja()|0)>>2]|0)+(d<<24>>24<<2)>>2]&255}else{h=d}a[g]=h;d=g+1|0;if((d|0)==(e|0)){f=e;break}else{g=d}}i=b;return f|0}function tk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b<<24>>24>-1)){d=b;i=a;return d|0}d=c[(c[(Yb()|0)>>2]|0)+(b<<24>>24<<2)>>2]&255;i=a;return d|0}function uk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;if((d|0)==(e|0)){f=d;i=b;return f|0}else{g=d}while(1){d=a[g]|0;if(d<<24>>24>-1){h=c[(c[(Yb()|0)>>2]|0)+(d<<24>>24<<2)>>2]&255}else{h=d}a[g]=h;d=g+1|0;if((d|0)==(e|0)){f=e;break}else{g=d}}i=b;return f|0}function vk(a,b){a=a|0;b=b|0;i=i;return b|0}function wk(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=i;if((c|0)==(d|0)){f=c}else{g=c;c=e;while(1){a[c]=a[g]|0;e=g+1|0;if((e|0)==(d|0)){f=d;break}else{c=c+1|0;g=e}}}i=b;return f|0}function xk(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return(b<<24>>24>-1?b:c)|0}function yk(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,j=0;b=i;if((c|0)==(d|0)){g=c;i=b;return g|0}else{h=c;j=f}while(1){f=a[h]|0;a[j]=f<<24>>24>-1?f:e;f=h+1|0;if((f|0)==(d|0)){g=d;break}else{j=j+1|0;h=f}}i=b;return g|0}function zk(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Ak(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;c[f>>2]=d;c[j>>2]=g;i=i;return 3}function Bk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;c[f>>2]=d;c[j>>2]=g;i=i;return 3}function Ck(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function Dk(a){a=a|0;i=i;return 1}function Ek(a){a=a|0;i=i;return 1}function Fk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=d-c|0;i=i;return(b>>>0<e>>>0?b:e)|0}function Gk(a){a=a|0;i=i;return 1}function Hk(a){a=a|0;var b=0;b=i;Qj(a);Rm(a);i=b;return}function Ik(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;l=i;i=i+8|0;m=l;n=m;o=i;i=i+8|0;p=(e|0)==(f|0);a:do{if(p){c[k>>2]=h;c[g>>2]=e;q=e}else{r=e;while(1){s=r+4|0;if((c[r>>2]|0)==0){t=r;break}if((s|0)==(f|0)){t=f;break}else{r=s}}c[k>>2]=h;c[g>>2]=e;if(p|(h|0)==(j|0)){q=e;break}r=d;s=j;u=b+8|0;v=o;w=e;x=h;y=t;while(1){z=r;A=c[z+4>>2]|0;B=m;c[B>>2]=c[z>>2];c[B+4>>2]=A;A=zb(c[u>>2]|0)|0;B=im(x,g,y-w>>2,s-x|0,d)|0;if((A|0)!=0){zb(A|0)|0}if((B|0)==-1){C=10;break}else if((B|0)==0){D=1;C=33;break}A=(c[k>>2]|0)+B|0;c[k>>2]=A;if((A|0)==(j|0)){C=31;break}if((y|0)==(f|0)){E=c[g>>2]|0;F=A;G=f}else{A=zb(c[u>>2]|0)|0;B=hm(v,0,d)|0;if((A|0)!=0){zb(A|0)|0}if((B|0)==-1){D=2;C=33;break}A=c[k>>2]|0;if(B>>>0>(s-A|0)>>>0){D=1;C=33;break}b:do{if((B|0)!=0){z=A;H=B;I=v;while(1){J=a[I]|0;c[k>>2]=z+1;a[z]=J;J=H+ -1|0;if((J|0)==0){break b}z=c[k>>2]|0;I=I+1|0;H=J}}}while(0);B=(c[g>>2]|0)+4|0;c[g>>2]=B;c:do{if((B|0)==(f|0)){K=f}else{A=B;while(1){H=A+4|0;if((c[A>>2]|0)==0){K=A;break c}if((H|0)==(f|0)){K=f;break}else{A=H}}}}while(0);E=B;F=c[k>>2]|0;G=K}if((E|0)==(f|0)|(F|0)==(j|0)){q=E;break a}else{w=E;x=F;y=G}}if((C|0)==10){c[k>>2]=x;d:do{if((w|0)==(c[g>>2]|0)){L=w}else{y=w;v=x;while(1){s=c[y>>2]|0;r=zb(c[u>>2]|0)|0;A=hm(v,s,n)|0;if((r|0)!=0){zb(r|0)|0}if((A|0)==-1){L=y;break d}r=(c[k>>2]|0)+A|0;c[k>>2]=r;A=y+4|0;if((A|0)==(c[g>>2]|0)){L=A;break}else{y=A;v=r}}}}while(0);c[g>>2]=L;D=2;i=l;return D|0}else if((C|0)==31){q=c[g>>2]|0;break}else if((C|0)==33){i=l;return D|0}}}while(0);D=(q|0)!=(f|0)|0;i=l;return D|0}function Jk(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;l=i;i=i+8|0;m=l;n=m;o=(e|0)==(f|0);a:do{if(o){c[k>>2]=h;c[g>>2]=e;p=e}else{q=e;while(1){r=q+1|0;if((a[q]|0)==0){s=q;break}if((r|0)==(f|0)){s=f;break}else{q=r}}c[k>>2]=h;c[g>>2]=e;if(o|(h|0)==(j|0)){p=e;break}q=d;r=j;t=b+8|0;u=e;v=h;w=s;while(1){x=q;y=c[x+4>>2]|0;z=m;c[z>>2]=c[x>>2];c[z+4>>2]=y;A=w;y=zb(c[t>>2]|0)|0;z=em(v,g,A-u|0,r-v>>2,d)|0;if((y|0)!=0){zb(y|0)|0}if((z|0)==-1){B=10;break}else if((z|0)==0){C=2;B=32;break}y=(c[k>>2]|0)+(z<<2)|0;c[k>>2]=y;if((y|0)==(j|0)){B=30;break}z=c[g>>2]|0;if((w|0)==(f|0)){D=z;E=y;F=f}else{x=zb(c[t>>2]|0)|0;G=dm(y,z,1,d)|0;if((x|0)!=0){zb(x|0)|0}if((G|0)!=0){C=2;B=32;break}c[k>>2]=(c[k>>2]|0)+4;G=(c[g>>2]|0)+1|0;c[g>>2]=G;b:do{if((G|0)==(f|0)){H=f}else{x=G;while(1){z=x+1|0;if((a[x]|0)==0){H=x;break b}if((z|0)==(f|0)){H=f;break}else{x=z}}}}while(0);D=G;E=c[k>>2]|0;F=H}if((D|0)==(f|0)|(E|0)==(j|0)){p=D;break a}else{u=D;v=E;w=F}}if((B|0)==10){c[k>>2]=v;c:do{if((u|0)==(c[g>>2]|0)){I=u}else{w=u;r=v;while(1){q=zb(c[t>>2]|0)|0;x=dm(r,w,A-w|0,n)|0;if((q|0)!=0){zb(q|0)|0}if((x|0)==-1){B=15;break}else if((x|0)==-2){B=16;break}else if((x|0)==0){J=w+1|0}else{J=w+x|0}x=(c[k>>2]|0)+4|0;c[k>>2]=x;if((J|0)==(c[g>>2]|0)){I=J;break c}else{w=J;r=x}}if((B|0)==15){c[g>>2]=w;C=2;i=l;return C|0}else if((B|0)==16){c[g>>2]=w;C=1;i=l;return C|0}}}while(0);c[g>>2]=I;C=(I|0)!=(f|0)|0;i=l;return C|0}else if((B|0)==30){p=c[g>>2]|0;break}else if((B|0)==32){i=l;return C|0}}}while(0);C=(p|0)!=(f|0)|0;i=l;return C|0}function Kk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+8|0;c[g>>2]=e;e=h;j=zb(c[b+8>>2]|0)|0;b=hm(e,0,d)|0;if((j|0)!=0){zb(j|0)|0}if((b|0)==0|(b|0)==-1){k=2;i=h;return k|0}j=b+ -1|0;b=c[g>>2]|0;if(j>>>0>(f-b|0)>>>0){k=1;i=h;return k|0}if((j|0)==0){k=0;i=h;return k|0}else{l=b;m=j;n=e}while(1){e=a[n]|0;c[g>>2]=l+1;a[l]=e;e=m+ -1|0;if((e|0)==0){k=0;break}l=c[g>>2]|0;n=n+1|0;m=e}i=h;return k|0}function Lk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+8|0;a=zb(c[d>>2]|0)|0;e=gm(0,0,4)|0;if((a|0)!=0){zb(a|0)|0}do{if((e|0)==0){a=c[d>>2]|0;if((a|0)==0){f=1;break}g=zb(a|0)|0;if((g|0)==0){f=0;break}zb(g|0)|0;f=0}else{f=-1}}while(0);i=b;return f|0}function Mk(a){a=a|0;i=i;return 0}function Nk(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;if((f|0)==0|(d|0)==(e|0)){h=0;i=g;return h|0}j=e;k=a+8|0;a=d;d=0;l=0;while(1){m=zb(c[k>>2]|0)|0;n=cm(a,j-a|0,b)|0;if((m|0)!=0){zb(m|0)|0}if((n|0)==0){o=a+1|0;p=1}else if((n|0)==-2|(n|0)==-1){h=d;q=9;break}else{o=a+n|0;p=n}n=p+d|0;m=l+1|0;if(m>>>0>=f>>>0|(o|0)==(e|0)){h=n;q=9;break}else{a=o;d=n;l=m}}if((q|0)==9){i=g;return h|0}return 0}function Ok(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+8>>2]|0;do{if((d|0)==0){e=1}else{a=zb(d|0)|0;if((a|0)==0){e=4;break}zb(a|0)|0;e=4}}while(0);i=b;return e|0}function Pk(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Qk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Rk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d>>1<<1);c[j>>2]=g+((c[k>>2]|0)-g);i=b;return l|0}function Rk(d,f,g,h,j,k,l,m){d=d|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;c[g>>2]=d;c[k>>2]=h;do{if((m&2|0)!=0){if((j-h|0)<3){o=1;i=n;return o|0}else{c[k>>2]=h+1;a[h]=-17;d=c[k>>2]|0;c[k>>2]=d+1;a[d]=-69;d=c[k>>2]|0;c[k>>2]=d+1;a[d]=-65;break}}}while(0);h=f;m=c[g>>2]|0;if(!(m>>>0<f>>>0)){o=0;i=n;return o|0}d=j;j=m;a:while(1){m=b[j>>1]|0;p=m&65535;if(p>>>0>l>>>0){o=2;q=26;break}do{if((m&65535)<128){r=c[k>>2]|0;if((d-r|0)<1){o=1;q=26;break a}c[k>>2]=r+1;a[r]=m}else{if((m&65535)<2048){r=c[k>>2]|0;if((d-r|0)<2){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>6|192;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if((m&65535)<55296){r=c[k>>2]|0;if((d-r|0)<3){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>12|224;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p>>>6&63|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if(!((m&65535)<56320)){if((m&65535)<57344){o=2;q=26;break a}r=c[k>>2]|0;if((d-r|0)<3){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>12|224;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p>>>6&63|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if((h-j|0)<4){o=1;q=26;break a}r=j+2|0;s=e[r>>1]|0;if((s&64512|0)!=56320){o=2;q=26;break a}if((d-(c[k>>2]|0)|0)<4){o=1;q=26;break a}t=p&960;if(((t<<10)+65536|p<<10&64512|s&1023)>>>0>l>>>0){o=2;q=26;break a}c[g>>2]=r;r=(t>>>6)+1|0;t=c[k>>2]|0;c[k>>2]=t+1;a[t]=r>>>2|240;t=c[k>>2]|0;c[k>>2]=t+1;a[t]=p>>>2&15|r<<4&48|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p<<4&48|s>>>6&15|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=s&63|128}}while(0);p=(c[g>>2]|0)+2|0;c[g>>2]=p;if(p>>>0<f>>>0){j=p}else{o=0;q=26;break}}if((q|0)==26){i=n;return o|0}return 0}function Sk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Tk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d);c[j>>2]=g+((c[k>>2]|0)-g>>1<<1);i=b;return l|0}function Tk(e,f,g,h,j,k,l,m){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;c[g>>2]=e;c[k>>2]=h;h=c[g>>2]|0;do{if((m&4|0)==0){o=h}else{if((f-h|0)<=2){o=h;break}if(!((a[h]|0)==-17)){o=h;break}if(!((a[h+1|0]|0)==-69)){o=h;break}if(!((a[h+2|0]|0)==-65)){o=h;break}e=h+3|0;c[g>>2]=e;o=e}}while(0);a:do{if(o>>>0<f>>>0){h=f;m=j;e=o;p=c[k>>2]|0;b:while(1){if(!(p>>>0<j>>>0)){q=e;break a}r=a[e]|0;s=r&255;if(s>>>0>l>>>0){t=2;u=41;break}do{if(r<<24>>24>-1){b[p>>1]=r&255;c[g>>2]=e+1}else{if((r&255)<194){t=2;u=41;break b}if((r&255)<224){if((h-e|0)<2){t=1;u=41;break b}v=d[e+1|0]|0;if((v&192|0)!=128){t=2;u=41;break b}w=v&63|s<<6&1984;if(w>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=w;c[g>>2]=e+2;break}if((r&255)<240){if((h-e|0)<3){t=1;u=41;break b}w=a[e+1|0]|0;v=a[e+2|0]|0;if((s|0)==224){if(!((w&-32)<<24>>24==-96)){t=2;u=41;break b}}else if((s|0)==237){if(!((w&-32)<<24>>24==-128)){t=2;u=41;break b}}else{if(!((w&-64)<<24>>24==-128)){t=2;u=41;break b}}x=v&255;if((x&192|0)!=128){t=2;u=41;break b}v=(w&255)<<6&4032|s<<12|x&63;if((v&65535)>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=v;c[g>>2]=e+3;break}if(!((r&255)<245)){t=2;u=41;break b}if((h-e|0)<4){t=1;u=41;break b}v=a[e+1|0]|0;x=a[e+2|0]|0;w=a[e+3|0]|0;if((s|0)==244){if(!((v&-16)<<24>>24==-128)){t=2;u=41;break b}}else if((s|0)==240){if(!((v+112<<24>>24&255)<48)){t=2;u=41;break b}}else{if(!((v&-64)<<24>>24==-128)){t=2;u=41;break b}}y=x&255;if((y&192|0)!=128){t=2;u=41;break b}x=w&255;if((x&192|0)!=128){t=2;u=41;break b}if((m-p|0)<4){t=1;u=41;break b}w=s&7;z=v&255;v=y<<6;A=x&63;if((z<<12&258048|w<<18|v&4032|A)>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=z<<2&60|y>>>4&3|((z>>>4&3|w<<2)<<6)+16320|55296;w=p+2|0;c[k>>2]=w;b[w>>1]=A|v&960|56320;c[g>>2]=(c[g>>2]|0)+4}}while(0);s=(c[k>>2]|0)+2|0;c[k>>2]=s;r=c[g>>2]|0;if(r>>>0<f>>>0){e=r;p=s}else{q=r;break a}}if((u|0)==41){i=n;return t|0}}else{q=o}}while(0);t=q>>>0<f>>>0|0;i=n;return t|0}function Uk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function Vk(a){a=a|0;i=i;return 0}function Wk(a){a=a|0;i=i;return 0}function Xk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=i;a=Yk(c,d,e,1114111,0)|0;i=b;return a|0}function Yk(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;do{if((g&4|0)==0){j=b}else{if((c-b|0)<=2){j=b;break}if(!((a[b]|0)==-17)){j=b;break}if(!((a[b+1|0]|0)==-69)){j=b;break}j=(a[b+2|0]|0)==-65?b+3|0:b}}while(0);a:do{if(j>>>0<c>>>0&(e|0)!=0){g=c;k=j;l=0;b:while(1){m=a[k]|0;n=m&255;if(n>>>0>f>>>0){o=k;break a}do{if(m<<24>>24>-1){p=k+1|0;q=l}else{if((m&255)<194){o=k;break a}if((m&255)<224){if((g-k|0)<2){o=k;break a}r=d[k+1|0]|0;if((r&192|0)!=128){o=k;break a}if((r&63|n<<6&1984)>>>0>f>>>0){o=k;break a}p=k+2|0;q=l;break}if((m&255)<240){s=k;if((g-s|0)<3){o=k;break a}r=a[k+1|0]|0;t=a[k+2|0]|0;if((n|0)==224){if(!((r&-32)<<24>>24==-96)){u=21;break b}}else if((n|0)==237){if(!((r&-32)<<24>>24==-128)){u=23;break b}}else{if(!((r&-64)<<24>>24==-128)){u=25;break b}}v=t&255;if((v&192|0)!=128){o=k;break a}if(((r&255)<<6&4032|n<<12&61440|v&63)>>>0>f>>>0){o=k;break a}p=k+3|0;q=l;break}if(!((m&255)<245)){o=k;break a}w=k;if((g-w|0)<4){o=k;break a}if((e-l|0)>>>0<2){o=k;break a}v=a[k+1|0]|0;r=a[k+2|0]|0;t=a[k+3|0]|0;if((n|0)==244){if(!((v&-16)<<24>>24==-128)){u=36;break b}}else if((n|0)==240){if(!((v+112<<24>>24&255)<48)){u=34;break b}}else{if(!((v&-64)<<24>>24==-128)){u=38;break b}}x=r&255;if((x&192|0)!=128){o=k;break a}r=t&255;if((r&192|0)!=128){o=k;break a}if(((v&255)<<12&258048|n<<18&1835008|x<<6&4032|r&63)>>>0>f>>>0){o=k;break a}p=k+4|0;q=l+1|0}}while(0);n=q+1|0;if(p>>>0<c>>>0&n>>>0<e>>>0){k=p;l=n}else{o=p;break a}}if((u|0)==21){y=s-b|0;i=h;return y|0}else if((u|0)==23){y=s-b|0;i=h;return y|0}else if((u|0)==25){y=s-b|0;i=h;return y|0}else if((u|0)==34){y=w-b|0;i=h;return y|0}else if((u|0)==36){y=w-b|0;i=h;return y|0}else if((u|0)==38){y=w-b|0;i=h;return y|0}}else{o=j}}while(0);y=o-b|0;i=h;return y|0}function Zk(a){a=a|0;i=i;return 4}function _k(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function $k(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=al(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d>>2<<2);c[j>>2]=g+((c[k>>2]|0)-g);i=b;return l|0}function al(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;l=i;c[e>>2]=b;c[h>>2]=f;do{if((k&2|0)!=0){if((g-f|0)<3){m=1;i=l;return m|0}else{c[h>>2]=f+1;a[f]=-17;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=-69;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=-65;break}}}while(0);f=c[e>>2]|0;if(!(f>>>0<d>>>0)){m=0;i=l;return m|0}k=g;g=f;a:while(1){f=c[g>>2]|0;if((f&-2048|0)==55296|f>>>0>j>>>0){m=2;n=19;break}do{if(f>>>0<128){b=c[h>>2]|0;if((k-b|0)<1){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f}else{if(f>>>0<2048){b=c[h>>2]|0;if((k-b|0)<2){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>6|192;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f&63|128;break}b=c[h>>2]|0;o=k-b|0;if(f>>>0<65536){if((o|0)<3){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>12|224;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=f>>>6&63|128;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=f&63|128;break}else{if((o|0)<4){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>18|240;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f>>>12&63|128;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f>>>6&63|128;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f&63|128;break}}}while(0);f=(c[e>>2]|0)+4|0;c[e>>2]=f;if(f>>>0<d>>>0){g=f}else{m=0;n=19;break}}if((n|0)==19){i=l;return m|0}return 0}function bl(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=cl(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d);c[j>>2]=g+((c[k>>2]|0)-g>>2<<2);i=b;return l|0}function cl(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|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,u=0,v=0,w=0;m=i;c[f>>2]=b;c[j>>2]=g;g=c[f>>2]|0;do{if((l&4|0)==0){n=g}else{if((e-g|0)<=2){n=g;break}if(!((a[g]|0)==-17)){n=g;break}if(!((a[g+1|0]|0)==-69)){n=g;break}if(!((a[g+2|0]|0)==-65)){n=g;break}b=g+3|0;c[f>>2]=b;n=b}}while(0);a:do{if(n>>>0<e>>>0){g=e;l=n;b=c[j>>2]|0;while(1){if(!(b>>>0<h>>>0)){o=l;p=39;break a}q=a[l]|0;r=q&255;do{if(q<<24>>24>-1){if(r>>>0>k>>>0){s=2;break a}c[b>>2]=r;c[f>>2]=l+1}else{if((q&255)<194){s=2;break a}if((q&255)<224){if((g-l|0)<2){s=1;break a}t=d[l+1|0]|0;if((t&192|0)!=128){s=2;break a}u=t&63|r<<6&1984;if(u>>>0>k>>>0){s=2;break a}c[b>>2]=u;c[f>>2]=l+2;break}if((q&255)<240){if((g-l|0)<3){s=1;break a}u=a[l+1|0]|0;t=a[l+2|0]|0;if((r|0)==224){if(!((u&-32)<<24>>24==-96)){s=2;break a}}else if((r|0)==237){if(!((u&-32)<<24>>24==-128)){s=2;break a}}else{if(!((u&-64)<<24>>24==-128)){s=2;break a}}v=t&255;if((v&192|0)!=128){s=2;break a}t=(u&255)<<6&4032|r<<12&61440|v&63;if(t>>>0>k>>>0){s=2;break a}c[b>>2]=t;c[f>>2]=l+3;break}if(!((q&255)<245)){s=2;break a}if((g-l|0)<4){s=1;break a}t=a[l+1|0]|0;v=a[l+2|0]|0;u=a[l+3|0]|0;if((r|0)==244){if(!((t&-16)<<24>>24==-128)){s=2;break a}}else if((r|0)==240){if(!((t+112<<24>>24&255)<48)){s=2;break a}}else{if(!((t&-64)<<24>>24==-128)){s=2;break a}}w=v&255;if((w&192|0)!=128){s=2;break a}v=u&255;if((v&192|0)!=128){s=2;break a}u=(t&255)<<12&258048|r<<18&1835008|w<<6&4032|v&63;if(u>>>0>k>>>0){s=2;break a}c[b>>2]=u;c[f>>2]=l+4}}while(0);r=(c[j>>2]|0)+4|0;c[j>>2]=r;q=c[f>>2]|0;if(q>>>0<e>>>0){l=q;b=r}else{o=q;p=39;break}}}else{o=n;p=39}}while(0);if((p|0)==39){s=o>>>0<e>>>0|0}i=m;return s|0}function dl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function el(a){a=a|0;i=i;return 0}function fl(a){a=a|0;i=i;return 0}function gl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=i;a=hl(c,d,e,1114111,0)|0;i=b;return a|0}function hl(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;do{if((g&4|0)==0){j=b}else{if((c-b|0)<=2){j=b;break}if(!((a[b]|0)==-17)){j=b;break}if(!((a[b+1|0]|0)==-69)){j=b;break}j=(a[b+2|0]|0)==-65?b+3|0:b}}while(0);a:do{if(j>>>0<c>>>0&(e|0)!=0){g=c;k=j;l=1;b:while(1){m=a[k]|0;n=m&255;do{if(m<<24>>24>-1){if(n>>>0>f>>>0){o=k;break a}p=k+1|0}else{if((m&255)<194){o=k;break a}if((m&255)<224){if((g-k|0)<2){o=k;break a}q=d[k+1|0]|0;if((q&192|0)!=128){o=k;break a}if((q&63|n<<6&1984)>>>0>f>>>0){o=k;break a}p=k+2|0;break}if((m&255)<240){r=k;if((g-r|0)<3){o=k;break a}q=a[k+1|0]|0;s=a[k+2|0]|0;if((n|0)==224){if(!((q&-32)<<24>>24==-96)){t=21;break b}}else if((n|0)==237){if(!((q&-32)<<24>>24==-128)){t=23;break b}}else{if(!((q&-64)<<24>>24==-128)){t=25;break b}}u=s&255;if((u&192|0)!=128){o=k;break a}if(((q&255)<<6&4032|n<<12&61440|u&63)>>>0>f>>>0){o=k;break a}p=k+3|0;break}if(!((m&255)<245)){o=k;break a}v=k;if((g-v|0)<4){o=k;break a}u=a[k+1|0]|0;q=a[k+2|0]|0;s=a[k+3|0]|0;if((n|0)==244){if(!((u&-16)<<24>>24==-128)){t=35;break b}}else if((n|0)==240){if(!((u+112<<24>>24&255)<48)){t=33;break b}}else{if(!((u&-64)<<24>>24==-128)){t=37;break b}}w=q&255;if((w&192|0)!=128){o=k;break a}q=s&255;if((q&192|0)!=128){o=k;break a}if(((u&255)<<12&258048|n<<18&1835008|w<<6&4032|q&63)>>>0>f>>>0){o=k;break a}p=k+4|0}}while(0);if(!(p>>>0<c>>>0&l>>>0<e>>>0)){o=p;break a}k=p;l=l+1|0}if((t|0)==21){x=r-b|0;i=h;return x|0}else if((t|0)==23){x=r-b|0;i=h;return x|0}else if((t|0)==25){x=r-b|0;i=h;return x|0}else if((t|0)==33){x=v-b|0;i=h;return x|0}else if((t|0)==35){x=v-b|0;i=h;return x|0}else if((t|0)==37){x=v-b|0;i=h;return x|0}}else{o=j}}while(0);x=o-b|0;i=h;return x|0}function il(a){a=a|0;i=i;return 4}function jl(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function kl(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function ll(a){a=a|0;var b=0;b=i;c[a>>2]=5296;ve(a+12|0);Rm(a);i=b;return}function ml(a){a=a|0;var b=0;b=i;c[a>>2]=5296;ve(a+12|0);i=b;return}function nl(a){a=a|0;var b=0;b=i;c[a>>2]=5336;ve(a+16|0);Rm(a);i=b;return}function ol(a){a=a|0;var b=0;b=i;c[a>>2]=5336;ve(a+16|0);i=b;return}function pl(b){b=b|0;i=i;return a[b+8|0]|0}function ql(a){a=a|0;i=i;return c[a+8>>2]|0}function rl(b){b=b|0;i=i;return a[b+9|0]|0}function sl(a){a=a|0;i=i;return c[a+12>>2]|0}function tl(a,b){a=a|0;b=b|0;var c=0;c=i;se(a,b+12|0);i=c;return}function ul(a,b){a=a|0;b=b|0;var c=0;c=i;se(a,b+16|0);i=c;return}function vl(a,b){a=a|0;b=b|0;b=i;te(a,5368,4);i=b;return}function wl(a,b){a=a|0;b=b|0;b=i;Fe(a,5376,km(5376)|0);i=b;return}function xl(a,b){a=a|0;b=b|0;b=i;te(a,5400,5);i=b;return}function yl(a,b){a=a|0;b=b|0;b=i;Fe(a,5408,km(5408)|0);i=b;return}function zl(b){b=b|0;var d=0;b=i;if((a[5440]|0)!=0){d=c[1358]|0;i=b;return d|0}if((Ga(5440)|0)==0){d=c[1358]|0;i=b;return d|0}do{if((a[12640]|0)==0){if((Ga(12640)|0)==0){break}jn(12472,0,168)|0;gc(122,0,q|0)|0;cb(12640)}}while(0);xe(12472,12648)|0;xe(12484|0,12656)|0;xe(12496|0,12664)|0;xe(12508|0,12672)|0;xe(12520|0,12688)|0;xe(12532|0,12704)|0;xe(12544|0,12712)|0;xe(12556|0,12728)|0;xe(12568|0,12736)|0;xe(12580|0,12744)|0;xe(12592|0,12752)|0;xe(12604|0,12760)|0;xe(12616|0,12768)|0;xe(12628|0,12776)|0;c[1358]=12472;cb(5440);d=c[1358]|0;i=b;return d|0}function Al(b){b=b|0;var d=0;b=i;if((a[5456]|0)!=0){d=c[1362]|0;i=b;return d|0}if((Ga(5456)|0)==0){d=c[1362]|0;i=b;return d|0}do{if((a[12104]|0)==0){if((Ga(12104)|0)==0){break}jn(11936,0,168)|0;gc(123,0,q|0)|0;cb(12104)}}while(0);Ie(11936,12112)|0;Ie(11948|0,12144)|0;Ie(11960|0,12176)|0;Ie(11972|0,12208)|0;Ie(11984|0,12248)|0;Ie(11996|0,12288)|0;Ie(12008|0,12320)|0;Ie(12020|0,12360)|0;Ie(12032|0,12376)|0;Ie(12044|0,12392)|0;Ie(12056|0,12408)|0;Ie(12068|0,12424)|0;Ie(12080|0,12440)|0;Ie(12092|0,12456)|0;c[1362]=11936;cb(5456);d=c[1362]|0;i=b;return d|0}function Bl(b){b=b|0;var d=0;b=i;if((a[5472]|0)!=0){d=c[1366]|0;i=b;return d|0}if((Ga(5472)|0)==0){d=c[1366]|0;i=b;return d|0}do{if((a[11712]|0)==0){if((Ga(11712)|0)==0){break}jn(11424,0,288)|0;gc(124,0,q|0)|0;cb(11712)}}while(0);xe(11424,11720)|0;xe(11436|0,11728)|0;xe(11448|0,11744)|0;xe(11460|0,11752)|0;xe(11472|0,11760)|0;xe(11484|0,11768)|0;xe(11496|0,11776)|0;xe(11508|0,11784)|0;xe(11520|0,11792)|0;xe(11532|0,11808)|0;xe(11544|0,11816)|0;xe(11556|0,11832)|0;xe(11568|0,11848)|0;xe(11580|0,11856)|0;xe(11592|0,11864)|0;xe(11604|0,11872)|0;xe(11616|0,11760)|0;xe(11628|0,11880)|0;xe(11640|0,11888)|0;xe(11652|0,11896)|0;xe(11664|0,11904)|0;xe(11676|0,11912)|0;xe(11688|0,11920)|0;xe(11700|0,11928)|0;c[1366]=11424;cb(5472);d=c[1366]|0;i=b;return d|0}function Cl(b){b=b|0;var d=0;b=i;if((a[5488]|0)!=0){d=c[1370]|0;i=b;return d|0}if((Ga(5488)|0)==0){d=c[1370]|0;i=b;return d|0}do{if((a[10872]|0)==0){if((Ga(10872)|0)==0){break}jn(10584,0,288)|0;gc(125,0,q|0)|0;cb(10872)}}while(0);Ie(10584,10880)|0;Ie(10596|0,10912)|0;Ie(10608|0,10952)|0;Ie(10620|0,10976)|0;Ie(10632|0,11296)|0;Ie(10644|0,11e3)|0;Ie(10656|0,11024)|0;Ie(10668|0,11048)|0;Ie(10680|0,11080)|0;Ie(10692|0,11120)|0;Ie(10704|0,11152)|0;Ie(10716|0,11192)|0;Ie(10728|0,11232)|0;Ie(10740|0,11248)|0;Ie(10752|0,11264)|0;Ie(10764|0,11280)|0;Ie(10776|0,11296)|0;Ie(10788|0,11312)|0;Ie(10800|0,11328)|0;Ie(10812|0,11344)|0;Ie(10824|0,11360)|0;Ie(10836|0,11376)|0;Ie(10848|0,11392)|0;Ie(10860|0,11408)|0;c[1370]=10584;cb(5488);d=c[1370]|0;i=b;return d|0}function Dl(b){b=b|0;var d=0;b=i;if((a[5504]|0)!=0){d=c[1374]|0;i=b;return d|0}if((Ga(5504)|0)==0){d=c[1374]|0;i=b;return d|0}do{if((a[10560]|0)==0){if((Ga(10560)|0)==0){break}jn(10272,0,288)|0;gc(126,0,q|0)|0;cb(10560)}}while(0);xe(10272,10568)|0;xe(10284|0,10576)|0;c[1374]=10272;cb(5504);d=c[1374]|0;i=b;return d|0}function El(b){b=b|0;var d=0;b=i;if((a[5520]|0)!=0){d=c[1378]|0;i=b;return d|0}if((Ga(5520)|0)==0){d=c[1378]|0;i=b;return d|0}do{if((a[10232]|0)==0){if((Ga(10232)|0)==0){break}jn(9944,0,288)|0;gc(127,0,q|0)|0;cb(10232)}}while(0);Ie(9944,10240)|0;Ie(9956|0,10256)|0;c[1378]=9944;cb(5520);d=c[1378]|0;i=b;return d|0}function Fl(b){b=b|0;b=i;do{if((a[5544]|0)==0){if((Ga(5544)|0)==0){break}te(5528,5552,8);gc(128,5528,q|0)|0;cb(5544)}}while(0);i=b;return 5528}function Gl(b){b=b|0;b=i;if((a[5584]|0)!=0){i=b;return 5568}if((Ga(5584)|0)==0){i=b;return 5568}Fe(5568,5592,km(5592)|0);gc(129,5568,q|0)|0;cb(5584);i=b;return 5568}function Hl(b){b=b|0;b=i;do{if((a[5648]|0)==0){if((Ga(5648)|0)==0){break}te(5632,5656,8);gc(128,5632,q|0)|0;cb(5648)}}while(0);i=b;return 5632}function Il(b){b=b|0;b=i;if((a[5688]|0)!=0){i=b;return 5672}if((Ga(5688)|0)==0){i=b;return 5672}Fe(5672,5696,km(5696)|0);gc(129,5672,q|0)|0;cb(5688);i=b;return 5672}function Jl(b){b=b|0;b=i;do{if((a[5752]|0)==0){if((Ga(5752)|0)==0){break}te(5736,5760,20);gc(128,5736,q|0)|0;cb(5752)}}while(0);i=b;return 5736}function Kl(b){b=b|0;b=i;if((a[5800]|0)!=0){i=b;return 5784}if((Ga(5800)|0)==0){i=b;return 5784}Fe(5784,5808,km(5808)|0);gc(129,5784,q|0)|0;cb(5800);i=b;return 5784}function Ll(b){b=b|0;b=i;do{if((a[5912]|0)==0){if((Ga(5912)|0)==0){break}te(5896,5920,11);gc(128,5896,q|0)|0;cb(5912)}}while(0);i=b;return 5896}function Ml(b){b=b|0;b=i;if((a[5952]|0)!=0){i=b;return 5936}if((Ga(5952)|0)==0){i=b;return 5936}Fe(5936,5960,km(5960)|0);gc(129,5936,q|0)|0;cb(5952);i=b;return 5936}function Nl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=ac()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);l=+dn(b,g,c[1254]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)!=34){h=l;i=f;return+h}c[e>>2]=4;h=l;i=f;return+h}function Ol(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=ac()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);l=+dn(b,g,c[1254]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)!=34){h=l;i=f;return+h}c[e>>2]=4;h=l;i=f;return+h}function Pl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=ac()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);l=+dn(b,g,c[1254]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)==34){c[e>>2]=4}h=l;i=f;return+h}function Ql(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+8|0;h=g;do{if((b|0)==(d|0)){c[e>>2]=4;j=0;k=0}else{if((a[b]|0)==45){c[e>>2]=4;j=0;k=0;break}l=ac()|0;m=c[l>>2]|0;c[l>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);n=mb(b|0,h|0,f|0,c[1254]|0)|0;o=c[l>>2]|0;if((o|0)==0){c[l>>2]=m}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;k=0;break}if((o|0)!=34){j=n;k=J;break}c[e>>2]=4;j=-1;k=-1}}while(0);J=k;i=g;return j|0}function Rl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=ac()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);m=mb(b|0,h|0,f|0,c[1254]|0)|0;f=J;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>4294967295)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m;i=g;return j|0}return 0}function Sl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=ac()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);m=mb(b|0,h|0,f|0,c[1254]|0)|0;f=J;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>4294967295)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m;i=g;return j|0}return 0}function Tl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=ac()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);m=mb(b|0,h|0,f|0,c[1254]|0)|0;f=J;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>65535)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m&65535;i=g;return j|0}return 0}function Ul(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;k=0;J=k;i=g;return j|0}l=ac()|0;m=c[l>>2]|0;c[l>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);n=Wb(b|0,h|0,f|0,c[1254]|0)|0;f=J;b=c[l>>2]|0;if((b|0)==0){c[l>>2]=m}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;k=0;J=k;i=g;return j|0}if((b|0)==34){c[e>>2]=4;e=(f|0)>0|(f|0)==0&n>>>0>0;J=e?2147483647:-2147483648;i=g;return(e?-1:0)|0}else{j=n;k=f;J=k;i=g;return j|0}return 0}function Vl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}k=ac()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[5024]|0)==0){if((Ga(5024)|0)==0){break}c[1254]=fb(2147483647,5032,0)|0;cb(5024)}}while(0);m=Wb(b|0,h|0,f|0,c[1254]|0)|0;f=J;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}do{if((b|0)==34){c[e>>2]=4;if((f|0)>0|(f|0)==0&m>>>0>0){j=2147483647}else{break}i=g;return j|0}else{if((f|0)<-1|(f|0)==-1&m>>>0<2147483648){c[e>>2]=4;break}if((f|0)>0|(f|0)==0&m>>>0>2147483647){c[e>>2]=4;j=2147483647;i=g;return j|0}else{j=m;i=g;return j|0}}}while(0);j=-2147483648;i=g;return j|0}function Wl(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=i;e=a+4|0;f=e;g=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24;f=e+4|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24;f=(c[a>>2]|0)+(e>>1)|0;a=f;if((e&1|0)==0){h=g;mc[h&255](a);i=b;return}else{h=c[(c[f>>2]|0)+g>>2]|0;mc[h&255](a);i=b;return}}function Xl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=b+8|0;g=b+4|0;h=c[g>>2]|0;j=c[f>>2]|0;k=h;if(!(j-k>>2>>>0<d>>>0)){l=d;m=h;do{if((m|0)==0){n=0}else{c[m>>2]=0;n=c[g>>2]|0}m=n+4|0;c[g>>2]=m;l=l+ -1|0;}while((l|0)!=0);i=e;return}l=b+16|0;m=b;n=c[m>>2]|0;h=k-n>>2;k=h+d|0;if(k>>>0>1073741823){Rj(0)}o=j-n|0;do{if(o>>2>>>0<536870911){n=o>>1;j=n>>>0<k>>>0?k:n;if((j|0)==0){p=0;q=0;break}n=b+128|0;if(!((a[n]|0)==0&j>>>0<29)){r=j;s=11;break}a[n]=1;p=j;q=l}else{r=1073741823;s=11}}while(0);if((s|0)==11){p=r;q=Pm(r<<2)|0}r=d;d=q+(h<<2)|0;do{if((d|0)==0){t=0}else{c[d>>2]=0;t=d}d=t+4|0;r=r+ -1|0;}while((r|0)!=0);r=c[m>>2]|0;t=(c[g>>2]|0)-r|0;s=q+(h-(t>>2)<<2)|0;h=r;mn(s|0,h|0,t|0)|0;c[m>>2]=s;c[g>>2]=d;c[f>>2]=q+(p<<2);if((r|0)==0){i=e;return}if((l|0)==(r|0)){a[b+128|0]=0;i=e;return}else{Rm(h);i=e;return}}function Yl(a){a=a|0;a=i;He(10220|0);He(10208|0);He(10196|0);He(10184|0);He(10172|0);He(10160|0);He(10148|0);He(10136|0);He(10124|0);He(10112|0);He(10100|0);He(10088|0);He(10076|0);He(10064|0);He(10052|0);He(10040|0);He(10028|0);He(10016|0);He(10004|0);He(9992|0);He(9980|0);He(9968|0);He(9956|0);He(9944);i=a;return}function Zl(a){a=a|0;a=i;ve(10548|0);ve(10536|0);ve(10524|0);ve(10512|0);ve(10500|0);ve(10488|0);ve(10476|0);ve(10464|0);ve(10452|0);ve(10440|0);ve(10428|0);ve(10416|0);ve(10404|0);ve(10392|0);ve(10380|0);ve(10368|0);ve(10356|0);ve(10344|0);ve(10332|0);ve(10320|0);ve(10308|0);ve(10296|0);ve(10284|0);ve(10272);i=a;return}function _l(a){a=a|0;a=i;He(10860|0);He(10848|0);He(10836|0);He(10824|0);He(10812|0);He(10800|0);He(10788|0);He(10776|0);He(10764|0);He(10752|0);He(10740|0);He(10728|0);He(10716|0);He(10704|0);He(10692|0);He(10680|0);He(10668|0);He(10656|0);He(10644|0);He(10632|0);He(10620|0);He(10608|0);He(10596|0);He(10584);i=a;return}function $l(a){a=a|0;a=i;ve(11700|0);ve(11688|0);ve(11676|0);ve(11664|0);ve(11652|0);ve(11640|0);ve(11628|0);ve(11616|0);ve(11604|0);ve(11592|0);ve(11580|0);ve(11568|0);ve(11556|0);ve(11544|0);ve(11532|0);ve(11520|0);ve(11508|0);ve(11496|0);ve(11484|0);ve(11472|0);ve(11460|0);ve(11448|0);ve(11436|0);ve(11424);i=a;return}function am(a){a=a|0;a=i;He(12092|0);He(12080|0);He(12068|0);He(12056|0);He(12044|0);He(12032|0);He(12020|0);He(12008|0);He(11996|0);He(11984|0);He(11972|0);He(11960|0);He(11948|0);He(11936);i=a;return}function bm(a){a=a|0;a=i;ve(12628|0);ve(12616|0);ve(12604|0);ve(12592|0);ve(12580|0);ve(12568|0);ve(12556|0);ve(12544|0);ve(12532|0);ve(12520|0);ve(12508|0);ve(12496|0);ve(12484|0);ve(12472);i=a;return}function cm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=dm(0,a,b,(c|0)!=0?c:12992)|0;i=d;return e|0}function dm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;g=i;i=i+8|0;h=g;c[h>>2]=b;j=(f|0)==0?13e3:f;f=c[j>>2]|0;a:do{if((d|0)==0){if((f|0)==0){k=0}else{break}i=g;return k|0}else{if((b|0)==0){l=h;c[h>>2]=l;m=l}else{m=b}if((e|0)==0){k=-2;i=g;return k|0}do{if((f|0)==0){l=a[d]|0;n=l&255;if(l<<24>>24>-1){c[m>>2]=n;k=l<<24>>24!=0|0;i=g;return k|0}else{l=n+ -194|0;if(l>>>0>50){break a}o=e+ -1|0;p=c[12784+(l<<2)>>2]|0;q=d+1|0;break}}else{o=e;p=f;q=d}}while(0);b:do{if((o|0)==0){r=p}else{l=a[q]|0;n=(l&255)>>>3;if((n+ -16|n+(p>>26))>>>0>7){break a}else{s=o;t=l;u=p;v=q}while(1){v=v+1|0;u=(t&255)+ -128|u<<6;s=s+ -1|0;if((u|0)>=0){break}if((s|0)==0){r=u;break b}t=a[v]|0;if(((t&255)+ -128|0)>>>0>63){break a}}c[j>>2]=0;c[m>>2]=u;k=e-s|0;i=g;return k|0}}while(0);c[j>>2]=r;k=-2;i=g;return k|0}}while(0);c[j>>2]=0;c[(ac()|0)>>2]=84;k=-1;i=g;return k|0}function em(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,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;g=i;i=i+1032|0;h=g+1024|0;j=c[b>>2]|0;c[h>>2]=j;k=(a|0)!=0;l=g;m=k?e:256;e=k?a:l;a:do{if((j|0)==0|(m|0)==0){n=d;o=m;p=j;q=0;r=e}else{a=d;s=m;t=j;u=0;v=e;while(1){w=a>>>2;x=w>>>0>=s>>>0;if(!(x|a>>>0>131)){n=a;o=s;p=t;q=u;r=v;break a}y=x?s:w;z=a-y|0;w=fm(v,h,y,f)|0;if((w|0)==-1){break}if((v|0)==(l|0)){A=s;B=l}else{A=s-w|0;B=v+(w<<2)|0}y=w+u|0;w=c[h>>2]|0;if((w|0)==0|(A|0)==0){n=z;o=A;p=w;q=y;r=B;break a}else{a=z;s=A;t=w;u=y;v=B}}n=z;o=0;p=c[h>>2]|0;q=-1;r=v}}while(0);b:do{if((p|0)==0){C=q}else{if((o|0)==0|(n|0)==0){C=q;break}else{D=n;E=o;F=p;G=q;H=r}while(1){I=dm(H,F,D,f)|0;if((I+2|0)>>>0<3){break}z=(c[h>>2]|0)+I|0;c[h>>2]=z;B=E+ -1|0;A=G+1|0;if((B|0)==0|(D|0)==(I|0)){C=A;break b}else{D=D-I|0;E=B;F=z;G=A;H=H+4|0}}if((I|0)==0){c[h>>2]=0;C=G;break}else if((I|0)==-1){C=-1;break}else{c[f>>2]=0;C=G;break}}}while(0);if(!k){i=g;return C|0}c[b>>2]=c[h>>2];i=g;return C|0}function fm(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=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,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;h=i;j=c[e>>2]|0;do{if((g|0)==0){k=5}else{l=g;m=c[l>>2]|0;if((m|0)==0){k=5;break}if((b|0)==0){n=f;o=m;p=j;k=16;break}c[l>>2]=0;q=b;r=f;s=m;t=j;k=36}}while(0);if((k|0)==5){if((b|0)==0){u=f;v=j;k=7}else{w=b;x=f;y=j;k=6}}a:while(1){if((k|0)==6){k=0;if((x|0)==0){z=f;k=53;break}else{A=w;B=x;C=y}while(1){j=a[C]|0;do{if(((j&255)+ -1|0)>>>0<127){if((C&3|0)==0&B>>>0>3){D=A;E=B;F=C}else{G=A;H=B;I=j;J=C;break}while(1){K=c[F>>2]|0;if(((K+ -16843009|K)&-2139062144|0)!=0){k=30;break}c[D>>2]=K&255;c[D+4>>2]=d[F+1|0]|0;c[D+8>>2]=d[F+2|0]|0;L=F+4|0;M=D+16|0;c[D+12>>2]=d[F+3|0]|0;N=E+ -4|0;if(N>>>0>3){D=M;E=N;F=L}else{k=31;break}}if((k|0)==30){k=0;G=D;H=E;I=K&255;J=F;break}else if((k|0)==31){k=0;G=M;H=N;I=a[L]|0;J=L;break}}else{G=A;H=B;I=j;J=C}}while(0);O=I&255;if(!((O+ -1|0)>>>0<127)){break}c[G>>2]=O;j=H+ -1|0;if((j|0)==0){z=f;k=53;break a}else{A=G+4|0;B=j;C=J+1|0}}j=O+ -194|0;if(j>>>0>50){P=G;Q=H;R=J;k=47;break}q=G;r=H;s=c[12784+(j<<2)>>2]|0;t=J+1|0;k=36;continue}else if((k|0)==7){k=0;j=a[v]|0;do{if(((j&255)+ -1|0)>>>0<127){if((v&3|0)!=0){S=u;T=j;U=v;break}g=c[v>>2]|0;if(((g+ -16843009|g)&-2139062144|0)==0){m=u;l=v;while(1){V=l+4|0;W=m+ -4|0;X=c[V>>2]|0;if(((X+ -16843009|X)&-2139062144|0)==0){l=V;m=W}else{Y=W;Z=X;_=V;break}}}else{Y=u;Z=g;_=v}S=Y;T=Z&255;U=_}else{S=u;T=j;U=v}}while(0);j=T&255;if((j+ -1|0)>>>0<127){u=S+ -1|0;v=U+1|0;k=7;continue}m=j+ -194|0;if(m>>>0>50){P=b;Q=S;R=U;k=47;break}n=S;o=c[12784+(m<<2)>>2]|0;p=U+1|0;k=16;continue}else if((k|0)==16){k=0;m=(d[p]|0)>>>3;if((m+ -16|m+(o>>26))>>>0>7){k=17;break}m=p+1|0;do{if((o&33554432|0)==0){$=m}else{if(((d[m]|0)+ -128|0)>>>0>63){k=20;break a}j=p+2|0;if((o&524288|0)==0){$=j;break}if(((d[j]|0)+ -128|0)>>>0>63){k=23;break a}$=p+3|0}}while(0);u=n+ -1|0;v=$;k=7;continue}else if((k|0)==36){k=0;m=d[t]|0;j=m>>>3;if((j+ -16|j+(s>>26))>>>0>7){k=37;break}j=t+1|0;aa=m+ -128|s<<6;do{if((aa|0)<0){m=(d[j]|0)+ -128|0;if(m>>>0>63){k=40;break a}l=t+2|0;ba=m|aa<<6;if((ba|0)>=0){ca=ba;da=l;break}m=(d[l]|0)+ -128|0;if(m>>>0>63){k=43;break a}ca=m|ba<<6;da=t+3|0}else{ca=aa;da=j}}while(0);c[q>>2]=ca;w=q+4|0;x=r+ -1|0;y=da;k=6;continue}}if((k|0)==17){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==20){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==23){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==37){ea=q;fa=r;ga=s;ha=t+ -1|0;k=46}else if((k|0)==40){ea=q;fa=r;ga=aa;ha=t+ -1|0;k=46}else if((k|0)==43){ea=q;fa=r;ga=ba;ha=t+ -1|0;k=46}else if((k|0)==53){i=h;return z|0}if((k|0)==46){if((ga|0)==0){P=ea;Q=fa;R=ha;k=47}else{ia=ea;ja=ha}}do{if((k|0)==47){if((a[R]|0)!=0){ia=P;ja=R;break}if((P|0)!=0){c[P>>2]=0;c[e>>2]=0}z=f-Q|0;i=h;return z|0}}while(0);c[(ac()|0)>>2]=84;if((ia|0)==0){z=-1;i=h;return z|0}c[e>>2]=ja;z=-1;i=h;return z|0}function gm(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g;c[h>>2]=b;if((e|0)==0){j=0;i=g;return j|0}do{if((f|0)!=0){if((b|0)==0){k=h;c[h>>2]=k;l=k}else{l=b}k=a[e]|0;m=k&255;if(k<<24>>24>-1){c[l>>2]=m;j=k<<24>>24!=0|0;i=g;return j|0}k=m+ -194|0;if(k>>>0>50){break}m=e+1|0;n=c[12784+(k<<2)>>2]|0;if(f>>>0<4){if((n&-2147483648>>>((f*6|0)+ -6|0)|0)!=0){break}}k=d[m]|0;m=k>>>3;if((m+ -16|m+(n>>26))>>>0>7){break}m=k+ -128|n<<6;if((m|0)>=0){c[l>>2]=m;j=2;i=g;return j|0}n=(d[e+2|0]|0)+ -128|0;if(n>>>0>63){break}k=n|m<<6;if((k|0)>=0){c[l>>2]=k;j=3;i=g;return j|0}m=(d[e+3|0]|0)+ -128|0;if(m>>>0>63){break}c[l>>2]=m|k<<6;j=4;i=g;return j|0}}while(0);c[(ac()|0)>>2]=84;j=-1;i=g;return j|0}function hm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((b|0)==0){f=1;i=e;return f|0}if(d>>>0<128){a[b]=d;f=1;i=e;return f|0}if(d>>>0<2048){a[b]=d>>>6|192;a[b+1|0]=d&63|128;f=2;i=e;return f|0}if(d>>>0<55296|(d+ -57344|0)>>>0<8192){a[b]=d>>>12|224;a[b+1|0]=d>>>6&63|128;a[b+2|0]=d&63|128;f=3;i=e;return f|0}if((d+ -65536|0)>>>0<1048576){a[b]=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;f=4;i=e;return f|0}else{c[(ac()|0)>>2]=84;f=-1;i=e;return f|0}return 0}function im(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,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;f=i;i=i+264|0;g=f+256|0;h=f;j=c[b>>2]|0;c[g>>2]=j;k=(a|0)!=0;l=k?e:256;e=k?a:h;a:do{if((j|0)==0|(l|0)==0){m=d;n=l;o=j;p=0;q=e}else{a=d;r=l;s=j;t=0;u=e;while(1){v=a>>>0>=r>>>0;if(!(v|a>>>0>32)){m=a;n=r;o=s;p=t;q=u;break a}w=v?r:a;x=a-w|0;v=jm(u,g,w,0)|0;if((v|0)==-1){break}if((u|0)==(h|0)){y=r;z=h}else{y=r-v|0;z=u+v|0}w=v+t|0;v=c[g>>2]|0;if((v|0)==0|(y|0)==0){m=x;n=y;o=v;p=w;q=z;break a}else{a=x;r=y;s=v;t=w;u=z}}m=x;n=0;o=c[g>>2]|0;p=-1;q=u}}while(0);b:do{if((o|0)==0){A=p}else{if((n|0)==0|(m|0)==0){A=p;break}else{B=m;C=n;D=o;E=p;F=q}while(1){G=hm(F,c[D>>2]|0,0)|0;if((G+1|0)>>>0<2){break}x=(c[g>>2]|0)+4|0;c[g>>2]=x;z=B+ -1|0;y=E+1|0;if((C|0)==(G|0)|(z|0)==0){A=y;break b}else{B=z;C=C-G|0;D=x;E=y;F=F+G|0}}if((G|0)!=0){A=-1;break}c[g>>2]=0;A=E}}while(0);if(!k){i=f;return A|0}c[b>>2]=c[g>>2];i=f;return A|0}function jm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;f=i;i=i+8|0;g=f;if((b|0)==0){h=c[d>>2]|0;j=g;k=c[h>>2]|0;if((k|0)==0){l=0;i=f;return l|0}else{m=0;n=k;o=h}while(1){if(n>>>0>127){h=hm(j,n,0)|0;if((h|0)==-1){l=-1;p=26;break}else{q=h}}else{q=1}h=q+m|0;k=o+4|0;r=c[k>>2]|0;if((r|0)==0){l=h;p=26;break}else{m=h;n=r;o=k}}if((p|0)==26){i=f;return l|0}}a:do{if(e>>>0>3){o=b;n=e;m=c[d>>2]|0;while(1){q=c[m>>2]|0;if((q|0)==0){s=o;t=n;break a}if(q>>>0>127){j=hm(o,q,0)|0;if((j|0)==-1){l=-1;break}u=o+j|0;v=n-j|0;w=m}else{a[o]=q;u=o+1|0;v=n+ -1|0;w=c[d>>2]|0}q=w+4|0;c[d>>2]=q;if(v>>>0>3){o=u;n=v;m=q}else{s=u;t=v;break a}}i=f;return l|0}else{s=b;t=e}}while(0);b:do{if((t|0)==0){x=0}else{b=g;v=s;u=t;w=c[d>>2]|0;while(1){m=c[w>>2]|0;if((m|0)==0){p=24;break}if(m>>>0>127){n=hm(b,m,0)|0;if((n|0)==-1){l=-1;p=26;break}if(n>>>0>u>>>0){p=20;break}hm(v,c[w>>2]|0,0)|0;y=v+n|0;z=u-n|0;A=w}else{a[v]=m;y=v+1|0;z=u+ -1|0;A=c[d>>2]|0}m=A+4|0;c[d>>2]=m;if((z|0)==0){x=0;break b}else{v=y;u=z;w=m}}if((p|0)==20){l=e-u|0;i=f;return l|0}else if((p|0)==24){a[v]=0;x=u;break}else if((p|0)==26){i=f;return l|0}}}while(0);c[d>>2]=0;l=e-x|0;i=f;return l|0}function km(a){a=a|0;var b=0,d=0;b=i;d=a;while(1){if((c[d>>2]|0)==0){break}else{d=d+4|0}}i=b;return d-a>>2|0}function lm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==0){i=e;return a|0}else{f=d;g=b;h=a}while(1){b=f+ -1|0;c[h>>2]=c[g>>2];if((b|0)==0){break}else{h=h+4|0;g=g+4|0;f=b}}i=e;return a|0}function mm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=(d|0)==0;do{if(a-b>>2>>>0<d>>>0){if(f){break}else{g=d}do{g=g+ -1|0;c[a+(g<<2)>>2]=c[b+(g<<2)>>2];}while((g|0)!=0)}else{if(f){break}else{h=b;j=a;k=d}while(1){l=k+ -1|0;c[j>>2]=c[h>>2];if((l|0)==0){break}else{k=l;j=j+4|0;h=h+4|0}}}}while(0);i=e;return a|0}function nm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)!=0){f=d;d=a;while(1){g=f+ -1|0;c[d>>2]=b;if((g|0)==0){break}else{d=d+4|0;f=g}}}i=e;return a|0}function om(a){a=a|0;i=i;return}function pm(a){a=a|0;c[a>>2]=13016;i=i;return}function qm(a){a=a|0;var b=0;b=i;Ta(a|0);Rm(a);i=b;return}function rm(a){a=a|0;var b=0;b=i;Ta(a|0);i=b;return}function sm(a){a=a|0;i=i;return 13032}function tm(a){a=a|0;i=i;return}function um(a){a=a|0;i=i;return}function vm(a){a=a|0;i=i;return}function wm(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function xm(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function ym(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function zm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+56|0;f=e;if((a|0)==(b|0)){g=1;i=e;return g|0}if((b|0)==0){g=0;i=e;return g|0}h=Dm(b,13144,13200,0)|0;b=h;if((h|0)==0){g=0;i=e;return g|0}j=f+0|0;k=j+56|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[f>>2]=b;c[f+8>>2]=a;c[f+12>>2]=-1;c[f+48>>2]=1;Ac[c[(c[h>>2]|0)+28>>2]&15](b,f,c[d>>2]|0,1);if((c[f+24>>2]|0)!=1){g=0;i=e;return g|0}c[d>>2]=c[f+16>>2];g=1;i=e;return g|0}function Am(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[d+8>>2]|0)!=(b|0)){i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function Bm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((b|0)!=(c[d+8>>2]|0)){h=c[b+8>>2]|0;Ac[c[(c[h>>2]|0)+28>>2]&15](h,d,e,f);i=g;return}h=d+16|0;b=c[h>>2]|0;if((b|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function Cm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;if((b|0)==(c[d+8>>2]|0)){h=d+16|0;j=c[h>>2]|0;if((j|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((j|0)!=(e|0)){j=d+36|0;c[j>>2]=(c[j>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}j=d+24|0;if((c[j>>2]|0)!=2){i=g;return}c[j>>2]=f;i=g;return}j=c[b+12>>2]|0;h=b+(j<<3)+16|0;k=c[b+20>>2]|0;l=k>>8;if((k&1|0)==0){m=l}else{m=c[(c[e>>2]|0)+l>>2]|0}l=c[b+16>>2]|0;Ac[c[(c[l>>2]|0)+28>>2]&15](l,d,e+m|0,(k&2|0)!=0?f:2);if((j|0)<=1){i=g;return}j=d+54|0;k=e;m=b+24|0;while(1){b=c[m+4>>2]|0;l=b>>8;if((b&1|0)==0){n=l}else{n=c[(c[k>>2]|0)+l>>2]|0}l=c[m>>2]|0;Ac[c[(c[l>>2]|0)+28>>2]&15](l,d,e+n|0,(b&2|0)!=0?f:2);if((a[j]|0)!=0){o=16;break}b=m+8|0;if(b>>>0<h>>>0){m=b}else{o=16;break}}if((o|0)==16){i=g;return}}function Dm(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+56|0;j=h;k=c[d>>2]|0;l=d+(c[k+ -8>>2]|0)|0;m=c[k+ -4>>2]|0;k=m;c[j>>2]=f;c[j+4>>2]=d;c[j+8>>2]=e;c[j+12>>2]=g;g=j+16|0;e=j+20|0;d=j+24|0;n=j+28|0;o=j+32|0;p=j+40|0;q=(m|0)==(f|0);f=g;r=f+0|0;s=r+36|0;do{c[r>>2]=0;r=r+4|0}while((r|0)<(s|0));b[f+36>>1]=0;a[f+38|0]=0;if(q){c[j+48>>2]=1;xc[c[(c[m>>2]|0)+20>>2]&31](k,j,l,l,1,0);t=(c[d>>2]|0)==1?l:0;i=h;return t|0}lc[c[(c[m>>2]|0)+24>>2]&3](k,j,l,1,0);l=c[j+36>>2]|0;if((l|0)==1){do{if((c[d>>2]|0)!=1){if((c[p>>2]|0)!=0){t=0;i=h;return t|0}if((c[n>>2]|0)!=1){t=0;i=h;return t|0}if((c[o>>2]|0)==1){break}else{t=0}i=h;return t|0}}while(0);t=c[g>>2]|0;i=h;return t|0}else if((l|0)==0){if((c[p>>2]|0)!=1){t=0;i=h;return t|0}if((c[n>>2]|0)!=1){t=0;i=h;return t|0}t=(c[o>>2]|0)==1?c[e>>2]|0:0;i=h;return t|0}else{t=0;i=h;return t|0}return 0}function Em(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;j=b;if((j|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}k=d+28|0;if((c[k>>2]|0)==1){i=h;return}c[k>>2]=f;i=h;return}if((j|0)==(c[d>>2]|0)){do{if((c[d+16>>2]|0)!=(e|0)){j=d+20|0;if((c[j>>2]|0)==(e|0)){break}c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=c[b+12>>2]|0;m=b+(l<<3)+16|0;a:do{if((l|0)>0){n=d+52|0;o=d+53|0;p=d+54|0;q=b+8|0;r=d+24|0;s=e;t=0;u=0;v=b+16|0;b:while(1){a[n]=0;a[o]=0;w=c[v+4>>2]|0;x=w>>8;if((w&1|0)==0){y=x}else{y=c[(c[s>>2]|0)+x>>2]|0}x=c[v>>2]|0;xc[c[(c[x>>2]|0)+20>>2]&31](x,d,e,e+y|0,2-(w>>>1&1)|0,g);if((a[p]|0)!=0){z=t;A=u;break}do{if((a[o]|0)==0){B=t;C=u}else{if((a[n]|0)==0){if((c[q>>2]&1|0)==0){z=t;A=1;break b}else{B=t;C=1;break}}if((c[r>>2]|0)==1){D=27;break a}if((c[q>>2]&2|0)==0){D=27;break a}else{B=1;C=1}}}while(0);w=v+8|0;if(w>>>0<m>>>0){t=B;u=C;v=w}else{z=B;A=C;break}}if(z){E=A;D=26}else{F=A;D=23}}else{F=0;D=23}}while(0);do{if((D|0)==23){c[j>>2]=e;m=d+40|0;c[m>>2]=(c[m>>2]|0)+1;if((c[d+36>>2]|0)!=1){E=F;D=26;break}if((c[d+24>>2]|0)!=2){E=F;D=26;break}a[d+54|0]=1;if(F){D=27}else{D=28}}}while(0);if((D|0)==26){if(E){D=27}else{D=28}}if((D|0)==27){c[k>>2]=3;i=h;return}else if((D|0)==28){c[k>>2]=4;i=h;return}}}while(0);if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}E=c[b+12>>2]|0;F=b+(E<<3)+16|0;A=c[b+20>>2]|0;z=A>>8;if((A&1|0)==0){G=z}else{G=c[(c[e>>2]|0)+z>>2]|0}z=c[b+16>>2]|0;lc[c[(c[z>>2]|0)+24>>2]&3](z,d,e+G|0,(A&2|0)!=0?f:2,g);A=b+24|0;if((E|0)<=1){i=h;return}E=c[b+8>>2]|0;do{if((E&2|0)==0){b=d+36|0;if((c[b>>2]|0)==1){break}if((E&1|0)==0){G=d+54|0;z=e;C=A;while(1){if((a[G]|0)!=0){D=53;break}if((c[b>>2]|0)==1){D=53;break}B=c[C+4>>2]|0;y=B>>8;if((B&1|0)==0){H=y}else{H=c[(c[z>>2]|0)+y>>2]|0}y=c[C>>2]|0;lc[c[(c[y>>2]|0)+24>>2]&3](y,d,e+H|0,(B&2|0)!=0?f:2,g);B=C+8|0;if(B>>>0<F>>>0){C=B}else{D=53;break}}if((D|0)==53){i=h;return}}C=d+24|0;z=d+54|0;G=e;k=A;while(1){if((a[z]|0)!=0){D=53;break}if((c[b>>2]|0)==1){if((c[C>>2]|0)==1){D=53;break}}B=c[k+4>>2]|0;y=B>>8;if((B&1|0)==0){I=y}else{I=c[(c[G>>2]|0)+y>>2]|0}y=c[k>>2]|0;lc[c[(c[y>>2]|0)+24>>2]&3](y,d,e+I|0,(B&2|0)!=0?f:2,g);B=k+8|0;if(B>>>0<F>>>0){k=B}else{D=53;break}}if((D|0)==53){i=h;return}}}while(0);I=d+54|0;H=e;E=A;while(1){if((a[I]|0)!=0){D=53;break}A=c[E+4>>2]|0;k=A>>8;if((A&1|0)==0){J=k}else{J=c[(c[H>>2]|0)+k>>2]|0}k=c[E>>2]|0;lc[c[(c[k>>2]|0)+24>>2]&3](k,d,e+J|0,(A&2|0)!=0?f:2,g);A=E+8|0;if(A>>>0<F>>>0){E=A}else{D=53;break}}if((D|0)==53){i=h;return}}function Fm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=b;if((j|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}k=d+28|0;if((c[k>>2]|0)==1){i=h;return}c[k>>2]=f;i=h;return}if((j|0)!=(c[d>>2]|0)){j=c[b+8>>2]|0;lc[c[(c[j>>2]|0)+24>>2]&3](j,d,e,f,g);i=h;return}do{if((c[d+16>>2]|0)!=(e|0)){j=d+20|0;if((c[j>>2]|0)==(e|0)){break}c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=d+52|0;a[l]=0;m=d+53|0;a[m]=0;n=c[b+8>>2]|0;xc[c[(c[n>>2]|0)+20>>2]&31](n,d,e,e,1,g);if((a[m]|0)==0){o=0;p=13}else{if((a[l]|0)==0){o=1;p=13}}a:do{if((p|0)==13){c[j>>2]=e;l=d+40|0;c[l>>2]=(c[l>>2]|0)+1;do{if((c[d+36>>2]|0)==1){if((c[d+24>>2]|0)!=2){p=16;break}a[d+54|0]=1;if(o){break a}}else{p=16}}while(0);if((p|0)==16){if(o){break}}c[k>>2]=4;i=h;return}}while(0);c[k>>2]=3;i=h;return}}while(0);if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}function Gm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i;if((c[d+8>>2]|0)==(b|0)){if((c[d+4>>2]|0)!=(e|0)){i=g;return}h=d+28|0;if((c[h>>2]|0)==1){i=g;return}c[h>>2]=f;i=g;return}if((c[d>>2]|0)!=(b|0)){i=g;return}do{if((c[d+16>>2]|0)!=(e|0)){b=d+20|0;if((c[b>>2]|0)==(e|0)){break}c[d+32>>2]=f;c[b>>2]=e;b=d+40|0;c[b>>2]=(c[b>>2]|0)+1;do{if((c[d+36>>2]|0)==1){if((c[d+24>>2]|0)!=2){break}a[d+54|0]=1}}while(0);c[d+44>>2]=4;i=g;return}}while(0);if((f|0)!=1){i=g;return}c[d+32>>2]=1;i=g;return}function Hm(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 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;j=i;if((b|0)!=(c[d+8>>2]|0)){k=d+52|0;l=a[k]|0;m=d+53|0;n=a[m]|0;o=c[b+12>>2]|0;p=b+(o<<3)+16|0;a[k]=0;a[m]=0;q=c[b+20>>2]|0;r=q>>8;if((q&1|0)==0){s=r}else{s=c[(c[f>>2]|0)+r>>2]|0}r=c[b+16>>2]|0;xc[c[(c[r>>2]|0)+20>>2]&31](r,d,e,f+s|0,(q&2|0)!=0?g:2,h);a:do{if((o|0)>1){q=d+24|0;s=b+8|0;r=d+54|0;t=f;u=b+24|0;do{if((a[r]|0)!=0){break a}do{if((a[k]|0)==0){if((a[m]|0)==0){break}if((c[s>>2]&1|0)==0){break a}}else{if((c[q>>2]|0)==1){break a}if((c[s>>2]&2|0)==0){break a}}}while(0);a[k]=0;a[m]=0;v=c[u+4>>2]|0;w=v>>8;if((v&1|0)==0){x=w}else{x=c[(c[t>>2]|0)+w>>2]|0}w=c[u>>2]|0;xc[c[(c[w>>2]|0)+20>>2]&31](w,d,e,f+x|0,(v&2|0)!=0?g:2,h);u=u+8|0;}while(u>>>0<p>>>0)}}while(0);a[k]=l;a[m]=n;i=j;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52|0]=1;f=d+16|0;n=c[f>>2]|0;if((n|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}if((n|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=j;return}e=d+24|0;n=c[e>>2]|0;if((n|0)==2){c[e>>2]=g;y=g}else{y=n}if(!((c[d+48>>2]|0)==1&(y|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}function Im(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 j=0,k=0,l=0;j=i;if((b|0)!=(c[d+8>>2]|0)){k=c[b+8>>2]|0;xc[c[(c[k>>2]|0)+20>>2]&31](k,d,e,f,g,h);i=j;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52|0]=1;f=d+16|0;h=c[f>>2]|0;if((h|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=j;return}e=d+24|0;h=c[e>>2]|0;if((h|0)==2){c[e>>2]=g;l=g}else{l=h}if(!((c[d+48>>2]|0)==1&(l|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}function Jm(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 j=0;h=i;if((c[d+8>>2]|0)!=(b|0)){i=h;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=h;return}a[d+52|0]=1;f=d+16|0;b=c[f>>2]|0;if((b|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54|0]=1;i=h;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=h;return}e=d+24|0;b=c[e>>2]|0;if((b|0)==2){c[e>>2]=g;j=g}else{j=b}if(!((c[d+48>>2]|0)==1&(j|0)==1)){i=h;return}a[d+54|0]=1;i=h;return}\n\n\n\nfunction Km(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,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,Ma=0,Na=0,Pa=0;b=i;do{if(a>>>0<245){if(a>>>0<11){d=16}else{d=a+11&-8}e=d>>>3;f=c[3362]|0;g=f>>>e;if((g&3|0)!=0){h=(g&1^1)+e|0;j=h<<1;k=13488+(j<<2)|0;l=13488+(j+2<<2)|0;j=c[l>>2]|0;m=j+8|0;n=c[m>>2]|0;do{if((k|0)==(n|0)){c[3362]=f&~(1<<h)}else{if(n>>>0<(c[13464>>2]|0)>>>0){Mb()}o=n+12|0;if((c[o>>2]|0)==(j|0)){c[o>>2]=k;c[l>>2]=n;break}else{Mb()}}}while(0);n=h<<3;c[j+4>>2]=n|3;l=j+(n|4)|0;c[l>>2]=c[l>>2]|1;p=m;i=b;return p|0}if(!(d>>>0>(c[13456>>2]|0)>>>0)){q=d;break}if((g|0)!=0){l=2<<e;n=g<<e&(l|0-l);l=(n&0-n)+ -1|0;n=l>>>12&16;k=l>>>n;l=k>>>5&8;o=k>>>l;k=o>>>2&4;r=o>>>k;o=r>>>1&2;s=r>>>o;r=s>>>1&1;t=(l|n|k|o|r)+(s>>>r)|0;r=t<<1;s=13488+(r<<2)|0;o=13488+(r+2<<2)|0;r=c[o>>2]|0;k=r+8|0;n=c[k>>2]|0;do{if((s|0)==(n|0)){c[3362]=f&~(1<<t)}else{if(n>>>0<(c[13464>>2]|0)>>>0){Mb()}l=n+12|0;if((c[l>>2]|0)==(r|0)){c[l>>2]=s;c[o>>2]=n;break}else{Mb()}}}while(0);n=t<<3;o=n-d|0;c[r+4>>2]=d|3;s=r;f=s+d|0;c[s+(d|4)>>2]=o|1;c[s+n>>2]=o;n=c[13456>>2]|0;if((n|0)!=0){s=c[13468>>2]|0;e=n>>>3;n=e<<1;g=13488+(n<<2)|0;m=c[3362]|0;j=1<<e;do{if((m&j|0)==0){c[3362]=m|j;u=13488+(n+2<<2)|0;v=g}else{e=13488+(n+2<<2)|0;h=c[e>>2]|0;if(!(h>>>0<(c[13464>>2]|0)>>>0)){u=e;v=h;break}Mb()}}while(0);c[u>>2]=s;c[v+12>>2]=s;c[s+8>>2]=v;c[s+12>>2]=g}c[13456>>2]=o;c[13468>>2]=f;p=k;i=b;return p|0}n=c[13452>>2]|0;if((n|0)==0){q=d;break}j=(n&0-n)+ -1|0;n=j>>>12&16;m=j>>>n;j=m>>>5&8;r=m>>>j;m=r>>>2&4;t=r>>>m;r=t>>>1&2;h=t>>>r;t=h>>>1&1;e=c[13752+((j|n|m|r|t)+(h>>>t)<<2)>>2]|0;t=(c[e+4>>2]&-8)-d|0;h=e;r=e;while(1){e=c[h+16>>2]|0;if((e|0)==0){m=c[h+20>>2]|0;if((m|0)==0){break}else{w=m}}else{w=e}e=(c[w+4>>2]&-8)-d|0;m=e>>>0<t>>>0;t=m?e:t;h=w;r=m?w:r}h=r;k=c[13464>>2]|0;if(h>>>0<k>>>0){Mb()}f=h+d|0;o=f;if(!(h>>>0<f>>>0)){Mb()}f=c[r+24>>2]|0;g=c[r+12>>2]|0;do{if((g|0)==(r|0)){s=r+20|0;m=c[s>>2]|0;if((m|0)==0){e=r+16|0;n=c[e>>2]|0;if((n|0)==0){x=0;break}else{y=n;z=e}}else{y=m;z=s}while(1){s=y+20|0;m=c[s>>2]|0;if((m|0)!=0){z=s;y=m;continue}m=y+16|0;s=c[m>>2]|0;if((s|0)==0){break}else{y=s;z=m}}if(z>>>0<k>>>0){Mb()}else{c[z>>2]=0;x=y;break}}else{m=c[r+8>>2]|0;if(m>>>0<k>>>0){Mb()}s=m+12|0;if((c[s>>2]|0)!=(r|0)){Mb()}e=g+8|0;if((c[e>>2]|0)==(r|0)){c[s>>2]=g;c[e>>2]=m;x=g;break}else{Mb()}}}while(0);a:do{if((f|0)!=0){g=c[r+28>>2]|0;k=13752+(g<<2)|0;do{if((r|0)==(c[k>>2]|0)){c[k>>2]=x;if((x|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<g);break a}else{if(f>>>0<(c[13464>>2]|0)>>>0){Mb()}m=f+16|0;if((c[m>>2]|0)==(r|0)){c[m>>2]=x}else{c[f+20>>2]=x}if((x|0)==0){break a}}}while(0);if(x>>>0<(c[13464>>2]|0)>>>0){Mb()}c[x+24>>2]=f;g=c[r+16>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[x+16>>2]=g;c[g+24>>2]=x;break}}}while(0);g=c[r+20>>2]|0;if((g|0)==0){break}if(g>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[x+20>>2]=g;c[g+24>>2]=x;break}}}while(0);if(t>>>0<16){f=t+d|0;c[r+4>>2]=f|3;g=h+(f+4)|0;c[g>>2]=c[g>>2]|1}else{c[r+4>>2]=d|3;c[h+(d|4)>>2]=t|1;c[h+(t+d)>>2]=t;g=c[13456>>2]|0;if((g|0)!=0){f=c[13468>>2]|0;k=g>>>3;g=k<<1;m=13488+(g<<2)|0;e=c[3362]|0;s=1<<k;do{if((e&s|0)==0){c[3362]=e|s;A=13488+(g+2<<2)|0;B=m}else{k=13488+(g+2<<2)|0;n=c[k>>2]|0;if(!(n>>>0<(c[13464>>2]|0)>>>0)){A=k;B=n;break}Mb()}}while(0);c[A>>2]=f;c[B+12>>2]=f;c[f+8>>2]=B;c[f+12>>2]=m}c[13456>>2]=t;c[13468>>2]=o}p=r+8|0;i=b;return p|0}else{if(a>>>0>4294967231){q=-1;break}g=a+11|0;s=g&-8;e=c[13452>>2]|0;if((e|0)==0){q=s;break}h=0-s|0;n=g>>>8;do{if((n|0)==0){C=0}else{if(s>>>0>16777215){C=31;break}g=(n+1048320|0)>>>16&8;k=n<<g;j=(k+520192|0)>>>16&4;l=k<<j;k=(l+245760|0)>>>16&2;D=14-(j|g|k)+(l<<k>>>15)|0;C=s>>>(D+7|0)&1|D<<1}}while(0);n=c[13752+(C<<2)>>2]|0;b:do{if((n|0)==0){E=h;F=0;G=0}else{if((C|0)==31){H=0}else{H=25-(C>>>1)|0}r=h;o=0;t=s<<H;m=n;f=0;while(1){D=c[m+4>>2]&-8;k=D-s|0;if(k>>>0<r>>>0){if((D|0)==(s|0)){E=k;F=m;G=m;break b}else{I=k;J=m}}else{I=r;J=f}k=c[m+20>>2]|0;D=c[m+(t>>>31<<2)+16>>2]|0;l=(k|0)==0|(k|0)==(D|0)?o:k;if((D|0)==0){E=I;F=l;G=J;break}else{r=I;o=l;t=t<<1;m=D;f=J}}}}while(0);if((F|0)==0&(G|0)==0){n=2<<C;h=e&(n|0-n);if((h|0)==0){q=s;break}n=(h&0-h)+ -1|0;h=n>>>12&16;f=n>>>h;n=f>>>5&8;m=f>>>n;f=m>>>2&4;t=m>>>f;m=t>>>1&2;o=t>>>m;t=o>>>1&1;K=c[13752+((n|h|f|m|t)+(o>>>t)<<2)>>2]|0}else{K=F}if((K|0)==0){L=E;M=G}else{t=E;o=K;m=G;while(1){f=(c[o+4>>2]&-8)-s|0;h=f>>>0<t>>>0;n=h?f:t;f=h?o:m;h=c[o+16>>2]|0;if((h|0)!=0){N=f;O=n;m=N;o=h;t=O;continue}h=c[o+20>>2]|0;if((h|0)==0){L=n;M=f;break}else{N=f;O=n;o=h;m=N;t=O}}}if((M|0)==0){q=s;break}if(!(L>>>0<((c[13456>>2]|0)-s|0)>>>0)){q=s;break}t=M;m=c[13464>>2]|0;if(t>>>0<m>>>0){Mb()}o=t+s|0;e=o;if(!(t>>>0<o>>>0)){Mb()}h=c[M+24>>2]|0;n=c[M+12>>2]|0;do{if((n|0)==(M|0)){f=M+20|0;r=c[f>>2]|0;if((r|0)==0){D=M+16|0;l=c[D>>2]|0;if((l|0)==0){P=0;break}else{Q=l;R=D}}else{Q=r;R=f}while(1){f=Q+20|0;r=c[f>>2]|0;if((r|0)!=0){R=f;Q=r;continue}r=Q+16|0;f=c[r>>2]|0;if((f|0)==0){break}else{Q=f;R=r}}if(R>>>0<m>>>0){Mb()}else{c[R>>2]=0;P=Q;break}}else{r=c[M+8>>2]|0;if(r>>>0<m>>>0){Mb()}f=r+12|0;if((c[f>>2]|0)!=(M|0)){Mb()}D=n+8|0;if((c[D>>2]|0)==(M|0)){c[f>>2]=n;c[D>>2]=r;P=n;break}else{Mb()}}}while(0);c:do{if((h|0)!=0){n=c[M+28>>2]|0;m=13752+(n<<2)|0;do{if((M|0)==(c[m>>2]|0)){c[m>>2]=P;if((P|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<n);break c}else{if(h>>>0<(c[13464>>2]|0)>>>0){Mb()}r=h+16|0;if((c[r>>2]|0)==(M|0)){c[r>>2]=P}else{c[h+20>>2]=P}if((P|0)==0){break c}}}while(0);if(P>>>0<(c[13464>>2]|0)>>>0){Mb()}c[P+24>>2]=h;n=c[M+16>>2]|0;do{if((n|0)!=0){if(n>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[P+16>>2]=n;c[n+24>>2]=P;break}}}while(0);n=c[M+20>>2]|0;if((n|0)==0){break}if(n>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[P+20>>2]=n;c[n+24>>2]=P;break}}}while(0);d:do{if(L>>>0<16){h=L+s|0;c[M+4>>2]=h|3;n=t+(h+4)|0;c[n>>2]=c[n>>2]|1}else{c[M+4>>2]=s|3;c[t+(s|4)>>2]=L|1;c[t+(L+s)>>2]=L;n=L>>>3;if(L>>>0<256){h=n<<1;m=13488+(h<<2)|0;r=c[3362]|0;D=1<<n;do{if((r&D|0)==0){c[3362]=r|D;S=13488+(h+2<<2)|0;T=m}else{n=13488+(h+2<<2)|0;f=c[n>>2]|0;if(!(f>>>0<(c[13464>>2]|0)>>>0)){S=n;T=f;break}Mb()}}while(0);c[S>>2]=e;c[T+12>>2]=e;c[t+(s+8)>>2]=T;c[t+(s+12)>>2]=m;break}h=o;D=L>>>8;do{if((D|0)==0){U=0}else{if(L>>>0>16777215){U=31;break}r=(D+1048320|0)>>>16&8;f=D<<r;n=(f+520192|0)>>>16&4;l=f<<n;f=(l+245760|0)>>>16&2;k=14-(n|r|f)+(l<<f>>>15)|0;U=L>>>(k+7|0)&1|k<<1}}while(0);D=13752+(U<<2)|0;c[t+(s+28)>>2]=U;c[t+(s+20)>>2]=0;c[t+(s+16)>>2]=0;m=c[13452>>2]|0;k=1<<U;if((m&k|0)==0){c[13452>>2]=m|k;c[D>>2]=h;c[t+(s+24)>>2]=D;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break}k=c[D>>2]|0;if((U|0)==31){V=0}else{V=25-(U>>>1)|0}e:do{if((c[k+4>>2]&-8|0)==(L|0)){W=k}else{D=L<<V;m=k;while(1){X=m+(D>>>31<<2)+16|0;f=c[X>>2]|0;if((f|0)==0){break}if((c[f+4>>2]&-8|0)==(L|0)){W=f;break e}else{D=D<<1;m=f}}if(X>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[X>>2]=h;c[t+(s+24)>>2]=m;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break d}}}while(0);k=W+8|0;D=c[k>>2]|0;f=c[13464>>2]|0;if(W>>>0<f>>>0){Mb()}if(D>>>0<f>>>0){Mb()}else{c[D+12>>2]=h;c[k>>2]=h;c[t+(s+8)>>2]=D;c[t+(s+12)>>2]=W;c[t+(s+24)>>2]=0;break}}}while(0);p=M+8|0;i=b;return p|0}}while(0);M=c[13456>>2]|0;if(!(q>>>0>M>>>0)){W=M-q|0;X=c[13468>>2]|0;if(W>>>0>15){L=X;c[13468>>2]=L+q;c[13456>>2]=W;c[L+(q+4)>>2]=W|1;c[L+M>>2]=W;c[X+4>>2]=q|3}else{c[13456>>2]=0;c[13468>>2]=0;c[X+4>>2]=M|3;W=X+(M+4)|0;c[W>>2]=c[W>>2]|1}p=X+8|0;i=b;return p|0}X=c[13460>>2]|0;if(q>>>0<X>>>0){W=X-q|0;c[13460>>2]=W;X=c[13472>>2]|0;M=X;c[13472>>2]=M+q;c[M+(q+4)>>2]=W|1;c[X+4>>2]=q|3;p=X+8|0;i=b;return p|0}do{if((c[3480]|0)==0){X=Oa(30)|0;if((X+ -1&X|0)==0){c[13928>>2]=X;c[13924>>2]=X;c[13932>>2]=-1;c[13936>>2]=-1;c[13940>>2]=0;c[13892>>2]=0;c[3480]=(pb(0)|0)&-16^1431655768;break}else{Mb()}}}while(0);X=q+48|0;W=c[13928>>2]|0;M=q+47|0;L=W+M|0;V=0-W|0;W=L&V;if(!(W>>>0>q>>>0)){p=0;i=b;return p|0}U=c[13888>>2]|0;do{if((U|0)!=0){T=c[13880>>2]|0;S=T+W|0;if(S>>>0<=T>>>0|S>>>0>U>>>0){p=0}else{break}i=b;return p|0}}while(0);f:do{if((c[13892>>2]&4|0)==0){U=c[13472>>2]|0;g:do{if((U|0)==0){Y=182}else{S=U;T=13896|0;while(1){Z=T;P=c[Z>>2]|0;if(!(P>>>0>S>>>0)){_=T+4|0;if((P+(c[_>>2]|0)|0)>>>0>S>>>0){break}}P=c[T+8>>2]|0;if((P|0)==0){Y=182;break g}else{T=P}}if((T|0)==0){Y=182;break}S=L-(c[13460>>2]|0)&V;if(!(S>>>0<2147483647)){$=0;break}h=La(S|0)|0;P=(h|0)==((c[Z>>2]|0)+(c[_>>2]|0)|0);aa=h;ba=S;ca=P?h:-1;da=P?S:0;Y=191}}while(0);do{if((Y|0)==182){U=La(0)|0;if((U|0)==(-1|0)){$=0;break}S=U;P=c[13924>>2]|0;h=P+ -1|0;if((h&S|0)==0){ea=W}else{ea=W-S+(h+S&0-P)|0}P=c[13880>>2]|0;S=P+ea|0;if(!(ea>>>0>q>>>0&ea>>>0<2147483647)){$=0;break}h=c[13888>>2]|0;if((h|0)!=0){if(S>>>0<=P>>>0|S>>>0>h>>>0){$=0;break}}h=La(ea|0)|0;S=(h|0)==(U|0);aa=h;ba=ea;ca=S?U:-1;da=S?ea:0;Y=191}}while(0);h:do{if((Y|0)==191){S=0-ba|0;if((ca|0)!=(-1|0)){fa=ca;ga=da;Y=202;break f}do{if((aa|0)!=(-1|0)&ba>>>0<2147483647&ba>>>0<X>>>0){U=c[13928>>2]|0;h=M-ba+U&0-U;if(!(h>>>0<2147483647)){ha=ba;break}if((La(h|0)|0)==(-1|0)){La(S|0)|0;$=da;break h}else{ha=h+ba|0;break}}else{ha=ba}}while(0);if((aa|0)==(-1|0)){$=da}else{fa=aa;ga=ha;Y=202;break f}}}while(0);c[13892>>2]=c[13892>>2]|4;ia=$;Y=199}else{ia=0;Y=199}}while(0);do{if((Y|0)==199){if(!(W>>>0<2147483647)){break}$=La(W|0)|0;ha=La(0)|0;if(!((ha|0)!=(-1|0)&($|0)!=(-1|0)&$>>>0<ha>>>0)){break}aa=ha-$|0;ha=aa>>>0>(q+40|0)>>>0;if(ha){fa=$;ga=ha?aa:ia;Y=202}}}while(0);do{if((Y|0)==202){ia=(c[13880>>2]|0)+ga|0;c[13880>>2]=ia;if(ia>>>0>(c[13884>>2]|0)>>>0){c[13884>>2]=ia}ia=c[13472>>2]|0;i:do{if((ia|0)==0){W=c[13464>>2]|0;if((W|0)==0|fa>>>0<W>>>0){c[13464>>2]=fa}c[13896>>2]=fa;c[13900>>2]=ga;c[13908>>2]=0;c[13484>>2]=c[3480];c[13480>>2]=-1;W=0;do{aa=W<<1;ha=13488+(aa<<2)|0;c[13488+(aa+3<<2)>>2]=ha;c[13488+(aa+2<<2)>>2]=ha;W=W+1|0;}while((W|0)!=32);W=fa+8|0;if((W&7|0)==0){ja=0}else{ja=0-W&7}W=ga+ -40-ja|0;c[13472>>2]=fa+ja;c[13460>>2]=W;c[fa+(ja+4)>>2]=W|1;c[fa+(ga+ -36)>>2]=40;c[13476>>2]=c[13936>>2]}else{W=13896|0;while(1){ka=c[W>>2]|0;la=W+4|0;ma=c[la>>2]|0;if((fa|0)==(ka+ma|0)){Y=214;break}ha=c[W+8>>2]|0;if((ha|0)==0){break}else{W=ha}}do{if((Y|0)==214){if((c[W+12>>2]&8|0)!=0){break}ha=ia;if(!(ha>>>0>=ka>>>0&ha>>>0<fa>>>0)){break}c[la>>2]=ma+ga;aa=(c[13460>>2]|0)+ga|0;$=ia+8|0;if(($&7|0)==0){na=0}else{na=0-$&7}$=aa-na|0;c[13472>>2]=ha+na;c[13460>>2]=$;c[ha+(na+4)>>2]=$|1;c[ha+(aa+4)>>2]=40;c[13476>>2]=c[13936>>2];break i}}while(0);if(fa>>>0<(c[13464>>2]|0)>>>0){c[13464>>2]=fa}W=fa+ga|0;aa=13896|0;while(1){oa=aa;if((c[oa>>2]|0)==(W|0)){Y=224;break}ha=c[aa+8>>2]|0;if((ha|0)==0){break}else{aa=ha}}do{if((Y|0)==224){if((c[aa+12>>2]&8|0)!=0){break}c[oa>>2]=fa;W=aa+4|0;c[W>>2]=(c[W>>2]|0)+ga;W=fa+8|0;if((W&7|0)==0){pa=0}else{pa=0-W&7}W=fa+(ga+8)|0;if((W&7|0)==0){qa=0}else{qa=0-W&7}W=fa+(qa+ga)|0;ha=W;$=pa+q|0;da=fa+$|0;ba=da;M=W-(fa+pa)-q|0;c[fa+(pa+4)>>2]=q|3;j:do{if((ha|0)==(c[13472>>2]|0)){X=(c[13460>>2]|0)+M|0;c[13460>>2]=X;c[13472>>2]=ba;c[fa+($+4)>>2]=X|1}else{if((ha|0)==(c[13468>>2]|0)){X=(c[13456>>2]|0)+M|0;c[13456>>2]=X;c[13468>>2]=ba;c[fa+($+4)>>2]=X|1;c[fa+(X+$)>>2]=X;break}X=ga+4|0;ca=c[fa+(X+qa)>>2]|0;if((ca&3|0)==1){ea=ca&-8;_=ca>>>3;k:do{if(ca>>>0<256){Z=c[fa+((qa|8)+ga)>>2]|0;V=c[fa+(ga+12+qa)>>2]|0;L=13488+(_<<1<<2)|0;do{if((Z|0)!=(L|0)){if(Z>>>0<(c[13464>>2]|0)>>>0){Mb()}if((c[Z+12>>2]|0)==(ha|0)){break}Mb()}}while(0);if((V|0)==(Z|0)){c[3362]=c[3362]&~(1<<_);break}do{if((V|0)==(L|0)){ra=V+8|0}else{if(V>>>0<(c[13464>>2]|0)>>>0){Mb()}S=V+8|0;if((c[S>>2]|0)==(ha|0)){ra=S;break}Mb()}}while(0);c[Z+12>>2]=V;c[ra>>2]=Z}else{L=W;S=c[fa+((qa|24)+ga)>>2]|0;T=c[fa+(ga+12+qa)>>2]|0;do{if((T|0)==(L|0)){h=qa|16;U=fa+(X+h)|0;P=c[U>>2]|0;if((P|0)==0){Q=fa+(h+ga)|0;h=c[Q>>2]|0;if((h|0)==0){sa=0;break}else{ta=h;ua=Q}}else{ta=P;ua=U}while(1){U=ta+20|0;P=c[U>>2]|0;if((P|0)!=0){ua=U;ta=P;continue}P=ta+16|0;U=c[P>>2]|0;if((U|0)==0){break}else{ta=U;ua=P}}if(ua>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[ua>>2]=0;sa=ta;break}}else{P=c[fa+((qa|8)+ga)>>2]|0;if(P>>>0<(c[13464>>2]|0)>>>0){Mb()}U=P+12|0;if((c[U>>2]|0)!=(L|0)){Mb()}Q=T+8|0;if((c[Q>>2]|0)==(L|0)){c[U>>2]=T;c[Q>>2]=P;sa=T;break}else{Mb()}}}while(0);if((S|0)==0){break}T=c[fa+(ga+28+qa)>>2]|0;Z=13752+(T<<2)|0;do{if((L|0)==(c[Z>>2]|0)){c[Z>>2]=sa;if((sa|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<T);break k}else{if(S>>>0<(c[13464>>2]|0)>>>0){Mb()}V=S+16|0;if((c[V>>2]|0)==(L|0)){c[V>>2]=sa}else{c[S+20>>2]=sa}if((sa|0)==0){break k}}}while(0);if(sa>>>0<(c[13464>>2]|0)>>>0){Mb()}c[sa+24>>2]=S;L=qa|16;T=c[fa+(L+ga)>>2]|0;do{if((T|0)!=0){if(T>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[sa+16>>2]=T;c[T+24>>2]=sa;break}}}while(0);T=c[fa+(X+L)>>2]|0;if((T|0)==0){break}if(T>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[sa+20>>2]=T;c[T+24>>2]=sa;break}}}while(0);va=fa+((ea|qa)+ga)|0;wa=ea+M|0}else{va=ha;wa=M}X=va+4|0;c[X>>2]=c[X>>2]&-2;c[fa+($+4)>>2]=wa|1;c[fa+(wa+$)>>2]=wa;X=wa>>>3;if(wa>>>0<256){_=X<<1;ca=13488+(_<<2)|0;T=c[3362]|0;S=1<<X;do{if((T&S|0)==0){c[3362]=T|S;xa=13488+(_+2<<2)|0;ya=ca}else{X=13488+(_+2<<2)|0;Z=c[X>>2]|0;if(!(Z>>>0<(c[13464>>2]|0)>>>0)){xa=X;ya=Z;break}Mb()}}while(0);c[xa>>2]=ba;c[ya+12>>2]=ba;c[fa+($+8)>>2]=ya;c[fa+($+12)>>2]=ca;break}_=da;S=wa>>>8;do{if((S|0)==0){za=0}else{if(wa>>>0>16777215){za=31;break}T=(S+1048320|0)>>>16&8;ea=S<<T;Z=(ea+520192|0)>>>16&4;X=ea<<Z;ea=(X+245760|0)>>>16&2;V=14-(Z|T|ea)+(X<<ea>>>15)|0;za=wa>>>(V+7|0)&1|V<<1}}while(0);S=13752+(za<<2)|0;c[fa+($+28)>>2]=za;c[fa+($+20)>>2]=0;c[fa+($+16)>>2]=0;ca=c[13452>>2]|0;V=1<<za;if((ca&V|0)==0){c[13452>>2]=ca|V;c[S>>2]=_;c[fa+($+24)>>2]=S;c[fa+($+12)>>2]=_;c[fa+($+8)>>2]=_;break}V=c[S>>2]|0;if((za|0)==31){Aa=0}else{Aa=25-(za>>>1)|0}l:do{if((c[V+4>>2]&-8|0)==(wa|0)){Ba=V}else{S=wa<<Aa;ca=V;while(1){Ca=ca+(S>>>31<<2)+16|0;ea=c[Ca>>2]|0;if((ea|0)==0){break}if((c[ea+4>>2]&-8|0)==(wa|0)){Ba=ea;break l}else{S=S<<1;ca=ea}}if(Ca>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[Ca>>2]=_;c[fa+($+24)>>2]=ca;c[fa+($+12)>>2]=_;c[fa+($+8)>>2]=_;break j}}}while(0);V=Ba+8|0;S=c[V>>2]|0;L=c[13464>>2]|0;if(Ba>>>0<L>>>0){Mb()}if(S>>>0<L>>>0){Mb()}else{c[S+12>>2]=_;c[V>>2]=_;c[fa+($+8)>>2]=S;c[fa+($+12)>>2]=Ba;c[fa+($+24)>>2]=0;break}}}while(0);p=fa+(pa|8)|0;i=b;return p|0}}while(0);aa=ia;$=13896|0;while(1){Da=c[$>>2]|0;if(!(Da>>>0>aa>>>0)){Ea=c[$+4>>2]|0;Fa=Da+Ea|0;if(Fa>>>0>aa>>>0){break}}$=c[$+8>>2]|0}$=Da+(Ea+ -39)|0;if(($&7|0)==0){Ga=0}else{Ga=0-$&7}$=Da+(Ea+ -47+Ga)|0;da=$>>>0<(ia+16|0)>>>0?aa:$;$=da+8|0;ba=$;M=fa+8|0;if((M&7|0)==0){Ha=0}else{Ha=0-M&7}M=ga+ -40-Ha|0;c[13472>>2]=fa+Ha;c[13460>>2]=M;c[fa+(Ha+4)>>2]=M|1;c[fa+(ga+ -36)>>2]=40;c[13476>>2]=c[13936>>2];c[da+4>>2]=27;c[$+0>>2]=c[13896>>2];c[$+4>>2]=c[13900>>2];c[$+8>>2]=c[13904>>2];c[$+12>>2]=c[13908>>2];c[13896>>2]=fa;c[13900>>2]=ga;c[13908>>2]=0;c[13904>>2]=ba;ba=da+28|0;c[ba>>2]=7;if((da+32|0)>>>0<Fa>>>0){$=ba;while(1){ba=$+4|0;c[ba>>2]=7;if(($+8|0)>>>0<Fa>>>0){$=ba}else{break}}}if((da|0)==(aa|0)){break}$=da-ia|0;ba=aa+($+4)|0;c[ba>>2]=c[ba>>2]&-2;c[ia+4>>2]=$|1;c[aa+$>>2]=$;ba=$>>>3;if($>>>0<256){M=ba<<1;ha=13488+(M<<2)|0;W=c[3362]|0;m=1<<ba;do{if((W&m|0)==0){c[3362]=W|m;Ia=13488+(M+2<<2)|0;Ja=ha}else{ba=13488+(M+2<<2)|0;S=c[ba>>2]|0;if(!(S>>>0<(c[13464>>2]|0)>>>0)){Ia=ba;Ja=S;break}Mb()}}while(0);c[Ia>>2]=ia;c[Ja+12>>2]=ia;c[ia+8>>2]=Ja;c[ia+12>>2]=ha;break}M=ia;m=$>>>8;do{if((m|0)==0){Ka=0}else{if($>>>0>16777215){Ka=31;break}W=(m+1048320|0)>>>16&8;aa=m<<W;da=(aa+520192|0)>>>16&4;S=aa<<da;aa=(S+245760|0)>>>16&2;ba=14-(da|W|aa)+(S<<aa>>>15)|0;Ka=$>>>(ba+7|0)&1|ba<<1}}while(0);m=13752+(Ka<<2)|0;c[ia+28>>2]=Ka;c[ia+20>>2]=0;c[ia+16>>2]=0;ha=c[13452>>2]|0;ba=1<<Ka;if((ha&ba|0)==0){c[13452>>2]=ha|ba;c[m>>2]=M;c[ia+24>>2]=m;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}ba=c[m>>2]|0;if((Ka|0)==31){Ma=0}else{Ma=25-(Ka>>>1)|0}m:do{if((c[ba+4>>2]&-8|0)==($|0)){Na=ba}else{m=$<<Ma;ha=ba;while(1){Pa=ha+(m>>>31<<2)+16|0;aa=c[Pa>>2]|0;if((aa|0)==0){break}if((c[aa+4>>2]&-8|0)==($|0)){Na=aa;break m}else{m=m<<1;ha=aa}}if(Pa>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[Pa>>2]=M;c[ia+24>>2]=ha;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break i}}}while(0);$=Na+8|0;ba=c[$>>2]|0;m=c[13464>>2]|0;if(Na>>>0<m>>>0){Mb()}if(ba>>>0<m>>>0){Mb()}else{c[ba+12>>2]=M;c[$>>2]=M;c[ia+8>>2]=ba;c[ia+12>>2]=Na;c[ia+24>>2]=0;break}}}while(0);ia=c[13460>>2]|0;if(!(ia>>>0>q>>>0)){break}ba=ia-q|0;c[13460>>2]=ba;ia=c[13472>>2]|0;$=ia;c[13472>>2]=$+q;c[$+(q+4)>>2]=ba|1;c[ia+4>>2]=q|3;p=ia+8|0;i=b;return p|0}}while(0);c[(ac()|0)>>2]=12;p=0;i=b;return p|0}function Lm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,N=0,O=0,P=0,Q=0;b=i;if((a|0)==0){i=b;return}d=a+ -8|0;e=d;f=c[13464>>2]|0;if(d>>>0<f>>>0){Mb()}g=c[a+ -4>>2]|0;h=g&3;if((h|0)==1){Mb()}j=g&-8;k=a+(j+ -8)|0;l=k;a:do{if((g&1|0)==0){m=c[d>>2]|0;if((h|0)==0){i=b;return}n=-8-m|0;o=a+n|0;p=o;q=m+j|0;if(o>>>0<f>>>0){Mb()}if((p|0)==(c[13468>>2]|0)){r=a+(j+ -4)|0;if((c[r>>2]&3|0)!=3){s=p;t=q;break}c[13456>>2]=q;c[r>>2]=c[r>>2]&-2;c[a+(n+4)>>2]=q|1;c[k>>2]=q;i=b;return}r=m>>>3;if(m>>>0<256){m=c[a+(n+8)>>2]|0;u=c[a+(n+12)>>2]|0;v=13488+(r<<1<<2)|0;do{if((m|0)!=(v|0)){if(m>>>0<f>>>0){Mb()}if((c[m+12>>2]|0)==(p|0)){break}Mb()}}while(0);if((u|0)==(m|0)){c[3362]=c[3362]&~(1<<r);s=p;t=q;break}do{if((u|0)==(v|0)){w=u+8|0}else{if(u>>>0<f>>>0){Mb()}x=u+8|0;if((c[x>>2]|0)==(p|0)){w=x;break}Mb()}}while(0);c[m+12>>2]=u;c[w>>2]=m;s=p;t=q;break}v=o;r=c[a+(n+24)>>2]|0;x=c[a+(n+12)>>2]|0;do{if((x|0)==(v|0)){y=a+(n+20)|0;z=c[y>>2]|0;if((z|0)==0){A=a+(n+16)|0;B=c[A>>2]|0;if((B|0)==0){C=0;break}else{D=B;E=A}}else{D=z;E=y}while(1){y=D+20|0;z=c[y>>2]|0;if((z|0)!=0){E=y;D=z;continue}z=D+16|0;y=c[z>>2]|0;if((y|0)==0){break}else{D=y;E=z}}if(E>>>0<f>>>0){Mb()}else{c[E>>2]=0;C=D;break}}else{z=c[a+(n+8)>>2]|0;if(z>>>0<f>>>0){Mb()}y=z+12|0;if((c[y>>2]|0)!=(v|0)){Mb()}A=x+8|0;if((c[A>>2]|0)==(v|0)){c[y>>2]=x;c[A>>2]=z;C=x;break}else{Mb()}}}while(0);if((r|0)==0){s=p;t=q;break}x=c[a+(n+28)>>2]|0;o=13752+(x<<2)|0;do{if((v|0)==(c[o>>2]|0)){c[o>>2]=C;if((C|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<x);s=p;t=q;break a}else{if(r>>>0<(c[13464>>2]|0)>>>0){Mb()}m=r+16|0;if((c[m>>2]|0)==(v|0)){c[m>>2]=C}else{c[r+20>>2]=C}if((C|0)==0){s=p;t=q;break a}}}while(0);if(C>>>0<(c[13464>>2]|0)>>>0){Mb()}c[C+24>>2]=r;v=c[a+(n+16)>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[C+16>>2]=v;c[v+24>>2]=C;break}}}while(0);v=c[a+(n+20)>>2]|0;if((v|0)==0){s=p;t=q;break}if(v>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[C+20>>2]=v;c[v+24>>2]=C;s=p;t=q;break}}else{s=e;t=j}}while(0);e=s;if(!(e>>>0<k>>>0)){Mb()}C=a+(j+ -4)|0;f=c[C>>2]|0;if((f&1|0)==0){Mb()}do{if((f&2|0)==0){if((l|0)==(c[13472>>2]|0)){D=(c[13460>>2]|0)+t|0;c[13460>>2]=D;c[13472>>2]=s;c[s+4>>2]=D|1;if((s|0)!=(c[13468>>2]|0)){i=b;return}c[13468>>2]=0;c[13456>>2]=0;i=b;return}if((l|0)==(c[13468>>2]|0)){D=(c[13456>>2]|0)+t|0;c[13456>>2]=D;c[13468>>2]=s;c[s+4>>2]=D|1;c[e+D>>2]=D;i=b;return}D=(f&-8)+t|0;E=f>>>3;b:do{if(f>>>0<256){w=c[a+j>>2]|0;h=c[a+(j|4)>>2]|0;d=13488+(E<<1<<2)|0;do{if((w|0)!=(d|0)){if(w>>>0<(c[13464>>2]|0)>>>0){Mb()}if((c[w+12>>2]|0)==(l|0)){break}Mb()}}while(0);if((h|0)==(w|0)){c[3362]=c[3362]&~(1<<E);break}do{if((h|0)==(d|0)){F=h+8|0}else{if(h>>>0<(c[13464>>2]|0)>>>0){Mb()}g=h+8|0;if((c[g>>2]|0)==(l|0)){F=g;break}Mb()}}while(0);c[w+12>>2]=h;c[F>>2]=w}else{d=k;g=c[a+(j+16)>>2]|0;v=c[a+(j|4)>>2]|0;do{if((v|0)==(d|0)){r=a+(j+12)|0;x=c[r>>2]|0;if((x|0)==0){o=a+(j+8)|0;m=c[o>>2]|0;if((m|0)==0){G=0;break}else{H=m;I=o}}else{H=x;I=r}while(1){r=H+20|0;x=c[r>>2]|0;if((x|0)!=0){I=r;H=x;continue}x=H+16|0;r=c[x>>2]|0;if((r|0)==0){break}else{H=r;I=x}}if(I>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[I>>2]=0;G=H;break}}else{x=c[a+j>>2]|0;if(x>>>0<(c[13464>>2]|0)>>>0){Mb()}r=x+12|0;if((c[r>>2]|0)!=(d|0)){Mb()}o=v+8|0;if((c[o>>2]|0)==(d|0)){c[r>>2]=v;c[o>>2]=x;G=v;break}else{Mb()}}}while(0);if((g|0)==0){break}v=c[a+(j+20)>>2]|0;w=13752+(v<<2)|0;do{if((d|0)==(c[w>>2]|0)){c[w>>2]=G;if((G|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<v);break b}else{if(g>>>0<(c[13464>>2]|0)>>>0){Mb()}h=g+16|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=G}else{c[g+20>>2]=G}if((G|0)==0){break b}}}while(0);if(G>>>0<(c[13464>>2]|0)>>>0){Mb()}c[G+24>>2]=g;d=c[a+(j+8)>>2]|0;do{if((d|0)!=0){if(d>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[G+16>>2]=d;c[d+24>>2]=G;break}}}while(0);d=c[a+(j+12)>>2]|0;if((d|0)==0){break}if(d>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[G+20>>2]=d;c[d+24>>2]=G;break}}}while(0);c[s+4>>2]=D|1;c[e+D>>2]=D;if((s|0)!=(c[13468>>2]|0)){J=D;break}c[13456>>2]=D;i=b;return}else{c[C>>2]=f&-2;c[s+4>>2]=t|1;c[e+t>>2]=t;J=t}}while(0);t=J>>>3;if(J>>>0<256){e=t<<1;f=13488+(e<<2)|0;C=c[3362]|0;G=1<<t;do{if((C&G|0)==0){c[3362]=C|G;K=13488+(e+2<<2)|0;L=f}else{t=13488+(e+2<<2)|0;j=c[t>>2]|0;if(!(j>>>0<(c[13464>>2]|0)>>>0)){K=t;L=j;break}Mb()}}while(0);c[K>>2]=s;c[L+12>>2]=s;c[s+8>>2]=L;c[s+12>>2]=f;i=b;return}f=s;L=J>>>8;do{if((L|0)==0){M=0}else{if(J>>>0>16777215){M=31;break}K=(L+1048320|0)>>>16&8;e=L<<K;G=(e+520192|0)>>>16&4;C=e<<G;e=(C+245760|0)>>>16&2;j=14-(G|K|e)+(C<<e>>>15)|0;M=J>>>(j+7|0)&1|j<<1}}while(0);L=13752+(M<<2)|0;c[s+28>>2]=M;c[s+20>>2]=0;c[s+16>>2]=0;j=c[13452>>2]|0;e=1<<M;c:do{if((j&e|0)==0){c[13452>>2]=j|e;c[L>>2]=f;c[s+24>>2]=L;c[s+12>>2]=s;c[s+8>>2]=s}else{C=c[L>>2]|0;if((M|0)==31){N=0}else{N=25-(M>>>1)|0}d:do{if((c[C+4>>2]&-8|0)==(J|0)){O=C}else{K=J<<N;G=C;while(1){P=G+(K>>>31<<2)+16|0;t=c[P>>2]|0;if((t|0)==0){break}if((c[t+4>>2]&-8|0)==(J|0)){O=t;break d}else{K=K<<1;G=t}}if(P>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[P>>2]=f;c[s+24>>2]=G;c[s+12>>2]=s;c[s+8>>2]=s;break c}}}while(0);C=O+8|0;D=c[C>>2]|0;K=c[13464>>2]|0;if(O>>>0<K>>>0){Mb()}if(D>>>0<K>>>0){Mb()}else{c[D+12>>2]=f;c[C>>2]=f;c[s+8>>2]=D;c[s+12>>2]=O;c[s+24>>2]=0;break}}}while(0);s=(c[13480>>2]|0)+ -1|0;c[13480>>2]=s;if((s|0)==0){Q=13904|0}else{i=b;return}while(1){s=c[Q>>2]|0;if((s|0)==0){break}else{Q=s+8|0}}c[13480>>2]=-1;i=b;return}function Mm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((a|0)==0){e=Km(b)|0;i=d;return e|0}if(b>>>0>4294967231){c[(ac()|0)>>2]=12;e=0;i=d;return e|0}if(b>>>0<11){f=16}else{f=b+11&-8}g=Nm(a+ -8|0,f)|0;if((g|0)!=0){e=g+8|0;i=d;return e|0}g=Km(b)|0;if((g|0)==0){e=0;i=d;return e|0}f=c[a+ -4>>2]|0;h=(f&-8)-((f&3|0)==0?8:4)|0;mn(g|0,a|0,(h>>>0<b>>>0?h:b)|0)|0;Lm(a);e=g;i=d;return e|0}function Nm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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=i;e=a+4|0;f=c[e>>2]|0;g=f&-8;h=a;j=h+g|0;k=j;l=c[13464>>2]|0;if(h>>>0<l>>>0){Mb()}m=f&3;if(!((m|0)!=1&h>>>0<j>>>0)){Mb()}n=h+(g|4)|0;o=c[n>>2]|0;if((o&1|0)==0){Mb()}if((m|0)==0){if(b>>>0<256){p=0;i=d;return p|0}do{if(!(g>>>0<(b+4|0)>>>0)){if((g-b|0)>>>0>c[13928>>2]<<1>>>0){break}else{p=a}i=d;return p|0}}while(0);p=0;i=d;return p|0}if(!(g>>>0<b>>>0)){m=g-b|0;if(!(m>>>0>15)){p=a;i=d;return p|0}c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=m|3;c[n>>2]=c[n>>2]|1;Om(h+b|0,m);p=a;i=d;return p|0}if((k|0)==(c[13472>>2]|0)){m=(c[13460>>2]|0)+g|0;if(!(m>>>0>b>>>0)){p=0;i=d;return p|0}n=m-b|0;c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=n|1;c[13472>>2]=h+b;c[13460>>2]=n;p=a;i=d;return p|0}if((k|0)==(c[13468>>2]|0)){n=(c[13456>>2]|0)+g|0;if(n>>>0<b>>>0){p=0;i=d;return p|0}m=n-b|0;if(m>>>0>15){c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=m|1;c[h+n>>2]=m;q=h+(n+4)|0;c[q>>2]=c[q>>2]&-2;r=h+b|0;s=m}else{c[e>>2]=f&1|n|2;f=h+(n+4)|0;c[f>>2]=c[f>>2]|1;r=0;s=0}c[13456>>2]=s;c[13468>>2]=r;p=a;i=d;return p|0}if((o&2|0)!=0){p=0;i=d;return p|0}r=(o&-8)+g|0;if(r>>>0<b>>>0){p=0;i=d;return p|0}s=r-b|0;f=o>>>3;a:do{if(o>>>0<256){n=c[h+(g+8)>>2]|0;m=c[h+(g+12)>>2]|0;q=13488+(f<<1<<2)|0;do{if((n|0)!=(q|0)){if(n>>>0<l>>>0){Mb()}if((c[n+12>>2]|0)==(k|0)){break}Mb()}}while(0);if((m|0)==(n|0)){c[3362]=c[3362]&~(1<<f);break}do{if((m|0)==(q|0)){t=m+8|0}else{if(m>>>0<l>>>0){Mb()}u=m+8|0;if((c[u>>2]|0)==(k|0)){t=u;break}Mb()}}while(0);c[n+12>>2]=m;c[t>>2]=n}else{q=j;u=c[h+(g+24)>>2]|0;v=c[h+(g+12)>>2]|0;do{if((v|0)==(q|0)){w=h+(g+20)|0;x=c[w>>2]|0;if((x|0)==0){y=h+(g+16)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){C=w;B=x;continue}x=B+16|0;w=c[x>>2]|0;if((w|0)==0){break}else{B=w;C=x}}if(C>>>0<l>>>0){Mb()}else{c[C>>2]=0;A=B;break}}else{x=c[h+(g+8)>>2]|0;if(x>>>0<l>>>0){Mb()}w=x+12|0;if((c[w>>2]|0)!=(q|0)){Mb()}y=v+8|0;if((c[y>>2]|0)==(q|0)){c[w>>2]=v;c[y>>2]=x;A=v;break}else{Mb()}}}while(0);if((u|0)==0){break}v=c[h+(g+28)>>2]|0;n=13752+(v<<2)|0;do{if((q|0)==(c[n>>2]|0)){c[n>>2]=A;if((A|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<v);break a}else{if(u>>>0<(c[13464>>2]|0)>>>0){Mb()}m=u+16|0;if((c[m>>2]|0)==(q|0)){c[m>>2]=A}else{c[u+20>>2]=A}if((A|0)==0){break a}}}while(0);if(A>>>0<(c[13464>>2]|0)>>>0){Mb()}c[A+24>>2]=u;q=c[h+(g+16)>>2]|0;do{if((q|0)!=0){if(q>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[A+16>>2]=q;c[q+24>>2]=A;break}}}while(0);q=c[h+(g+20)>>2]|0;if((q|0)==0){break}if(q>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[A+20>>2]=q;c[q+24>>2]=A;break}}}while(0);if(s>>>0<16){c[e>>2]=r|c[e>>2]&1|2;A=h+(r|4)|0;c[A>>2]=c[A>>2]|1;p=a;i=d;return p|0}else{c[e>>2]=c[e>>2]&1|b|2;c[h+(b+4)>>2]=s|3;e=h+(r|4)|0;c[e>>2]=c[e>>2]|1;Om(h+b|0,s);p=a;i=d;return p|0}return 0}function Om(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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,N=0;d=i;e=a;f=e+b|0;g=f;h=c[a+4>>2]|0;a:do{if((h&1|0)==0){j=c[a>>2]|0;if((h&3|0)==0){i=d;return}k=e+(0-j)|0;l=k;m=j+b|0;n=c[13464>>2]|0;if(k>>>0<n>>>0){Mb()}if((l|0)==(c[13468>>2]|0)){o=e+(b+4)|0;if((c[o>>2]&3|0)!=3){p=l;q=m;break}c[13456>>2]=m;c[o>>2]=c[o>>2]&-2;c[e+(4-j)>>2]=m|1;c[f>>2]=m;i=d;return}o=j>>>3;if(j>>>0<256){r=c[e+(8-j)>>2]|0;s=c[e+(12-j)>>2]|0;t=13488+(o<<1<<2)|0;do{if((r|0)!=(t|0)){if(r>>>0<n>>>0){Mb()}if((c[r+12>>2]|0)==(l|0)){break}Mb()}}while(0);if((s|0)==(r|0)){c[3362]=c[3362]&~(1<<o);p=l;q=m;break}do{if((s|0)==(t|0)){u=s+8|0}else{if(s>>>0<n>>>0){Mb()}v=s+8|0;if((c[v>>2]|0)==(l|0)){u=v;break}Mb()}}while(0);c[r+12>>2]=s;c[u>>2]=r;p=l;q=m;break}t=k;o=c[e+(24-j)>>2]|0;v=c[e+(12-j)>>2]|0;do{if((v|0)==(t|0)){w=16-j|0;x=e+(w+4)|0;y=c[x>>2]|0;if((y|0)==0){z=e+w|0;w=c[z>>2]|0;if((w|0)==0){A=0;break}else{B=w;C=z}}else{B=y;C=x}while(1){x=B+20|0;y=c[x>>2]|0;if((y|0)!=0){C=x;B=y;continue}y=B+16|0;x=c[y>>2]|0;if((x|0)==0){break}else{B=x;C=y}}if(C>>>0<n>>>0){Mb()}else{c[C>>2]=0;A=B;break}}else{y=c[e+(8-j)>>2]|0;if(y>>>0<n>>>0){Mb()}x=y+12|0;if((c[x>>2]|0)!=(t|0)){Mb()}z=v+8|0;if((c[z>>2]|0)==(t|0)){c[x>>2]=v;c[z>>2]=y;A=v;break}else{Mb()}}}while(0);if((o|0)==0){p=l;q=m;break}v=c[e+(28-j)>>2]|0;n=13752+(v<<2)|0;do{if((t|0)==(c[n>>2]|0)){c[n>>2]=A;if((A|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<v);p=l;q=m;break a}else{if(o>>>0<(c[13464>>2]|0)>>>0){Mb()}k=o+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[o+20>>2]=A}if((A|0)==0){p=l;q=m;break a}}}while(0);if(A>>>0<(c[13464>>2]|0)>>>0){Mb()}c[A+24>>2]=o;t=16-j|0;v=c[e+t>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[A+16>>2]=v;c[v+24>>2]=A;break}}}while(0);v=c[e+(t+4)>>2]|0;if((v|0)==0){p=l;q=m;break}if(v>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[A+20>>2]=v;c[v+24>>2]=A;p=l;q=m;break}}else{p=a;q=b}}while(0);a=c[13464>>2]|0;if(f>>>0<a>>>0){Mb()}A=e+(b+4)|0;B=c[A>>2]|0;do{if((B&2|0)==0){if((g|0)==(c[13472>>2]|0)){C=(c[13460>>2]|0)+q|0;c[13460>>2]=C;c[13472>>2]=p;c[p+4>>2]=C|1;if((p|0)!=(c[13468>>2]|0)){i=d;return}c[13468>>2]=0;c[13456>>2]=0;i=d;return}if((g|0)==(c[13468>>2]|0)){C=(c[13456>>2]|0)+q|0;c[13456>>2]=C;c[13468>>2]=p;c[p+4>>2]=C|1;c[p+C>>2]=C;i=d;return}C=(B&-8)+q|0;u=B>>>3;b:do{if(B>>>0<256){h=c[e+(b+8)>>2]|0;v=c[e+(b+12)>>2]|0;j=13488+(u<<1<<2)|0;do{if((h|0)!=(j|0)){if(h>>>0<a>>>0){Mb()}if((c[h+12>>2]|0)==(g|0)){break}Mb()}}while(0);if((v|0)==(h|0)){c[3362]=c[3362]&~(1<<u);break}do{if((v|0)==(j|0)){D=v+8|0}else{if(v>>>0<a>>>0){Mb()}o=v+8|0;if((c[o>>2]|0)==(g|0)){D=o;break}Mb()}}while(0);c[h+12>>2]=v;c[D>>2]=h}else{j=f;o=c[e+(b+24)>>2]|0;n=c[e+(b+12)>>2]|0;do{if((n|0)==(j|0)){k=e+(b+20)|0;r=c[k>>2]|0;if((r|0)==0){s=e+(b+16)|0;y=c[s>>2]|0;if((y|0)==0){E=0;break}else{F=y;G=s}}else{F=r;G=k}while(1){k=F+20|0;r=c[k>>2]|0;if((r|0)!=0){G=k;F=r;continue}r=F+16|0;k=c[r>>2]|0;if((k|0)==0){break}else{F=k;G=r}}if(G>>>0<a>>>0){Mb()}else{c[G>>2]=0;E=F;break}}else{r=c[e+(b+8)>>2]|0;if(r>>>0<a>>>0){Mb()}k=r+12|0;if((c[k>>2]|0)!=(j|0)){Mb()}s=n+8|0;if((c[s>>2]|0)==(j|0)){c[k>>2]=n;c[s>>2]=r;E=n;break}else{Mb()}}}while(0);if((o|0)==0){break}n=c[e+(b+28)>>2]|0;h=13752+(n<<2)|0;do{if((j|0)==(c[h>>2]|0)){c[h>>2]=E;if((E|0)!=0){break}c[13452>>2]=c[13452>>2]&~(1<<n);break b}else{if(o>>>0<(c[13464>>2]|0)>>>0){Mb()}v=o+16|0;if((c[v>>2]|0)==(j|0)){c[v>>2]=E}else{c[o+20>>2]=E}if((E|0)==0){break b}}}while(0);if(E>>>0<(c[13464>>2]|0)>>>0){Mb()}c[E+24>>2]=o;j=c[e+(b+16)>>2]|0;do{if((j|0)!=0){if(j>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[E+16>>2]=j;c[j+24>>2]=E;break}}}while(0);j=c[e+(b+20)>>2]|0;if((j|0)==0){break}if(j>>>0<(c[13464>>2]|0)>>>0){Mb()}else{c[E+20>>2]=j;c[j+24>>2]=E;break}}}while(0);c[p+4>>2]=C|1;c[p+C>>2]=C;if((p|0)!=(c[13468>>2]|0)){H=C;break}c[13456>>2]=C;i=d;return}else{c[A>>2]=B&-2;c[p+4>>2]=q|1;c[p+q>>2]=q;H=q}}while(0);q=H>>>3;if(H>>>0<256){B=q<<1;A=13488+(B<<2)|0;E=c[3362]|0;b=1<<q;do{if((E&b|0)==0){c[3362]=E|b;I=13488+(B+2<<2)|0;J=A}else{q=13488+(B+2<<2)|0;e=c[q>>2]|0;if(!(e>>>0<(c[13464>>2]|0)>>>0)){I=q;J=e;break}Mb()}}while(0);c[I>>2]=p;c[J+12>>2]=p;c[p+8>>2]=J;c[p+12>>2]=A;i=d;return}A=p;J=H>>>8;do{if((J|0)==0){K=0}else{if(H>>>0>16777215){K=31;break}I=(J+1048320|0)>>>16&8;B=J<<I;b=(B+520192|0)>>>16&4;E=B<<b;B=(E+245760|0)>>>16&2;e=14-(b|I|B)+(E<<B>>>15)|0;K=H>>>(e+7|0)&1|e<<1}}while(0);J=13752+(K<<2)|0;c[p+28>>2]=K;c[p+20>>2]=0;c[p+16>>2]=0;e=c[13452>>2]|0;B=1<<K;if((e&B|0)==0){c[13452>>2]=e|B;c[J>>2]=A;c[p+24>>2]=J;c[p+12>>2]=p;c[p+8>>2]=p;i=d;return}B=c[J>>2]|0;if((K|0)==31){L=0}else{L=25-(K>>>1)|0}c:do{if((c[B+4>>2]&-8|0)==(H|0)){M=B}else{K=H<<L;J=B;while(1){N=J+(K>>>31<<2)+16|0;e=c[N>>2]|0;if((e|0)==0){break}if((c[e+4>>2]&-8|0)==(H|0)){M=e;break c}else{K=K<<1;J=e}}if(N>>>0<(c[13464>>2]|0)>>>0){Mb()}c[N>>2]=A;c[p+24>>2]=J;c[p+12>>2]=p;c[p+8>>2]=p;i=d;return}}while(0);N=M+8|0;H=c[N>>2]|0;B=c[13464>>2]|0;if(M>>>0<B>>>0){Mb()}if(H>>>0<B>>>0){Mb()}c[H+12>>2]=A;c[N>>2]=A;c[p+8>>2]=H;c[p+12>>2]=M;c[p+24>>2]=0;i=d;return}function Pm(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=(a|0)==0?1:a;while(1){e=Km(d)|0;if((e|0)!=0){f=6;break}a=c[3486]|0;c[3486]=a+0;if((a|0)==0){f=5;break}tc[a&0]()}if((f|0)==5){d=vb(4)|0;c[d>>2]=13960;cc(d|0,14008,115)}else if((f|0)==6){i=b;return e|0}return 0}function Qm(a){a=a|0;var b=0,c=0;b=i;c=Pm(a)|0;i=b;return c|0}function Rm(a){a=a|0;var b=0;b=i;if((a|0)!=0){Lm(a)}i=b;return}function Sm(a){a=a|0;var b=0;b=i;Rm(a);i=b;return}function Tm(a){a=a|0;var b=0;b=i;Ta(a|0);Rm(a);i=b;return}function Um(a){a=a|0;var b=0;b=i;Ta(a|0);i=b;return}function Vm(a){a=a|0;i=i;return 13976}function Wm(){var a=0;a=vb(4)|0;c[a>>2]=13960;cc(a|0,14008,115)}function Xm(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0.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,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ga=0,ha=0,ia=0.0,ja=0,ka=0.0,la=0,ma=0.0,na=0,oa=0.0,pa=0.0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0.0,ya=0,za=0.0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0.0,Fa=0,Ga=0.0,Ha=0.0,Ia=0,Ja=0.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,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0.0,Bc=0,Cc=0,Dc=0.0,Ec=0.0,Fc=0.0,Gc=0.0,Hc=0.0,Ic=0.0,Jc=0,Kc=0,Lc=0.0,Mc=0,Nc=0.0,Oc=0;g=i;i=i+512|0;h=g;if((e|0)==1){j=53;k=-1074}else if((e|0)==2){j=53;k=-1074}else if((e|0)==0){j=24;k=-149}else{l=0.0;i=g;return+l}e=b+4|0;m=b+100|0;do{n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;o=d[n]|0}else{o=_m(b)|0}}while((Nb(o|0)|0)!=0);do{if((o|0)==43|(o|0)==45){n=1-(((o|0)==45)<<1)|0;p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;q=d[p]|0;r=n;break}else{q=_m(b)|0;r=n;break}}else{q=o;r=1}}while(0);o=q;q=0;while(1){if((o|32|0)!=(a[14024+q|0]|0)){s=o;t=q;break}do{if(q>>>0<7){n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;u=d[n]|0;break}else{u=_m(b)|0;break}}else{u=o}}while(0);n=q+1|0;if(n>>>0<8){o=u;q=n}else{s=u;t=n;break}}do{if((t|0)==3){v=23}else if((t|0)!=8){u=(f|0)==0;if(!(t>>>0<4|u)){if((t|0)==8){break}else{v=23;break}}a:do{if((t|0)==0){q=s;o=0;while(1){if((q|32|0)!=(a[14040+o|0]|0)){w=q;x=o;break a}do{if(o>>>0<2){n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;A=d[n]|0;break}else{A=_m(b)|0;break}}else{A=q}}while(0);n=o+1|0;if(n>>>0<3){q=A;o=n}else{w=A;x=n;break}}}else{w=s;x=t}}while(0);if((x|0)==3){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;B=d[o]|0}else{B=_m(b)|0}if((B|0)==40){C=1}else{if((c[m>>2]|0)==0){l=y;i=g;return+l}c[e>>2]=(c[e>>2]|0)+ -1;l=y;i=g;return+l}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0}else{D=_m(b)|0}if(!((D+ -48|0)>>>0<10|(D+ -65|0)>>>0<26)){if(!((D+ -97|0)>>>0<26|(D|0)==95)){break}}C=C+1|0}if((D|0)==41){l=y;i=g;return+l}o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)+ -1}if(u){c[(ac()|0)>>2]=22;Zm(b,0);l=0.0;i=g;return+l}if((C|0)==0|o){l=y;i=g;return+l}else{E=C}while(1){o=E+ -1|0;c[e>>2]=(c[e>>2]|0)+ -1;if((o|0)==0){l=y;break}else{E=o}}i=g;return+l}else if((x|0)==0){do{if((w|0)==48){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;F=d[o]|0}else{F=_m(b)|0}if((F|32|0)!=120){if((c[m>>2]|0)==0){G=48;break}c[e>>2]=(c[e>>2]|0)+ -1;G=48;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;H=d[o]|0;I=0}else{H=_m(b)|0;I=0}while(1){if((H|0)==46){v=70;break}else if((H|0)!=48){K=0;L=0;M=0;N=0;O=H;P=I;Q=0;R=0;S=1.0;T=0;V=0.0;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;H=d[o]|0;I=1;continue}else{H=_m(b)|0;I=1;continue}}b:do{if((v|0)==70){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;W=d[o]|0}else{W=_m(b)|0}if((W|0)==48){X=-1;Y=-1}else{K=0;L=0;M=0;N=0;O=W;P=I;Q=1;R=0;S=1.0;T=0;V=0.0;break}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;Z=d[o]|0}else{Z=_m(b)|0}if((Z|0)!=48){K=X;L=Y;M=0;N=0;O=Z;P=1;Q=1;R=0;S=1.0;T=0;V=0.0;break b}o=ln(X|0,Y|0,-1,-1)|0;X=o;Y=J}}}while(0);c:while(1){o=O+ -48|0;do{if(o>>>0<10){_=o;v=84}else{q=O|32;n=(O|0)==46;if(!((q+ -97|0)>>>0<6|n)){$=O;break c}if(n){if((Q|0)==0){aa=M;ba=N;ca=M;da=N;ea=P;ga=1;ha=R;ia=S;ja=T;ka=V;break}else{$=46;break c}}else{_=(O|0)>57?q+ -87|0:o;v=84;break}}}while(0);if((v|0)==84){v=0;do{if((N|0)<0|(N|0)==0&M>>>0<8){la=R;ma=S;na=_+(T<<4)|0;oa=V}else{if((N|0)<0|(N|0)==0&M>>>0<14){pa=S*.0625;la=R;ma=pa;na=T;oa=V+pa*+(_|0);break}if(!((_|0)!=0&(R|0)==0)){la=R;ma=S;na=T;oa=V;break}la=1;ma=S;na=T;oa=V+S*.5}}while(0);o=ln(M|0,N|0,1,0)|0;aa=K;ba=L;ca=o;da=J;ea=1;ga=Q;ha=la;ia=ma;ja=na;ka=oa}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;K=aa;L=ba;M=ca;N=da;O=d[o]|0;P=ea;Q=ga;R=ha;S=ia;T=ja;V=ka;continue}else{K=aa;L=ba;M=ca;N=da;O=_m(b)|0;P=ea;Q=ga;R=ha;S=ia;T=ja;V=ka;continue}}if((P|0)==0){o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)+ -1}do{if(u){Zm(b,0)}else{if(o){break}q=c[e>>2]|0;c[e>>2]=q+ -1;if((Q|0)==0){break}c[e>>2]=q+ -2}}while(0);l=+(r|0)*0.0;i=g;return+l}o=(Q|0)==0;q=o?M:K;n=o?N:L;if((N|0)<0|(N|0)==0&M>>>0<8){o=M;p=N;qa=T;while(1){ra=qa<<4;sa=ln(o|0,p|0,1,0)|0;ta=J;if((ta|0)<0|(ta|0)==0&sa>>>0<8){qa=ra;p=ta;o=sa}else{ua=ra;break}}}else{ua=T}do{if(($|32|0)==112){o=Ym(b,f)|0;p=J;if(!((o|0)==0&(p|0)==-2147483648)){va=o;wa=p;break}if(u){Zm(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){va=0;wa=0;break}c[e>>2]=(c[e>>2]|0)+ -1;va=0;wa=0;break}}else{if((c[m>>2]|0)==0){va=0;wa=0;break}c[e>>2]=(c[e>>2]|0)+ -1;va=0;wa=0}}while(0);p=pn(q|0,n|0,2)|0;o=ln(p|0,J|0,-32,-1)|0;p=ln(o|0,J|0,va|0,wa|0)|0;o=J;if((ua|0)==0){l=+(r|0)*0.0;i=g;return+l}if((o|0)>0|(o|0)==0&p>>>0>(0-k|0)>>>0){c[(ac()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}qa=k+ -106|0;ra=((qa|0)<0)<<31>>31;if((o|0)<(ra|0)|(o|0)==(ra|0)&p>>>0<qa>>>0){c[(ac()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((ua|0)>-1){qa=p;ra=o;sa=ua;pa=V;while(1){ta=sa<<1;if(!(pa>=.5)){xa=pa;ya=ta}else{xa=pa+-1.0;ya=ta|1}za=pa+xa;ta=ln(qa|0,ra|0,-1,-1)|0;Aa=J;if((ya|0)>-1){qa=ta;ra=Aa;sa=ya;pa=za}else{Ba=ta;Ca=Aa;Da=ya;Ea=za;break}}}else{Ba=p;Ca=o;Da=ua;Ea=V}sa=kn(32,0,k|0,((k|0)<0)<<31>>31|0)|0;ra=ln(Ba|0,Ca|0,sa|0,J|0)|0;sa=J;if(0>(sa|0)|0==(sa|0)&j>>>0>ra>>>0){Fa=(ra|0)<0?0:ra}else{Fa=j}do{if((Fa|0)<53){pa=+(r|0);za=+bc(+(+$m(1.0,84-Fa|0)),+pa);if(!((Fa|0)<32&Ea!=0.0)){Ga=pa;Ha=za;Ia=Da;Ja=Ea;break}ra=Da&1;Ga=pa;Ha=za;Ia=(ra^1)+Da|0;Ja=(ra|0)==0?0.0:Ea}else{Ga=+(r|0);Ha=0.0;Ia=Da;Ja=Ea}}while(0);za=Ga*Ja+(Ha+Ga*+(Ia>>>0))-Ha;if(!(za!=0.0)){c[(ac()|0)>>2]=34}l=+an(za,Ba);i=g;return+l}else{G=w}}while(0);o=k+j|0;p=0-o|0;ra=G;sa=0;while(1){if((ra|0)==46){v=139;break}else if((ra|0)!=48){Ka=ra;La=0;Ma=0;Na=sa;Oa=0;break}qa=c[e>>2]|0;if(qa>>>0<(c[m>>2]|0)>>>0){c[e>>2]=qa+1;ra=d[qa]|0;sa=1;continue}else{ra=_m(b)|0;sa=1;continue}}d:do{if((v|0)==139){ra=c[e>>2]|0;if(ra>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ra+1;Pa=d[ra]|0}else{Pa=_m(b)|0}if((Pa|0)==48){Qa=-1;Ra=-1}else{Ka=Pa;La=0;Ma=0;Na=sa;Oa=1;break}while(1){ra=c[e>>2]|0;if(ra>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ra+1;Sa=d[ra]|0}else{Sa=_m(b)|0}if((Sa|0)!=48){Ka=Sa;La=Qa;Ma=Ra;Na=1;Oa=1;break d}ra=ln(Qa|0,Ra|0,-1,-1)|0;Qa=ra;Ra=J}}}while(0);sa=h;c[sa>>2]=0;ra=Ka+ -48|0;qa=(Ka|0)==46;e:do{if(ra>>>0<10|qa){n=h+496|0;q=Ka;Aa=qa;ta=ra;Ta=0;Ua=0;Va=La;Wa=Ma;Xa=Na;Ya=Oa;Za=0;_a=0;$a=0;while(1){do{if(Aa){if((Ya|0)==0){ab=Ta;bb=Ua;cb=Ta;db=Ua;eb=Xa;fb=1;gb=Za;hb=_a;ib=$a}else{jb=q;kb=Ta;lb=Ua;mb=Va;nb=Wa;ob=Xa;pb=Za;qb=_a;rb=$a;break e}}else{sb=ln(Ta|0,Ua|0,1,0)|0;tb=J;vb=(q|0)!=48;if((_a|0)>=125){if(!vb){ab=Va;bb=Wa;cb=sb;db=tb;eb=Xa;fb=Ya;gb=Za;hb=_a;ib=$a;break}c[n>>2]=c[n>>2]|1;ab=Va;bb=Wa;cb=sb;db=tb;eb=Xa;fb=Ya;gb=Za;hb=_a;ib=$a;break}wb=h+(_a<<2)|0;if((Za|0)==0){xb=ta}else{xb=q+ -48+((c[wb>>2]|0)*10|0)|0}c[wb>>2]=xb;wb=Za+1|0;yb=(wb|0)==9;ab=Va;bb=Wa;cb=sb;db=tb;eb=1;fb=Ya;gb=yb?0:wb;hb=(yb&1)+_a|0;ib=vb?sb:$a}}while(0);sb=c[e>>2]|0;if(sb>>>0<(c[m>>2]|0)>>>0){c[e>>2]=sb+1;zb=d[sb]|0}else{zb=_m(b)|0}sb=zb+ -48|0;vb=(zb|0)==46;if(sb>>>0<10|vb){q=zb;Aa=vb;ta=sb;Ta=cb;Ua=db;Va=ab;Wa=bb;Xa=eb;Ya=fb;Za=gb;_a=hb;$a=ib}else{Ab=zb;Bb=cb;Cb=db;Db=ab;Eb=bb;Fb=eb;Gb=fb;Hb=gb;Ib=hb;Jb=ib;v=162;break}}}else{Ab=Ka;Bb=0;Cb=0;Db=La;Eb=Ma;Fb=Na;Gb=Oa;Hb=0;Ib=0;Jb=0;v=162}}while(0);if((v|0)==162){ra=(Gb|0)==0;jb=Ab;kb=Bb;lb=Cb;mb=ra?Bb:Db;nb=ra?Cb:Eb;ob=Fb;pb=Hb;qb=Ib;rb=Jb}ra=(ob|0)!=0;do{if(ra){if((jb|32|0)!=101){v=171;break}qa=Ym(b,f)|0;$a=J;do{if((qa|0)==0&($a|0)==-2147483648){if(u){Zm(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){Kb=0;Lb=0;break}c[e>>2]=(c[e>>2]|0)+ -1;Kb=0;Lb=0;break}}else{Kb=qa;Lb=$a}}while(0);$a=ln(Kb|0,Lb|0,mb|0,nb|0)|0;Mb=$a;Ob=J}else{v=171}}while(0);do{if((v|0)==171){if(!((jb|0)>-1)){Mb=mb;Ob=nb;break}if((c[m>>2]|0)==0){Mb=mb;Ob=nb;break}c[e>>2]=(c[e>>2]|0)+ -1;Mb=mb;Ob=nb}}while(0);if(!ra){c[(ac()|0)>>2]=22;Zm(b,0);l=0.0;i=g;return+l}u=c[sa>>2]|0;if((u|0)==0){l=+(r|0)*0.0;i=g;return+l}do{if((Mb|0)==(kb|0)&(Ob|0)==(lb|0)&((lb|0)<0|(lb|0)==0&kb>>>0<10)){if(!(j>>>0>30)){if((u>>>j|0)!=0){break}}l=+(r|0)*+(u>>>0);i=g;return+l}}while(0);u=(k|0)/-2|0;ra=((u|0)<0)<<31>>31;if((Ob|0)>(ra|0)|(Ob|0)==(ra|0)&Mb>>>0>u>>>0){c[(ac()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}u=k+ -106|0;ra=((u|0)<0)<<31>>31;if((Ob|0)<(ra|0)|(Ob|0)==(ra|0)&Mb>>>0<u>>>0){c[(ac()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((pb|0)==0){Pb=qb}else{if((pb|0)<9){u=h+(qb<<2)|0;ra=c[u>>2]|0;$a=pb;do{ra=ra*10|0;$a=$a+1|0;}while(($a|0)!=9);c[u>>2]=ra}Pb=qb+1|0}do{if((rb|0)<9){if(!((rb|0)<=(Mb|0)&(Mb|0)<18)){break}if((Mb|0)==9){l=+(r|0)*+((c[sa>>2]|0)>>>0);i=g;return+l}if((Mb|0)<9){l=+(r|0)*+((c[sa>>2]|0)>>>0)/+(c[14056+(8-Mb<<2)>>2]|0);i=g;return+l}$a=j+27+(fa(Mb,-3)|0)|0;qa=c[sa>>2]|0;if(($a|0)<=30){if((qa>>>$a|0)!=0){break}}l=+(r|0)*+(qa>>>0)*+(c[14056+(Mb+ -10<<2)>>2]|0);i=g;return+l}}while(0);sa=(Mb|0)%9|0;if((sa|0)==0){Qb=0;Rb=0;Sb=Mb;Tb=Pb}else{ra=(Mb|0)>-1?sa:sa+9|0;sa=c[14056+(8-ra<<2)>>2]|0;do{if((Pb|0)==0){Ub=0;Vb=Mb;Wb=0}else{u=1e9/(sa|0)|0;qa=0;$a=0;_a=0;Za=Mb;while(1){Ya=h+(_a<<2)|0;Xa=c[Ya>>2]|0;Wa=((Xa>>>0)/(sa>>>0)|0)+$a|0;c[Ya>>2]=Wa;Xb=fa((Xa>>>0)%(sa>>>0)|0,u)|0;Xa=_a+1|0;if((_a|0)==(qa|0)&(Wa|0)==0){Yb=Xa&127;Zb=Za+ -9|0}else{Yb=qa;Zb=Za}if((Xa|0)==(Pb|0)){break}else{qa=Yb;Za=Zb;_a=Xa;$a=Xb}}if((Xb|0)==0){Ub=Yb;Vb=Zb;Wb=Pb;break}c[h+(Pb<<2)>>2]=Xb;Ub=Yb;Vb=Zb;Wb=Pb+1|0}}while(0);Qb=Ub;Rb=0;Sb=9-ra+Vb|0;Tb=Wb}f:while(1){sa=h+(Qb<<2)|0;if((Sb|0)<18){$a=Rb;_a=Tb;while(1){Za=0;qa=_a+127|0;u=_a;while(1){Xa=qa&127;Wa=h+(Xa<<2)|0;Ya=pn(c[Wa>>2]|0,0,29)|0;Va=ln(Ya|0,J|0,Za|0,0)|0;Ya=J;if(Ya>>>0>0|(Ya|0)==0&Va>>>0>1e9){Ua=yn(Va|0,Ya|0,1e9,0)|0;Ta=zn(Va|0,Ya|0,1e9,0)|0;_b=Ta;$b=Ua}else{_b=Va;$b=0}c[Wa>>2]=_b;Wa=(Xa|0)==(Qb|0);if((Xa|0)!=(u+127&127|0)|Wa){cc=u}else{cc=(_b|0)==0?Xa:u}if(Wa){break}else{Za=$b;qa=Xa+ -1|0;u=cc}}u=$a+ -29|0;if(($b|0)==0){$a=u;_a=cc}else{dc=u;ec=$b;fc=cc;break}}}else{if((Sb|0)==18){gc=Rb;hc=Tb}else{ic=Qb;jc=Rb;kc=Sb;lc=Tb;break}while(1){if(!((c[sa>>2]|0)>>>0<9007199)){ic=Qb;jc=gc;kc=18;lc=hc;break f}_a=0;$a=hc+127|0;u=hc;while(1){qa=$a&127;Za=h+(qa<<2)|0;Xa=pn(c[Za>>2]|0,0,29)|0;Wa=ln(Xa|0,J|0,_a|0,0)|0;Xa=J;if(Xa>>>0>0|(Xa|0)==0&Wa>>>0>1e9){Va=yn(Wa|0,Xa|0,1e9,0)|0;Ua=zn(Wa|0,Xa|0,1e9,0)|0;mc=Ua;nc=Va}else{mc=Wa;nc=0}c[Za>>2]=mc;Za=(qa|0)==(Qb|0);if((qa|0)!=(u+127&127|0)|Za){oc=u}else{oc=(mc|0)==0?qa:u}if(Za){break}else{_a=nc;$a=qa+ -1|0;u=oc}}u=gc+ -29|0;if((nc|0)==0){gc=u;hc=oc}else{dc=u;ec=nc;fc=oc;break}}}sa=Qb+127&127;if((sa|0)==(fc|0)){u=fc+127&127;$a=h+((fc+126&127)<<2)|0;c[$a>>2]=c[$a>>2]|c[h+(u<<2)>>2];pc=u}else{pc=fc}c[h+(sa<<2)>>2]=ec;Qb=sa;Rb=dc;Sb=Sb+9|0;Tb=pc}g:while(1){qc=lc+1&127;ra=h+((lc+127&127)<<2)|0;sa=ic;u=jc;$a=kc;while(1){_a=($a|0)==18;qa=($a|0)>27?9:1;rc=sa;sc=u;while(1){Za=0;while(1){Wa=Za+rc&127;if((Wa|0)==(lc|0)){tc=2;break}Va=c[h+(Wa<<2)>>2]|0;Wa=c[14048+(Za<<2)>>2]|0;if(Va>>>0<Wa>>>0){tc=2;break}Ua=Za+1|0;if(Va>>>0>Wa>>>0){tc=Za;break}if((Ua|0)<2){Za=Ua}else{tc=Ua;break}}if((tc|0)==2&_a){break g}uc=qa+sc|0;if((rc|0)==(lc|0)){rc=lc;sc=uc}else{break}}_a=(1<<qa)+ -1|0;Za=1e9>>>qa;vc=rc;wc=0;Ua=rc;xc=$a;do{Wa=h+(Ua<<2)|0;Va=c[Wa>>2]|0;Xa=(Va>>>qa)+wc|0;c[Wa>>2]=Xa;wc=fa(Va&_a,Za)|0;Va=(Ua|0)==(vc|0)&(Xa|0)==0;Ua=Ua+1&127;xc=Va?xc+ -9|0:xc;vc=Va?Ua:vc;}while((Ua|0)!=(lc|0));if((wc|0)==0){sa=vc;u=uc;$a=xc;continue}if((qc|0)!=(vc|0)){break}c[ra>>2]=c[ra>>2]|1;sa=vc;u=uc;$a=xc}c[h+(lc<<2)>>2]=wc;ic=vc;jc=uc;kc=xc;lc=qc}$a=rc&127;if(($a|0)==(lc|0)){c[h+(qc+ -1<<2)>>2]=0;yc=qc}else{yc=lc}za=+((c[h+($a<<2)>>2]|0)>>>0);$a=rc+1&127;if(($a|0)==(yc|0)){u=yc+1&127;c[h+(u+ -1<<2)>>2]=0;zc=u}else{zc=yc}pa=+(r|0);Ac=pa*(za*1.0e9+ +((c[h+($a<<2)>>2]|0)>>>0));$a=sc+53|0;u=$a-k|0;if((u|0)<(j|0)){Bc=(u|0)<0?0:u;Cc=1}else{Bc=j;Cc=0}if((Bc|0)<53){za=+bc(+(+$m(1.0,105-Bc|0)),+Ac);Dc=+ub(+Ac,+(+$m(1.0,53-Bc|0)));Ec=za;Fc=Dc;Gc=za+(Ac-Dc)}else{Ec=0.0;Fc=0.0;Gc=Ac}sa=rc+2&127;do{if((sa|0)==(zc|0)){Hc=Fc}else{ra=c[h+(sa<<2)>>2]|0;do{if(ra>>>0<5e8){if((ra|0)==0){if((rc+3&127|0)==(zc|0)){Ic=Fc;break}}Ic=pa*.25+Fc}else{if(ra>>>0>5e8){Ic=pa*.75+Fc;break}if((rc+3&127|0)==(zc|0)){Ic=pa*.5+Fc;break}else{Ic=pa*.75+Fc;break}}}while(0);if((53-Bc|0)<=1){Hc=Ic;break}if(+ub(+Ic,1.0)!=0.0){Hc=Ic;break}Hc=Ic+1.0}}while(0);pa=Gc+Hc-Ec;do{if(($a&2147483647|0)>(-2-o|0)){if(!(+U(+pa)>=9007199254740992.0)){Jc=Cc;Kc=sc;Lc=pa}else{Jc=(Cc|0)!=0&(Bc|0)==(u|0)?0:Cc;Kc=sc+1|0;Lc=pa*.5}if((Kc+50|0)<=(p|0)){if(!((Jc|0)!=0&Hc!=0.0)){Mc=Kc;Nc=Lc;break}}c[(ac()|0)>>2]=34;Mc=Kc;Nc=Lc}else{Mc=sc;Nc=pa}}while(0);l=+an(Nc,Mc);i=g;return+l}else{if((c[m>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)+ -1}c[(ac()|0)>>2]=22;Zm(b,0);l=0.0;i=g;return+l}}}while(0);do{if((v|0)==23){b=(c[m>>2]|0)==0;if(!b){c[e>>2]=(c[e>>2]|0)+ -1}if(t>>>0<4|(f|0)==0|b){break}else{Oc=t}do{c[e>>2]=(c[e>>2]|0)+ -1;Oc=Oc+ -1|0;}while(Oc>>>0>3)}}while(0);l=+(r|0)*z;i=g;return+l}function Ym(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=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;e=i;f=a+4|0;g=c[f>>2]|0;h=a+100|0;if(g>>>0<(c[h>>2]|0)>>>0){c[f>>2]=g+1;j=d[g]|0}else{j=_m(a)|0}do{if((j|0)==43|(j|0)==45){g=(j|0)==45|0;k=c[f>>2]|0;if(k>>>0<(c[h>>2]|0)>>>0){c[f>>2]=k+1;l=d[k]|0}else{l=_m(a)|0}if((l+ -48|0)>>>0<10|(b|0)==0){m=l;n=g;break}if((c[h>>2]|0)==0){m=l;n=g;break}c[f>>2]=(c[f>>2]|0)+ -1;m=l;n=g}else{m=j;n=0}}while(0);if((m+ -48|0)>>>0>9){if((c[h>>2]|0)==0){o=0;p=-2147483648;J=p;i=e;return o|0}c[f>>2]=(c[f>>2]|0)+ -1;o=0;p=-2147483648;J=p;i=e;return o|0}else{q=m;r=0}while(1){s=q+ -48+r|0;m=c[f>>2]|0;if(m>>>0<(c[h>>2]|0)>>>0){c[f>>2]=m+1;t=d[m]|0}else{t=_m(a)|0}if(!((t+ -48|0)>>>0<10&(s|0)<214748364)){break}q=t;r=s*10|0}r=((s|0)<0)<<31>>31;if((t+ -48|0)>>>0<10){q=s;m=r;j=t;while(1){l=xn(q|0,m|0,10,0)|0;b=J;g=ln(j|0,((j|0)<0)<<31>>31|0,-48,-1)|0;k=ln(g|0,J|0,l|0,b|0)|0;b=J;l=c[f>>2]|0;if(l>>>0<(c[h>>2]|0)>>>0){c[f>>2]=l+1;u=d[l]|0}else{u=_m(a)|0}if((u+ -48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&k>>>0<2061584302)){j=u;m=b;q=k}else{v=k;w=b;x=u;break}}}else{v=s;w=r;x=t}if((x+ -48|0)>>>0<10){do{x=c[f>>2]|0;if(x>>>0<(c[h>>2]|0)>>>0){c[f>>2]=x+1;y=d[x]|0}else{y=_m(a)|0}}while((y+ -48|0)>>>0<10)}if((c[h>>2]|0)!=0){c[f>>2]=(c[f>>2]|0)+ -1}f=(n|0)!=0;n=kn(0,0,v|0,w|0)|0;o=f?n:v;p=f?J:w;J=p;i=e;return o|0}function Zm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a+104>>2]=b;e=c[a+8>>2]|0;f=c[a+4>>2]|0;g=e-f|0;c[a+108>>2]=g;if((b|0)!=0&(g|0)>(b|0)){c[a+100>>2]=f+b;i=d;return}else{c[a+100>>2]=e;i=d;return}}function _m(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=b+104|0;g=c[f>>2]|0;if((g|0)==0){h=3}else{if((c[b+108>>2]|0)<(g|0)){h=3}}do{if((h|0)==3){g=cn(b)|0;if((g|0)<0){break}j=c[f>>2]|0;k=c[b+8>>2]|0;do{if((j|0)==0){h=8}else{l=c[b+4>>2]|0;m=j-(c[b+108>>2]|0)+ -1|0;if((k-l|0)<=(m|0)){h=8;break}c[b+100>>2]=l+m}}while(0);if((h|0)==8){c[b+100>>2]=k}j=c[b+4>>2]|0;if((k|0)!=0){m=b+108|0;c[m>>2]=k+1-j+(c[m>>2]|0)}m=j+ -1|0;if((d[m]|0|0)==(g|0)){n=g;i=e;return n|0}a[m]=g;n=g;i=e;return n|0}}while(0);c[b+100>>2]=0;n=-1;i=e;return n|0}function $m(a,b){a=+a;b=b|0;var d=0,e=0.0,f=0,g=0,j=0.0;d=i;do{if((b|0)>1023){e=a*8.98846567431158e+307;f=b+ -1023|0;if((f|0)<=1023){g=f;j=e;break}f=b+ -2046|0;g=(f|0)>1023?1023:f;j=e*8.98846567431158e+307}else{if(!((b|0)<-1022)){g=b;j=a;break}e=a*2.2250738585072014e-308;f=b+1022|0;if(!((f|0)<-1022)){g=f;j=e;break}f=b+2044|0;g=(f|0)<-1022?-1022:f;j=e*2.2250738585072014e-308}}while(0);b=pn(g+1023|0,0,52)|0;g=J;c[k>>2]=b;c[k+4>>2]=g;a=j*+h[k>>3];i=d;return+a}function an(a,b){a=+a;b=b|0;var c=0,d=0.0;c=i;d=+$m(a,b);i=c;return+d}function bn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b+74|0;f=a[e]|0;a[e]=f+255|f;f=b+20|0;e=b+44|0;if((c[f>>2]|0)>>>0>(c[e>>2]|0)>>>0){jc[c[b+36>>2]&31](b,0,0)|0}c[b+16>>2]=0;c[b+28>>2]=0;c[f>>2]=0;f=b;g=c[f>>2]|0;if((g&20|0)==0){h=c[e>>2]|0;c[b+8>>2]=h;c[b+4>>2]=h;j=0;i=d;return j|0}if((g&4|0)==0){j=-1;i=d;return j|0}c[f>>2]=g|32;j=-1;i=d;return j|0}function cn(a){a=a|0;var b=0,e=0,f=0,g=0;b=i;i=i+8|0;e=b;if((c[a+8>>2]|0)==0){if((bn(a)|0)==0){f=3}else{g=-1}}else{f=3}do{if((f|0)==3){if((jc[c[a+32>>2]&31](a,e,1)|0)!=1){g=-1;break}g=d[e]|0}}while(0);i=b;return g|0}function dn(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0.0,j=0,k=0;d=i;i=i+112|0;e=d;f=e+0|0;g=f+112|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=e+4|0;c[f>>2]=a;g=e+8|0;c[g>>2]=-1;c[e+44>>2]=a;c[e+76>>2]=-1;Zm(e,0);h=+Xm(e,2,1);j=(c[f>>2]|0)-(c[g>>2]|0)+(c[e+108>>2]|0)|0;if((b|0)==0){i=d;return+h}if((j|0)==0){k=a}else{k=a+j|0}c[b>>2]=k;i=d;return+h}function en(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;a:do{if((d|0)==0){f=0}else{g=d;h=b;j=c;while(1){k=a[h]|0;l=a[j]|0;if(!(k<<24>>24==l<<24>>24)){break}m=g+ -1|0;if((m|0)==0){f=0;break a}else{g=m;h=h+1|0;j=j+1|0}}f=(k&255)-(l&255)|0}}while(0);i=e;return f|0}function fn(){c[510]=p;c[536]=p;c[3274]=p;c[3504]=p}function gn(a){a=a|0;var b=0;b=(fa(c[a>>2]|0,31010991)|0)+1735287159&2147483647;c[a>>2]=b;return b|0}function hn(){return gn(o)|0}function jn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function kn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return(J=e,a-c>>>0|0)|0}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return(J=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function mn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return Na(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function nn(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]=a[c]|0}b=e}else{mn(b,c,d)|0}return b|0}function on(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function pn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){J=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}J=a<<c-32;return 0}function qn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){J=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}J=0;return b>>>c-32|0}function rn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){J=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}J=(b|0)<0?-1:0;return b>>c-32|0}function sn(b){b=b|0;var c=0;c=a[n+(b>>>24)|0]|0;if((c|0)<8)return c|0;c=a[n+(b>>16&255)|0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>8&255)|0]|0;if((c|0)<8)return c+16|0;return(a[n+(b&255)|0]|0)+24|0}function tn(b){b=b|0;var c=0;c=a[m+(b&255)|0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)|0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)|0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)|0]|0)+24|0}function un(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=fa(d,c)|0;f=a>>>16;a=(e>>>16)+(fa(d,f)|0)|0;d=b>>>16;b=fa(d,c)|0;return(J=(a>>>16)+(fa(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function vn(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>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=kn(e^a,f^b,e,f)|0;b=J;a=g^e;e=h^f;f=kn((An(i,b,kn(g^c,h^d,g,h)|0,J,0)|0)^a,J^e,a,e)|0;return(J=J,f)|0}function wn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+8|0;g=f|0;h=b>>31|((b|0)<0?-1:0)<<1;j=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;l=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;m=kn(h^a,j^b,h,j)|0;b=J;An(m,b,kn(k^d,l^e,k,l)|0,J,g)|0;l=kn(c[g>>2]^h,c[g+4>>2]^j,h,j)|0;j=J;i=f;return(J=j,l)|0}function xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=un(e,a)|0;f=J;return(J=(fa(b,a)|0)+(fa(d,e)|0)+f|f&0,c|0|0)|0}function yn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=An(a,b,c,d,0)|0;return(J=J,e)|0}function zn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+8|0;g=f|0;An(a,b,d,e,g)|0;i=f;return(J=c[g+4>>2]|0,c[g>>2]|0)|0}function An(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,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,K=0,L=0,M=0;g=a;h=b;i=h;j=d;k=e;l=k;if((i|0)==0){m=(f|0)!=0;if((l|0)==0){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return(J=n,o)|0}else{if(!m){n=0;o=0;return(J=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return(J=n,o)|0}}m=(l|0)==0;do{if((j|0)==0){if(m){if((f|0)!=0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return(J=n,o)|0}if((g|0)==0){if((f|0)!=0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return(J=n,o)|0}p=l-1|0;if((p&l|0)==0){if((f|0)!=0){c[f>>2]=a|0;c[f+4>>2]=p&i|b&0}n=0;o=i>>>((tn(l|0)|0)>>>0);return(J=n,o)|0}p=(sn(l|0)|0)-(sn(i|0)|0)|0;if(p>>>0<=30){q=p+1|0;r=31-p|0;s=q;t=i<<r|g>>>(q>>>0);u=i>>>(q>>>0);v=0;w=g<<r;break}if((f|0)==0){n=0;o=0;return(J=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(J=n,o)|0}else{if(!m){r=(sn(l|0)|0)-(sn(i|0)|0)|0;if(r>>>0<=31){q=r+1|0;p=31-r|0;x=r-31>>31;s=q;t=g>>>(q>>>0)&x|i<<p;u=i>>>(q>>>0)&x;v=0;w=g<<p;break}if((f|0)==0){n=0;o=0;return(J=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(J=n,o)|0}p=j-1|0;if((p&j|0)!=0){x=(sn(j|0)|0)+33-(sn(i|0)|0)|0;q=64-x|0;r=32-x|0;y=r>>31;z=x-32|0;A=z>>31;s=x;t=r-1>>31&i>>>(z>>>0)|(i<<r|g>>>(x>>>0))&A;u=A&i>>>(x>>>0);v=g<<q&y;w=(i<<q|g>>>(z>>>0))&y|g<<r&x-33>>31;break}if((f|0)!=0){c[f>>2]=p&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return(J=n,o)|0}else{p=tn(j|0)|0;n=i>>>(p>>>0)|0;o=i<<32-p|g>>>(p>>>0)|0;return(J=n,o)|0}}}while(0);if((s|0)==0){B=w;C=v;D=u;E=t;F=0;G=0}else{g=d|0|0;d=k|e&0;e=ln(g,d,-1,-1)|0;k=J;i=w;w=v;v=u;u=t;t=s;s=0;while(1){H=w>>>31|i<<1;I=s|w<<1;j=u<<1|i>>>31|0;a=u>>>31|v<<1|0;kn(e,k,j,a)|0;b=J;h=b>>31|((b|0)<0?-1:0)<<1;K=h&1;L=kn(j,a,h&g,(((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1)&d)|0;M=J;b=t-1|0;if((b|0)==0){break}else{i=H;w=I;v=M;u=L;t=b;s=K}}B=H;C=I;D=M;E=L;F=0;G=K}K=C;C=0;if((f|0)!=0){c[f>>2]=E;c[f+4>>2]=D}n=(K|0)>>>31|(B|C)<<1|(C<<1|K>>>31)&0|F;o=(K<<1|0>>>31)&-2|G;return(J=n,o)|0}function Bn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return jc[a&31](b|0,c|0,d|0)|0}function Cn(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;kc[a&63](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function Dn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;lc[a&3](b|0,c|0,d|0,e|0,f|0)}function En(a,b){a=a|0;b=b|0;mc[a&255](b|0)}function Fn(a,b,c){a=a|0;b=b|0;c=c|0;nc[a&63](b|0,c|0)}function Gn(a,b,c,d,e,f,g,h,i,j){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;oc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Hn(a,b){a=a|0;b=b|0;return pc[a&127](b|0)|0}function In(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;qc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,+h)}function Jn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;rc[a&3](b|0,c|0,d|0)}function Kn(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;sc[a&7](b|0,c|0,d|0,e|0,f|0,+g)}function Ln(a){a=a|0;tc[a&0]()}function Mn(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 uc[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Nn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return vc[a&7](b|0,c|0,d|0,e|0)|0}function On(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;wc[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function Pn(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;xc[a&31](b|0,c|0,d|0,e|0,f|0,g|0)}function Qn(a,b,c){a=a|0;b=b|0;c=c|0;return yc[a&31](b|0,c|0)|0}function Rn(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 zc[a&15](b|0,c|0,d|0,e|0,f|0)|0}function Sn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ac[a&15](b|0,c|0,d|0,e|0)}function Tn(a,b,c){a=a|0;b=b|0;c=c|0;ga(0);return 0}function Un(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;ga(1)}function Vn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ga(2)}function Wn(a){a=a|0;ga(3)}function Xn(a,b){a=a|0;b=b|0;ga(4)}function Yn(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;ga(5)}function Zn(a){a=a|0;ga(6);return 0}function _n(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;ga(7)}function $n(a,b,c){a=a|0;b=b|0;c=c|0;ga(8)}function ao(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;ga(9)}function bo(){ga(10)}function co(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;ga(11);return 0}function eo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ga(12);return 0}function fo(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;ga(13)}function go(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ga(14)}function ho(a,b){a=a|0;b=b|0;ga(15);return 0}function io(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ga(16);return 0}function jo(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ga(17)}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nvar jc=[Tn,Ve,_e,cf,hf,nf,xd,rf,Ld,je,ke,ag,fg,Ij,Nj,sk,uk,xk,dk,ik,kk,nk,zm,Tn,Tn,Tn,Tn,Tn,Tn,Tn,Tn,Tn];var kc=[Un,ig,kg,mg,og,qg,sg,ug,wg,yg,Ag,Cg,Hg,Jg,Lg,Ng,Pg,Rg,Tg,Vg,Xg,Zg,$g,nh,ph,Bh,Dh,Mh,Nh,Oh,Ph,Qh,Zh,_h,$h,ai,bi,zj,Fj,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un,Un];var lc=[Vn,Gm,Fm,Em];var mc=[Wn,Xc,cd,dd,ed,Ff,Ef,Hf,Gf,fd,gd,td,ud,Ad,Bd,Hd,Id,Od,Pd,$d,_d,ee,de,ge,pe,oe,Te,Se,ff,ef,uf,tf,wf,vf,Af,zf,Cf,Bf,Mf,Lf,Of,Nf,Uf,Tf,Pe,Vf,Sf,Wf,Yf,Xf,ak,cg,bg,hg,gg,Gg,Fg,ih,hh,wh,vh,Kh,Jh,Xh,Wh,hi,gi,ki,ji,oi,ni,zi,yi,Ki,Ji,Vi,Ui,ej,dj,oj,nj,vj,uj,Bj,Aj,Hj,Gj,Mj,Lj,Vj,Uj,qk,pk,Qj,Hk,ml,ll,ol,nl,Zf,$j,ck,zk,Pk,_k,jl,kl,rm,qm,tm,wm,um,vm,xm,ym,Um,Tm,sd,bk,Wl,gj,Lm,bm,am,$l,_l,Zl,Yl,ve,He,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn,Wn];var nc=[Xn,Ue,vd,Cd,Jd,Qd,gf,ri,si,ti,ui,wi,xi,Ci,Di,Ei,Fi,Hi,Ii,Ni,Oi,Pi,Qi,Si,Ti,Yi,Zi,_i,$i,bj,cj,Kj,Pj,tl,vl,xl,ul,wl,yl,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn,Xn];var oc=[Yn,Rh,ci,Yn];var pc=[Zn,Ye,Ze,jd,af,wd,mf,of,pf,lf,Dd,Ed,Kd,$e,Rd,Sd,ae,fe,Qf,Lh,zl,Bl,Dl,Jl,Ll,Fl,Hl,Yh,Al,Cl,El,Kl,Ml,Gl,Il,pi,qi,vi,Ai,Bi,Gi,Li,Mi,Ri,Wi,Xi,aj,Lk,Mk,Ok,pl,rl,ql,sl,Dk,Ek,Gk,Vk,Wk,Zk,el,fl,il,sm,Vm,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn,Zn];var qc=[_n,wj,Cj,_n];var rc=[$n,ie,Rf,$n];var sc=[ao,qh,th,Eh,Gh,ao,ao,ao];var tc=[bo];var uc=[co,Ik,Jk,Ak,Bk,Qk,Sk,$k,bl,co,co,co,co,co,co,co];var vc=[eo,wk,ek,fk,gk,mk,eo,eo];var wc=[fo,ii,li,fj,jj,pj,rj,fo];var xc=[go,hd,jf,We,jh,kh,oh,uh,xh,yh,Ch,Hh,Jj,Oj,Jm,Im,Hm,go,go,go,go,go,go,go,go,go,go,go,go,go,go,go];var yc=[ho,kd,ld,qf,yd,Fd,sf,bf,Md,Td,df,rk,tk,vk,hk,jk,lk,ho,ho,ho,ho,ho,ho,ho,ho,ho,ho,ho,ho,ho,ho,ho];var zc=[io,_f,dg,yk,Kk,Nk,ok,Ck,Fk,Uk,Xk,dl,gl,io,io,io];var Ac=[jo,id,kf,Xe,$f,eg,Am,Bm,Cm,jo,jo,jo,jo,jo,jo,jo];return{_i64Subtract:kn,_free:Lm,_main:_c,_rand_r:gn,_realloc:Mm,_i64Add:ln,_memmove:nn,_memset:jn,_malloc:Km,_memcpy:mn,_strlen:on,_rand:hn,_bitshift64Shl:pn,__GLOBAL__I_a:Vd,runPostSets:fn,stackAlloc:Bc,stackSave:Cc,stackRestore:Dc,setThrew:Ec,setTempRet0:Hc,setTempRet1:Ic,setTempRet2:Jc,setTempRet3:Kc,setTempRet4:Lc,setTempRet5:Mc,setTempRet6:Nc,setTempRet7:Oc,setTempRet8:Pc,setTempRet9:Qc,dynCall_iiii:Bn,dynCall_viiiiiii:Cn,dynCall_viiiii:Dn,dynCall_vi:En,dynCall_vii:Fn,dynCall_viiiiiiiii:Gn,dynCall_ii:Hn,dynCall_viiiiiid:In,dynCall_viii:Jn,dynCall_viiiiid:Kn,dynCall_v:Ln,dynCall_iiiiiiiii:Mn,dynCall_iiiii:Nn,dynCall_viiiiiiii:On,dynCall_viiiiii:Pn,dynCall_iii:Qn,dynCall_iiiiii:Rn,dynCall_viiii:Sn}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"invoke_iiii\": invoke_iiii, \"invoke_viiiiiii\": invoke_viiiiiii, \"invoke_viiiii\": invoke_viiiii, \"invoke_vi\": invoke_vi, \"invoke_vii\": invoke_vii, \"invoke_viiiiiiiii\": invoke_viiiiiiiii, \"invoke_ii\": invoke_ii, \"invoke_viiiiiid\": invoke_viiiiiid, \"invoke_viii\": invoke_viii, \"invoke_viiiiid\": invoke_viiiiid, \"invoke_v\": invoke_v, \"invoke_iiiiiiiii\": invoke_iiiiiiiii, \"invoke_iiiii\": invoke_iiiii, \"invoke_viiiiiiii\": invoke_viiiiiiii, \"invoke_viiiiii\": invoke_viiiiii, \"invoke_iii\": invoke_iii, \"invoke_iiiiii\": invoke_iiiiii, \"invoke_viiii\": invoke_viiii, \"_fabs\": _fabs, \"_vsscanf\": _vsscanf, \"__ZSt9terminatev\": __ZSt9terminatev, \"___cxa_guard_acquire\": ___cxa_guard_acquire, \"__reallyNegative\": __reallyNegative, \"__ZSt18uncaught_exceptionv\": __ZSt18uncaught_exceptionv, \"___ctype_toupper_loc\": ___ctype_toupper_loc, \"__addDays\": __addDays, \"_sbrk\": _sbrk, \"___cxa_begin_catch\": ___cxa_begin_catch, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"_sysconf\": _sysconf, \"_fileno\": _fileno, \"_fread\": _fread, \"_write\": _write, \"__isLeapYear\": __isLeapYear, \"__ZNSt9exceptionD2Ev\": __ZNSt9exceptionD2Ev, \"___cxa_does_inherit\": ___cxa_does_inherit, \"__exit\": __exit, \"___cxa_rethrow\": ___cxa_rethrow, \"_catclose\": _catclose, \"_llvm_lifetime_end\": _llvm_lifetime_end, \"_send\": _send, \"___cxa_is_number_type\": ___cxa_is_number_type, \"___cxa_free_exception\": ___cxa_free_exception, \"___cxa_find_matching_catch\": ___cxa_find_matching_catch, \"_isxdigit_l\": _isxdigit_l, \"___cxa_guard_release\": ___cxa_guard_release, \"_strtol\": _strtol, \"___setErrNo\": ___setErrNo, \"_newlocale\": _newlocale, \"_isdigit_l\": _isdigit_l, \"___resumeException\": ___resumeException, \"_freelocale\": _freelocale, \"_sprintf\": _sprintf, \"_vasprintf\": _vasprintf, \"_vsnprintf\": _vsnprintf, \"_strtoull_l\": _strtoull_l, \"_read\": _read, \"_fwrite\": _fwrite, \"_time\": _time, \"_pthread_mutex_lock\": _pthread_mutex_lock, \"_catopen\": _catopen, \"_exit\": _exit, \"___ctype_b_loc\": ___ctype_b_loc, \"_fmod\": _fmod, \"___cxa_allocate_exception\": ___cxa_allocate_exception, \"_atoi\": _atoi, \"_strtoll\": _strtoll, \"_pwrite\": _pwrite, \"_uselocale\": _uselocale, \"_snprintf\": _snprintf, \"__scanString\": __scanString, \"___cxa_end_catch\": ___cxa_end_catch, \"_strtoull\": _strtoull, \"_strftime\": _strftime, \"_isxdigit\": _isxdigit, \"__parseInt\": __parseInt, \"_pthread_cond_broadcast\": _pthread_cond_broadcast, \"_recv\": _recv, \"_fgetc\": _fgetc, \"__parseInt64\": __parseInt64, \"__getFloat\": __getFloat, \"_abort\": _abort, \"_isspace\": _isspace, \"_pthread_cond_wait\": _pthread_cond_wait, \"_llvm_lifetime_start\": _llvm_lifetime_start, \"_ungetc\": _ungetc, \"_fflush\": _fflush, \"_strftime_l\": _strftime_l, \"_sscanf\": _sscanf, \"_catgets\": _catgets, \"_asprintf\": _asprintf, \"_strtoll_l\": _strtoll_l, \"__arraySum\": __arraySum, \"___ctype_tolower_loc\": ___ctype_tolower_loc, \"_pthread_mutex_unlock\": _pthread_mutex_unlock, \"_pread\": _pread, \"_mkport\": _mkport, \"___errno_location\": ___errno_location, \"_copysign\": _copysign, \"___cxa_throw\": ___cxa_throw, \"_isdigit\": _isdigit, \"_strerror\": _strerror, \"__formatString\": __formatString, \"_atexit\": _atexit, \"_strerror_r\": _strerror_r, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"cttz_i8\": cttz_i8, \"ctlz_i8\": ctlz_i8, \"___rand_seed\": ___rand_seed, \"NaN\": NaN, \"Infinity\": Infinity, \"__ZTISt9exception\": __ZTISt9exception, \"___dso_handle\": ___dso_handle, \"_stderr\": _stderr, \"_stdin\": _stdin, \"_stdout\": _stdout }, buffer);\nvar _i64Subtract = Module[\"_i64Subtract\"] = asm[\"_i64Subtract\"];\nvar _free = Module[\"_free\"] = asm[\"_free\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _rand_r = Module[\"_rand_r\"] = asm[\"_rand_r\"];\nvar _realloc = Module[\"_realloc\"] = asm[\"_realloc\"];\nvar _i64Add = Module[\"_i64Add\"] = asm[\"_i64Add\"];\nvar _memmove = Module[\"_memmove\"] = asm[\"_memmove\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar _malloc = Module[\"_malloc\"] = asm[\"_malloc\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _rand = Module[\"_rand\"] = asm[\"_rand\"];\nvar _bitshift64Shl = Module[\"_bitshift64Shl\"] = asm[\"_bitshift64Shl\"];\nvar __GLOBAL__I_a = Module[\"__GLOBAL__I_a\"] = asm[\"__GLOBAL__I_a\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\nvar dynCall_iiii = Module[\"dynCall_iiii\"] = asm[\"dynCall_iiii\"];\nvar dynCall_viiiiiii = Module[\"dynCall_viiiiiii\"] = asm[\"dynCall_viiiiiii\"];\nvar dynCall_viiiii = Module[\"dynCall_viiiii\"] = asm[\"dynCall_viiiii\"];\nvar dynCall_vi = Module[\"dynCall_vi\"] = asm[\"dynCall_vi\"];\nvar dynCall_vii = Module[\"dynCall_vii\"] = asm[\"dynCall_vii\"];\nvar dynCall_viiiiiiiii = Module[\"dynCall_viiiiiiiii\"] = asm[\"dynCall_viiiiiiiii\"];\nvar dynCall_ii = Module[\"dynCall_ii\"] = asm[\"dynCall_ii\"];\nvar dynCall_viiiiiid = Module[\"dynCall_viiiiiid\"] = asm[\"dynCall_viiiiiid\"];\nvar dynCall_viii = Module[\"dynCall_viii\"] = asm[\"dynCall_viii\"];\nvar dynCall_viiiiid = Module[\"dynCall_viiiiid\"] = asm[\"dynCall_viiiiid\"];\nvar dynCall_v = Module[\"dynCall_v\"] = asm[\"dynCall_v\"];\nvar dynCall_iiiiiiiii = Module[\"dynCall_iiiiiiiii\"] = asm[\"dynCall_iiiiiiiii\"];\nvar dynCall_iiiii = Module[\"dynCall_iiiii\"] = asm[\"dynCall_iiiii\"];\nvar dynCall_viiiiiiii = Module[\"dynCall_viiiiiiii\"] = asm[\"dynCall_viiiiiiii\"];\nvar dynCall_viiiiii = Module[\"dynCall_viiiiii\"] = asm[\"dynCall_viiiiii\"];\nvar dynCall_iii = Module[\"dynCall_iii\"] = asm[\"dynCall_iii\"];\nvar dynCall_iiiiii = Module[\"dynCall_iiiiii\"] = asm[\"dynCall_iiiiii\"];\nvar dynCall_viiii = Module[\"dynCall_viiii\"] = asm[\"dynCall_viiii\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// TODO: strip out parts of this we do not need\n\n//======= begin closure i64 code =======\n\n// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\n * implementation is derived from LongLib in GWT.\n *\n */\n\nvar i64Math = (function() { // Emscripten wrapper\n  var goog = { math: {} };\n\n\n  /**\n   * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\n   * values as *signed* integers.  See the from* functions below for more\n   * convenient ways of constructing Longs.\n   *\n   * The internal representation of a long is the two given signed, 32-bit values.\n   * We use 32-bit pieces because these are the size of integers on which\n   * Javascript performs bit-operations.  For operations like addition and\n   * multiplication, we split each number into 16-bit pieces, which can easily be\n   * multiplied within Javascript's floating-point representation without overflow\n   * or change in sign.\n   *\n   * In the algorithms below, we frequently reduce the negative case to the\n   * positive case by negating the input(s) and then post-processing the result.\n   * Note that we must ALWAYS check specially whether those values are MIN_VALUE\n   * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n   * a positive number, it overflows back into a negative).  Not handling this\n   * case would often result in infinite recursion.\n   *\n   * @param {number} low  The low (signed) 32 bits of the long.\n   * @param {number} high  The high (signed) 32 bits of the long.\n   * @constructor\n   */\n  goog.math.Long = function(low, high) {\n    /**\n     * @type {number}\n     * @private\n     */\n    this.low_ = low | 0;  // force into 32 signed bits.\n\n    /**\n     * @type {number}\n     * @private\n     */\n    this.high_ = high | 0;  // force into 32 signed bits.\n  };\n\n\n  // NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\n  // from* methods on which they depend.\n\n\n  /**\n   * A cache of the Long representations of small integer values.\n   * @type {!Object}\n   * @private\n   */\n  goog.math.Long.IntCache_ = {};\n\n\n  /**\n   * Returns a Long representing the given (32-bit) integer value.\n   * @param {number} value The 32-bit integer in question.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromInt = function(value) {\n    if (-128 <= value && value < 128) {\n      var cachedObj = goog.math.Long.IntCache_[value];\n      if (cachedObj) {\n        return cachedObj;\n      }\n    }\n\n    var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\n    if (-128 <= value && value < 128) {\n      goog.math.Long.IntCache_[value] = obj;\n    }\n    return obj;\n  };\n\n\n  /**\n   * Returns a Long representing the given value, provided that it is a finite\n   * number.  Otherwise, zero is returned.\n   * @param {number} value The number in question.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromNumber = function(value) {\n    if (isNaN(value) || !isFinite(value)) {\n      return goog.math.Long.ZERO;\n    } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\n      return goog.math.Long.MIN_VALUE;\n    } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\n      return goog.math.Long.MAX_VALUE;\n    } else if (value < 0) {\n      return goog.math.Long.fromNumber(-value).negate();\n    } else {\n      return new goog.math.Long(\n          (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\n          (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\n    }\n  };\n\n\n  /**\n   * Returns a Long representing the 64-bit integer that comes by concatenating\n   * the given high and low bits.  Each is assumed to use 32 bits.\n   * @param {number} lowBits The low 32-bits.\n   * @param {number} highBits The high 32-bits.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromBits = function(lowBits, highBits) {\n    return new goog.math.Long(lowBits, highBits);\n  };\n\n\n  /**\n   * Returns a Long representation of the given string, written using the given\n   * radix.\n   * @param {string} str The textual representation of the Long.\n   * @param {number=} opt_radix The radix in which the text is written.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromString = function(str, opt_radix) {\n    if (str.length == 0) {\n      throw Error('number format error: empty string');\n    }\n\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw Error('radix out of range: ' + radix);\n    }\n\n    if (str.charAt(0) == '-') {\n      return goog.math.Long.fromString(str.substring(1), radix).negate();\n    } else if (str.indexOf('-') >= 0) {\n      throw Error('number format error: interior \"-\" character: ' + str);\n    }\n\n    // Do several (8) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\n\n    var result = goog.math.Long.ZERO;\n    for (var i = 0; i < str.length; i += 8) {\n      var size = Math.min(8, str.length - i);\n      var value = parseInt(str.substring(i, i + size), radix);\n      if (size < 8) {\n        var power = goog.math.Long.fromNumber(Math.pow(radix, size));\n        result = result.multiply(power).add(goog.math.Long.fromNumber(value));\n      } else {\n        result = result.multiply(radixToPower);\n        result = result.add(goog.math.Long.fromNumber(value));\n      }\n    }\n    return result;\n  };\n\n\n  // NOTE: the compiler should inline these constant values below and then remove\n  // these variables, so there should be no runtime penalty for these.\n\n\n  /**\n   * Number used repeated below in calculations.  This must appear before the\n   * first call to any from* function below.\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_32_DBL_ =\n      goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_31_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ / 2;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_48_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_64_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_63_DBL_ =\n      goog.math.Long.TWO_PWR_64_DBL_ / 2;\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.ZERO = goog.math.Long.fromInt(0);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.ONE = goog.math.Long.fromInt(1);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.MAX_VALUE =\n      goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\n\n\n  /**\n   * @type {!goog.math.Long}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\n\n\n  /** @return {number} The value, assuming it is a 32-bit integer. */\n  goog.math.Long.prototype.toInt = function() {\n    return this.low_;\n  };\n\n\n  /** @return {number} The closest floating-point representation to this value. */\n  goog.math.Long.prototype.toNumber = function() {\n    return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\n           this.getLowBitsUnsigned();\n  };\n\n\n  /**\n   * @param {number=} opt_radix The radix in which the text should be written.\n   * @return {string} The textual representation of this value.\n   */\n  goog.math.Long.prototype.toString = function(opt_radix) {\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw Error('radix out of range: ' + radix);\n    }\n\n    if (this.isZero()) {\n      return '0';\n    }\n\n    if (this.isNegative()) {\n      if (this.equals(goog.math.Long.MIN_VALUE)) {\n        // We need to change the Long value before it can be negated, so we remove\n        // the bottom-most digit in this base and then recurse to do the rest.\n        var radixLong = goog.math.Long.fromNumber(radix);\n        var div = this.div(radixLong);\n        var rem = div.multiply(radixLong).subtract(this);\n        return div.toString(radix) + rem.toInt().toString(radix);\n      } else {\n        return '-' + this.negate().toString(radix);\n      }\n    }\n\n    // Do several (6) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\n\n    var rem = this;\n    var result = '';\n    while (true) {\n      var remDiv = rem.div(radixToPower);\n      var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\n      var digits = intval.toString(radix);\n\n      rem = remDiv;\n      if (rem.isZero()) {\n        return digits + result;\n      } else {\n        while (digits.length < 6) {\n          digits = '0' + digits;\n        }\n        result = '' + digits + result;\n      }\n    }\n  };\n\n\n  /** @return {number} The high 32-bits as a signed value. */\n  goog.math.Long.prototype.getHighBits = function() {\n    return this.high_;\n  };\n\n\n  /** @return {number} The low 32-bits as a signed value. */\n  goog.math.Long.prototype.getLowBits = function() {\n    return this.low_;\n  };\n\n\n  /** @return {number} The low 32-bits as an unsigned value. */\n  goog.math.Long.prototype.getLowBitsUnsigned = function() {\n    return (this.low_ >= 0) ?\n        this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\n  };\n\n\n  /**\n   * @return {number} Returns the number of bits needed to represent the absolute\n   *     value of this Long.\n   */\n  goog.math.Long.prototype.getNumBitsAbs = function() {\n    if (this.isNegative()) {\n      if (this.equals(goog.math.Long.MIN_VALUE)) {\n        return 64;\n      } else {\n        return this.negate().getNumBitsAbs();\n      }\n    } else {\n      var val = this.high_ != 0 ? this.high_ : this.low_;\n      for (var bit = 31; bit > 0; bit--) {\n        if ((val & (1 << bit)) != 0) {\n          break;\n        }\n      }\n      return this.high_ != 0 ? bit + 33 : bit + 1;\n    }\n  };\n\n\n  /** @return {boolean} Whether this value is zero. */\n  goog.math.Long.prototype.isZero = function() {\n    return this.high_ == 0 && this.low_ == 0;\n  };\n\n\n  /** @return {boolean} Whether this value is negative. */\n  goog.math.Long.prototype.isNegative = function() {\n    return this.high_ < 0;\n  };\n\n\n  /** @return {boolean} Whether this value is odd. */\n  goog.math.Long.prototype.isOdd = function() {\n    return (this.low_ & 1) == 1;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long equals the other.\n   */\n  goog.math.Long.prototype.equals = function(other) {\n    return (this.high_ == other.high_) && (this.low_ == other.low_);\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long does not equal the other.\n   */\n  goog.math.Long.prototype.notEquals = function(other) {\n    return (this.high_ != other.high_) || (this.low_ != other.low_);\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than the other.\n   */\n  goog.math.Long.prototype.lessThan = function(other) {\n    return this.compare(other) < 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than or equal to the other.\n   */\n  goog.math.Long.prototype.lessThanOrEqual = function(other) {\n    return this.compare(other) <= 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than the other.\n   */\n  goog.math.Long.prototype.greaterThan = function(other) {\n    return this.compare(other) > 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than or equal to the other.\n   */\n  goog.math.Long.prototype.greaterThanOrEqual = function(other) {\n    return this.compare(other) >= 0;\n  };\n\n\n  /**\n   * Compares this Long with the given one.\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {number} 0 if they are the same, 1 if the this is greater, and -1\n   *     if the given one is greater.\n   */\n  goog.math.Long.prototype.compare = function(other) {\n    if (this.equals(other)) {\n      return 0;\n    }\n\n    var thisNeg = this.isNegative();\n    var otherNeg = other.isNegative();\n    if (thisNeg && !otherNeg) {\n      return -1;\n    }\n    if (!thisNeg && otherNeg) {\n      return 1;\n    }\n\n    // at this point, the signs are the same, so subtraction will not overflow\n    if (this.subtract(other).isNegative()) {\n      return -1;\n    } else {\n      return 1;\n    }\n  };\n\n\n  /** @return {!goog.math.Long} The negation of this value. */\n  goog.math.Long.prototype.negate = function() {\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.MIN_VALUE;\n    } else {\n      return this.not().add(goog.math.Long.ONE);\n    }\n  };\n\n\n  /**\n   * Returns the sum of this and the given Long.\n   * @param {goog.math.Long} other Long to add to this one.\n   * @return {!goog.math.Long} The sum of this and the given Long.\n   */\n  goog.math.Long.prototype.add = function(other) {\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 + b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 + b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 + b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 + b48;\n    c48 &= 0xFFFF;\n    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  };\n\n\n  /**\n   * Returns the difference of this and the given Long.\n   * @param {goog.math.Long} other Long to subtract from this.\n   * @return {!goog.math.Long} The difference of this and the given Long.\n   */\n  goog.math.Long.prototype.subtract = function(other) {\n    return this.add(other.negate());\n  };\n\n\n  /**\n   * Returns the product of this and the given long.\n   * @param {goog.math.Long} other Long to multiply with this.\n   * @return {!goog.math.Long} The product of this and the other.\n   */\n  goog.math.Long.prototype.multiply = function(other) {\n    if (this.isZero()) {\n      return goog.math.Long.ZERO;\n    } else if (other.isZero()) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n    }\n\n    if (this.isNegative()) {\n      if (other.isNegative()) {\n        return this.negate().multiply(other.negate());\n      } else {\n        return this.negate().multiply(other).negate();\n      }\n    } else if (other.isNegative()) {\n      return this.multiply(other.negate()).negate();\n    }\n\n    // If both longs are small, use float multiplication\n    if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\n        other.lessThan(goog.math.Long.TWO_PWR_24_)) {\n      return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\n    }\n\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n    // We can skip products that would overflow.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 * b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 * b00;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c16 += a00 * b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 * b00;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a16 * b16;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a00 * b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n    c48 &= 0xFFFF;\n    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  };\n\n\n  /**\n   * Returns this Long divided by the given one.\n   * @param {goog.math.Long} other Long by which to divide.\n   * @return {!goog.math.Long} This Long divided by the given one.\n   */\n  goog.math.Long.prototype.div = function(other) {\n    if (other.isZero()) {\n      throw Error('division by zero');\n    } else if (this.isZero()) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      if (other.equals(goog.math.Long.ONE) ||\n          other.equals(goog.math.Long.NEG_ONE)) {\n        return goog.math.Long.MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\n      } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n        return goog.math.Long.ONE;\n      } else {\n        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n        var halfThis = this.shiftRight(1);\n        var approx = halfThis.div(other).shiftLeft(1);\n        if (approx.equals(goog.math.Long.ZERO)) {\n          return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\n        } else {\n          var rem = this.subtract(other.multiply(approx));\n          var result = approx.add(rem.div(other));\n          return result;\n        }\n      }\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.isNegative()) {\n      if (other.isNegative()) {\n        return this.negate().div(other.negate());\n      } else {\n        return this.negate().div(other).negate();\n      }\n    } else if (other.isNegative()) {\n      return this.div(other.negate()).negate();\n    }\n\n    // Repeat the following until the remainder is less than other:  find a\n    // floating-point that approximates remainder / other *from below*, add this\n    // into the result, and subtract it from the remainder.  It is critical that\n    // the approximate value is less than or equal to the real value so that the\n    // remainder never becomes negative.\n    var res = goog.math.Long.ZERO;\n    var rem = this;\n    while (rem.greaterThanOrEqual(other)) {\n      // Approximate the result of division. This may be a little greater or\n      // smaller than the actual value.\n      var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\n\n      // We will tweak the approximate result by changing it in the 48-th digit or\n      // the smallest non-fractional digit, whichever is larger.\n      var log2 = Math.ceil(Math.log(approx) / Math.LN2);\n      var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\n\n      // Decrease the approximation until it is smaller than the remainder.  Note\n      // that if it is too large, the product overflows and is negative.\n      var approxRes = goog.math.Long.fromNumber(approx);\n      var approxRem = approxRes.multiply(other);\n      while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\n        approx -= delta;\n        approxRes = goog.math.Long.fromNumber(approx);\n        approxRem = approxRes.multiply(other);\n      }\n\n      // We know the answer can't be zero... and actually, zero would cause\n      // infinite recursion since we would make no progress.\n      if (approxRes.isZero()) {\n        approxRes = goog.math.Long.ONE;\n      }\n\n      res = res.add(approxRes);\n      rem = rem.subtract(approxRem);\n    }\n    return res;\n  };\n\n\n  /**\n   * Returns this Long modulo the given one.\n   * @param {goog.math.Long} other Long by which to mod.\n   * @return {!goog.math.Long} This Long modulo the given one.\n   */\n  goog.math.Long.prototype.modulo = function(other) {\n    return this.subtract(this.div(other).multiply(other));\n  };\n\n\n  /** @return {!goog.math.Long} The bitwise-NOT of this value. */\n  goog.math.Long.prototype.not = function() {\n    return goog.math.Long.fromBits(~this.low_, ~this.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-AND of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to AND.\n   * @return {!goog.math.Long} The bitwise-AND of this and the other.\n   */\n  goog.math.Long.prototype.and = function(other) {\n    return goog.math.Long.fromBits(this.low_ & other.low_,\n                                   this.high_ & other.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-OR of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to OR.\n   * @return {!goog.math.Long} The bitwise-OR of this and the other.\n   */\n  goog.math.Long.prototype.or = function(other) {\n    return goog.math.Long.fromBits(this.low_ | other.low_,\n                                   this.high_ | other.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-XOR of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to XOR.\n   * @return {!goog.math.Long} The bitwise-XOR of this and the other.\n   */\n  goog.math.Long.prototype.xor = function(other) {\n    return goog.math.Long.fromBits(this.low_ ^ other.low_,\n                                   this.high_ ^ other.high_);\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the left by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the left by the given amount.\n   */\n  goog.math.Long.prototype.shiftLeft = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var low = this.low_;\n      if (numBits < 32) {\n        var high = this.high_;\n        return goog.math.Long.fromBits(\n            low << numBits,\n            (high << numBits) | (low >>> (32 - numBits)));\n      } else {\n        return goog.math.Long.fromBits(0, low << (numBits - 32));\n      }\n    }\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the right by the given amount.\n   */\n  goog.math.Long.prototype.shiftRight = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return goog.math.Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)),\n            high >> numBits);\n      } else {\n        return goog.math.Long.fromBits(\n            high >> (numBits - 32),\n            high >= 0 ? 0 : -1);\n      }\n    }\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount, with\n   * the new top bits matching the current sign bit.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the right by the given amount, with\n   *     zeros placed into the new leading bits.\n   */\n  goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return goog.math.Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)),\n            high >>> numBits);\n      } else if (numBits == 32) {\n        return goog.math.Long.fromBits(high, 0);\n      } else {\n        return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\n      }\n    }\n  };\n\n  //======= begin jsbn =======\n\n  var navigator = { appName: 'Modern Browser' }; // polyfill a little\n\n  // Copyright (c) 2005  Tom Wu\n  // All Rights Reserved.\n  // http://www-cs-students.stanford.edu/~tjw/jsbn/\n\n  /*\n   * Copyright (c) 2003-2005  Tom Wu\n   * All Rights Reserved.\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining\n   * a copy of this software and associated documentation files (the\n   * \"Software\"), to deal in the Software without restriction, including\n   * without limitation the rights to use, copy, modify, merge, publish,\n   * distribute, sublicense, and/or sell copies of the Software, and to\n   * permit persons to whom the Software is furnished to do so, subject to\n   * the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be\n   * included in all copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND, \n   * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY \n   * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  \n   *\n   * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n   * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n   * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n   * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n   * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n   *\n   * In addition, the following condition applies:\n   *\n   * All redistributions must retain an intact copy of this copyright notice\n   * and disclaimer.\n   */\n\n  // Basic JavaScript BN library - subset useful for RSA encryption.\n\n  // Bits per digit\n  var dbits;\n\n  // JavaScript engine analysis\n  var canary = 0xdeadbeefcafe;\n  var j_lm = ((canary&0xffffff)==0xefcafe);\n\n  // (public) Constructor\n  function BigInteger(a,b,c) {\n    if(a != null)\n      if(\"number\" == typeof a) this.fromNumber(a,b,c);\n      else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n      else this.fromString(a,b);\n  }\n\n  // return new, unset BigInteger\n  function nbi() { return new BigInteger(null); }\n\n  // am: Compute w_j += (x*this_i), propagate carries,\n  // c is initial carry, returns final carry.\n  // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n  // We need to select the fastest one that works in this environment.\n\n  // am1: use a single mult and divide to get the high bits,\n  // max digit bits should be 26 because\n  // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n  function am1(i,x,w,j,c,n) {\n    while(--n >= 0) {\n      var v = x*this[i++]+w[j]+c;\n      c = Math.floor(v/0x4000000);\n      w[j++] = v&0x3ffffff;\n    }\n    return c;\n  }\n  // am2 avoids a big mult-and-extract completely.\n  // Max digit bits should be <= 30 because we do bitwise ops\n  // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n  function am2(i,x,w,j,c,n) {\n    var xl = x&0x7fff, xh = x>>15;\n    while(--n >= 0) {\n      var l = this[i]&0x7fff;\n      var h = this[i++]>>15;\n      var m = xh*l+h*xl;\n      l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n      c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n      w[j++] = l&0x3fffffff;\n    }\n    return c;\n  }\n  // Alternately, set max digit bits to 28 since some\n  // browsers slow down when dealing with 32-bit numbers.\n  function am3(i,x,w,j,c,n) {\n    var xl = x&0x3fff, xh = x>>14;\n    while(--n >= 0) {\n      var l = this[i]&0x3fff;\n      var h = this[i++]>>14;\n      var m = xh*l+h*xl;\n      l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n      c = (l>>28)+(m>>14)+xh*h;\n      w[j++] = l&0xfffffff;\n    }\n    return c;\n  }\n  if(j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n    BigInteger.prototype.am = am2;\n    dbits = 30;\n  }\n  else if(j_lm && (navigator.appName != \"Netscape\")) {\n    BigInteger.prototype.am = am1;\n    dbits = 26;\n  }\n  else { // Mozilla/Netscape seems to prefer am3\n    BigInteger.prototype.am = am3;\n    dbits = 28;\n  }\n\n  BigInteger.prototype.DB = dbits;\n  BigInteger.prototype.DM = ((1<<dbits)-1);\n  BigInteger.prototype.DV = (1<<dbits);\n\n  var BI_FP = 52;\n  BigInteger.prototype.FV = Math.pow(2,BI_FP);\n  BigInteger.prototype.F1 = BI_FP-dbits;\n  BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n  // Digit conversions\n  var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n  var BI_RC = new Array();\n  var rr,vv;\n  rr = \"0\".charCodeAt(0);\n  for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n  rr = \"a\".charCodeAt(0);\n  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n  rr = \"A\".charCodeAt(0);\n  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n  function int2char(n) { return BI_RM.charAt(n); }\n  function intAt(s,i) {\n    var c = BI_RC[s.charCodeAt(i)];\n    return (c==null)?-1:c;\n  }\n\n  // (protected) copy this to r\n  function bnpCopyTo(r) {\n    for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n    r.t = this.t;\n    r.s = this.s;\n  }\n\n  // (protected) set from integer value x, -DV <= x < DV\n  function bnpFromInt(x) {\n    this.t = 1;\n    this.s = (x<0)?-1:0;\n    if(x > 0) this[0] = x;\n    else if(x < -1) this[0] = x+DV;\n    else this.t = 0;\n  }\n\n  // return bigint initialized to value\n  function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n  // (protected) set from string and radix\n  function bnpFromString(s,b) {\n    var k;\n    if(b == 16) k = 4;\n    else if(b == 8) k = 3;\n    else if(b == 256) k = 8; // byte array\n    else if(b == 2) k = 1;\n    else if(b == 32) k = 5;\n    else if(b == 4) k = 2;\n    else { this.fromRadix(s,b); return; }\n    this.t = 0;\n    this.s = 0;\n    var i = s.length, mi = false, sh = 0;\n    while(--i >= 0) {\n      var x = (k==8)?s[i]&0xff:intAt(s,i);\n      if(x < 0) {\n        if(s.charAt(i) == \"-\") mi = true;\n        continue;\n      }\n      mi = false;\n      if(sh == 0)\n        this[this.t++] = x;\n      else if(sh+k > this.DB) {\n        this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n        this[this.t++] = (x>>(this.DB-sh));\n      }\n      else\n        this[this.t-1] |= x<<sh;\n      sh += k;\n      if(sh >= this.DB) sh -= this.DB;\n    }\n    if(k == 8 && (s[0]&0x80) != 0) {\n      this.s = -1;\n      if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n    }\n    this.clamp();\n    if(mi) BigInteger.ZERO.subTo(this,this);\n  }\n\n  // (protected) clamp off excess high words\n  function bnpClamp() {\n    var c = this.s&this.DM;\n    while(this.t > 0 && this[this.t-1] == c) --this.t;\n  }\n\n  // (public) return string representation in given radix\n  function bnToString(b) {\n    if(this.s < 0) return \"-\"+this.negate().toString(b);\n    var k;\n    if(b == 16) k = 4;\n    else if(b == 8) k = 3;\n    else if(b == 2) k = 1;\n    else if(b == 32) k = 5;\n    else if(b == 4) k = 2;\n    else return this.toRadix(b);\n    var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n    var p = this.DB-(i*this.DB)%k;\n    if(i-- > 0) {\n      if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n      while(i >= 0) {\n        if(p < k) {\n          d = (this[i]&((1<<p)-1))<<(k-p);\n          d |= this[--i]>>(p+=this.DB-k);\n        }\n        else {\n          d = (this[i]>>(p-=k))&km;\n          if(p <= 0) { p += this.DB; --i; }\n        }\n        if(d > 0) m = true;\n        if(m) r += int2char(d);\n      }\n    }\n    return m?r:\"0\";\n  }\n\n  // (public) -this\n  function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n  // (public) |this|\n  function bnAbs() { return (this.s<0)?this.negate():this; }\n\n  // (public) return + if this > a, - if this < a, 0 if equal\n  function bnCompareTo(a) {\n    var r = this.s-a.s;\n    if(r != 0) return r;\n    var i = this.t;\n    r = i-a.t;\n    if(r != 0) return (this.s<0)?-r:r;\n    while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n    return 0;\n  }\n\n  // returns bit length of the integer x\n  function nbits(x) {\n    var r = 1, t;\n    if((t=x>>>16) != 0) { x = t; r += 16; }\n    if((t=x>>8) != 0) { x = t; r += 8; }\n    if((t=x>>4) != 0) { x = t; r += 4; }\n    if((t=x>>2) != 0) { x = t; r += 2; }\n    if((t=x>>1) != 0) { x = t; r += 1; }\n    return r;\n  }\n\n  // (public) return the number of bits in \"this\"\n  function bnBitLength() {\n    if(this.t <= 0) return 0;\n    return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n  }\n\n  // (protected) r = this << n*DB\n  function bnpDLShiftTo(n,r) {\n    var i;\n    for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n    for(i = n-1; i >= 0; --i) r[i] = 0;\n    r.t = this.t+n;\n    r.s = this.s;\n  }\n\n  // (protected) r = this >> n*DB\n  function bnpDRShiftTo(n,r) {\n    for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n    r.t = Math.max(this.t-n,0);\n    r.s = this.s;\n  }\n\n  // (protected) r = this << n\n  function bnpLShiftTo(n,r) {\n    var bs = n%this.DB;\n    var cbs = this.DB-bs;\n    var bm = (1<<cbs)-1;\n    var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n    for(i = this.t-1; i >= 0; --i) {\n      r[i+ds+1] = (this[i]>>cbs)|c;\n      c = (this[i]&bm)<<bs;\n    }\n    for(i = ds-1; i >= 0; --i) r[i] = 0;\n    r[ds] = c;\n    r.t = this.t+ds+1;\n    r.s = this.s;\n    r.clamp();\n  }\n\n  // (protected) r = this >> n\n  function bnpRShiftTo(n,r) {\n    r.s = this.s;\n    var ds = Math.floor(n/this.DB);\n    if(ds >= this.t) { r.t = 0; return; }\n    var bs = n%this.DB;\n    var cbs = this.DB-bs;\n    var bm = (1<<bs)-1;\n    r[0] = this[ds]>>bs;\n    for(var i = ds+1; i < this.t; ++i) {\n      r[i-ds-1] |= (this[i]&bm)<<cbs;\n      r[i-ds] = this[i]>>bs;\n    }\n    if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n    r.t = this.t-ds;\n    r.clamp();\n  }\n\n  // (protected) r = this - a\n  function bnpSubTo(a,r) {\n    var i = 0, c = 0, m = Math.min(a.t,this.t);\n    while(i < m) {\n      c += this[i]-a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    if(a.t < this.t) {\n      c -= a.s;\n      while(i < this.t) {\n        c += this[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += this.s;\n    }\n    else {\n      c += this.s;\n      while(i < a.t) {\n        c -= a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c -= a.s;\n    }\n    r.s = (c<0)?-1:0;\n    if(c < -1) r[i++] = this.DV+c;\n    else if(c > 0) r[i++] = c;\n    r.t = i;\n    r.clamp();\n  }\n\n  // (protected) r = this * a, r != this,a (HAC 14.12)\n  // \"this\" should be the larger one if appropriate.\n  function bnpMultiplyTo(a,r) {\n    var x = this.abs(), y = a.abs();\n    var i = x.t;\n    r.t = i+y.t;\n    while(--i >= 0) r[i] = 0;\n    for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n    r.s = 0;\n    r.clamp();\n    if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n  }\n\n  // (protected) r = this^2, r != this (HAC 14.16)\n  function bnpSquareTo(r) {\n    var x = this.abs();\n    var i = r.t = 2*x.t;\n    while(--i >= 0) r[i] = 0;\n    for(i = 0; i < x.t-1; ++i) {\n      var c = x.am(i,x[i],r,2*i,0,1);\n      if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n        r[i+x.t] -= x.DV;\n        r[i+x.t+1] = 1;\n      }\n    }\n    if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n    r.s = 0;\n    r.clamp();\n  }\n\n  // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n  // r != q, this != m.  q or r may be null.\n  function bnpDivRemTo(m,q,r) {\n    var pm = m.abs();\n    if(pm.t <= 0) return;\n    var pt = this.abs();\n    if(pt.t < pm.t) {\n      if(q != null) q.fromInt(0);\n      if(r != null) this.copyTo(r);\n      return;\n    }\n    if(r == null) r = nbi();\n    var y = nbi(), ts = this.s, ms = m.s;\n    var nsh = this.DB-nbits(pm[pm.t-1]);\t// normalize modulus\n    if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n    else { pm.copyTo(y); pt.copyTo(r); }\n    var ys = y.t;\n    var y0 = y[ys-1];\n    if(y0 == 0) return;\n    var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n    var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n    var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n    y.dlShiftTo(j,t);\n    if(r.compareTo(t) >= 0) {\n      r[r.t++] = 1;\n      r.subTo(t,r);\n    }\n    BigInteger.ONE.dlShiftTo(ys,t);\n    t.subTo(y,y);\t// \"negative\" y so we can replace sub with am later\n    while(y.t < ys) y[y.t++] = 0;\n    while(--j >= 0) {\n      // Estimate quotient digit\n      var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n      if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {\t// Try it out\n        y.dlShiftTo(j,t);\n        r.subTo(t,r);\n        while(r[i] < --qd) r.subTo(t,r);\n      }\n    }\n    if(q != null) {\n      r.drShiftTo(ys,q);\n      if(ts != ms) BigInteger.ZERO.subTo(q,q);\n    }\n    r.t = ys;\n    r.clamp();\n    if(nsh > 0) r.rShiftTo(nsh,r);\t// Denormalize remainder\n    if(ts < 0) BigInteger.ZERO.subTo(r,r);\n  }\n\n  // (public) this mod a\n  function bnMod(a) {\n    var r = nbi();\n    this.abs().divRemTo(a,null,r);\n    if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n    return r;\n  }\n\n  // Modular reduction using \"classic\" algorithm\n  function Classic(m) { this.m = m; }\n  function cConvert(x) {\n    if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n    else return x;\n  }\n  function cRevert(x) { return x; }\n  function cReduce(x) { x.divRemTo(this.m,null,x); }\n  function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n  function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n  Classic.prototype.convert = cConvert;\n  Classic.prototype.revert = cRevert;\n  Classic.prototype.reduce = cReduce;\n  Classic.prototype.mulTo = cMulTo;\n  Classic.prototype.sqrTo = cSqrTo;\n\n  // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n  // justification:\n  //         xy == 1 (mod m)\n  //         xy =  1+km\n  //   xy(2-xy) = (1+km)(1-km)\n  // x[y(2-xy)] = 1-k^2m^2\n  // x[y(2-xy)] == 1 (mod m^2)\n  // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n  // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n  // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n  function bnpInvDigit() {\n    if(this.t < 1) return 0;\n    var x = this[0];\n    if((x&1) == 0) return 0;\n    var y = x&3;\t\t// y == 1/x mod 2^2\n    y = (y*(2-(x&0xf)*y))&0xf;\t// y == 1/x mod 2^4\n    y = (y*(2-(x&0xff)*y))&0xff;\t// y == 1/x mod 2^8\n    y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;\t// y == 1/x mod 2^16\n    // last step - calculate inverse mod DV directly;\n    // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n    y = (y*(2-x*y%this.DV))%this.DV;\t\t// y == 1/x mod 2^dbits\n    // we really want the negative inverse, and -DV < y < DV\n    return (y>0)?this.DV-y:-y;\n  }\n\n  // Montgomery reduction\n  function Montgomery(m) {\n    this.m = m;\n    this.mp = m.invDigit();\n    this.mpl = this.mp&0x7fff;\n    this.mph = this.mp>>15;\n    this.um = (1<<(m.DB-15))-1;\n    this.mt2 = 2*m.t;\n  }\n\n  // xR mod m\n  function montConvert(x) {\n    var r = nbi();\n    x.abs().dlShiftTo(this.m.t,r);\n    r.divRemTo(this.m,null,r);\n    if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n    return r;\n  }\n\n  // x/R mod m\n  function montRevert(x) {\n    var r = nbi();\n    x.copyTo(r);\n    this.reduce(r);\n    return r;\n  }\n\n  // x = x/R mod m (HAC 14.32)\n  function montReduce(x) {\n    while(x.t <= this.mt2)\t// pad x so am has enough room later\n      x[x.t++] = 0;\n    for(var i = 0; i < this.m.t; ++i) {\n      // faster way of calculating u0 = x[i]*mp mod DV\n      var j = x[i]&0x7fff;\n      var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n      // use am to combine the multiply-shift-add into one call\n      j = i+this.m.t;\n      x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n      // propagate carry\n      while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n    }\n    x.clamp();\n    x.drShiftTo(this.m.t,x);\n    if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n  }\n\n  // r = \"x^2/R mod m\"; x != r\n  function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n  // r = \"xy/R mod m\"; x,y != r\n  function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n  Montgomery.prototype.convert = montConvert;\n  Montgomery.prototype.revert = montRevert;\n  Montgomery.prototype.reduce = montReduce;\n  Montgomery.prototype.mulTo = montMulTo;\n  Montgomery.prototype.sqrTo = montSqrTo;\n\n  // (protected) true iff this is even\n  function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n  // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n  function bnpExp(e,z) {\n    if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n    var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n    g.copyTo(r);\n    while(--i >= 0) {\n      z.sqrTo(r,r2);\n      if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n      else { var t = r; r = r2; r2 = t; }\n    }\n    return z.revert(r);\n  }\n\n  // (public) this^e % m, 0 <= e < 2^32\n  function bnModPowInt(e,m) {\n    var z;\n    if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n    return this.exp(e,z);\n  }\n\n  // protected\n  BigInteger.prototype.copyTo = bnpCopyTo;\n  BigInteger.prototype.fromInt = bnpFromInt;\n  BigInteger.prototype.fromString = bnpFromString;\n  BigInteger.prototype.clamp = bnpClamp;\n  BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n  BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n  BigInteger.prototype.lShiftTo = bnpLShiftTo;\n  BigInteger.prototype.rShiftTo = bnpRShiftTo;\n  BigInteger.prototype.subTo = bnpSubTo;\n  BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n  BigInteger.prototype.squareTo = bnpSquareTo;\n  BigInteger.prototype.divRemTo = bnpDivRemTo;\n  BigInteger.prototype.invDigit = bnpInvDigit;\n  BigInteger.prototype.isEven = bnpIsEven;\n  BigInteger.prototype.exp = bnpExp;\n\n  // public\n  BigInteger.prototype.toString = bnToString;\n  BigInteger.prototype.negate = bnNegate;\n  BigInteger.prototype.abs = bnAbs;\n  BigInteger.prototype.compareTo = bnCompareTo;\n  BigInteger.prototype.bitLength = bnBitLength;\n  BigInteger.prototype.mod = bnMod;\n  BigInteger.prototype.modPowInt = bnModPowInt;\n\n  // \"constants\"\n  BigInteger.ZERO = nbv(0);\n  BigInteger.ONE = nbv(1);\n\n  // jsbn2 stuff\n\n  // (protected) convert from radix string\n  function bnpFromRadix(s,b) {\n    this.fromInt(0);\n    if(b == null) b = 10;\n    var cs = this.chunkSize(b);\n    var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n    for(var i = 0; i < s.length; ++i) {\n      var x = intAt(s,i);\n      if(x < 0) {\n        if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n        continue;\n      }\n      w = b*w+x;\n      if(++j >= cs) {\n        this.dMultiply(d);\n        this.dAddOffset(w,0);\n        j = 0;\n        w = 0;\n      }\n    }\n    if(j > 0) {\n      this.dMultiply(Math.pow(b,j));\n      this.dAddOffset(w,0);\n    }\n    if(mi) BigInteger.ZERO.subTo(this,this);\n  }\n\n  // (protected) return x s.t. r^x < DV\n  function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n  // (public) 0 if this == 0, 1 if this > 0\n  function bnSigNum() {\n    if(this.s < 0) return -1;\n    else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n    else return 1;\n  }\n\n  // (protected) this *= n, this >= 0, 1 < n < DV\n  function bnpDMultiply(n) {\n    this[this.t] = this.am(0,n-1,this,0,0,this.t);\n    ++this.t;\n    this.clamp();\n  }\n\n  // (protected) this += n << w words, this >= 0\n  function bnpDAddOffset(n,w) {\n    if(n == 0) return;\n    while(this.t <= w) this[this.t++] = 0;\n    this[w] += n;\n    while(this[w] >= this.DV) {\n      this[w] -= this.DV;\n      if(++w >= this.t) this[this.t++] = 0;\n      ++this[w];\n    }\n  }\n\n  // (protected) convert to radix string\n  function bnpToRadix(b) {\n    if(b == null) b = 10;\n    if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n    var cs = this.chunkSize(b);\n    var a = Math.pow(b,cs);\n    var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n    this.divRemTo(d,y,z);\n    while(y.signum() > 0) {\n      r = (a+z.intValue()).toString(b).substr(1) + r;\n      y.divRemTo(d,y,z);\n    }\n    return z.intValue().toString(b) + r;\n  }\n\n  // (public) return value as integer\n  function bnIntValue() {\n    if(this.s < 0) {\n      if(this.t == 1) return this[0]-this.DV;\n      else if(this.t == 0) return -1;\n    }\n    else if(this.t == 1) return this[0];\n    else if(this.t == 0) return 0;\n    // assumes 16 < DB < 32\n    return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n  }\n\n  // (protected) r = this + a\n  function bnpAddTo(a,r) {\n    var i = 0, c = 0, m = Math.min(a.t,this.t);\n    while(i < m) {\n      c += this[i]+a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    if(a.t < this.t) {\n      c += a.s;\n      while(i < this.t) {\n        c += this[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += this.s;\n    }\n    else {\n      c += this.s;\n      while(i < a.t) {\n        c += a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += a.s;\n    }\n    r.s = (c<0)?-1:0;\n    if(c > 0) r[i++] = c;\n    else if(c < -1) r[i++] = this.DV+c;\n    r.t = i;\n    r.clamp();\n  }\n\n  BigInteger.prototype.fromRadix = bnpFromRadix;\n  BigInteger.prototype.chunkSize = bnpChunkSize;\n  BigInteger.prototype.signum = bnSigNum;\n  BigInteger.prototype.dMultiply = bnpDMultiply;\n  BigInteger.prototype.dAddOffset = bnpDAddOffset;\n  BigInteger.prototype.toRadix = bnpToRadix;\n  BigInteger.prototype.intValue = bnIntValue;\n  BigInteger.prototype.addTo = bnpAddTo;\n\n  //======= end jsbn =======\n\n  // Emscripten wrapper\n  var Wrapper = {\n    abs: function(l, h) {\n      var x = new goog.math.Long(l, h);\n      var ret;\n      if (x.isNegative()) {\n        ret = x.negate();\n      } else {\n        ret = x;\n      }\n      HEAP32[tempDoublePtr>>2] = ret.low_;\n      HEAP32[tempDoublePtr+4>>2] = ret.high_;\n    },\n    ensureTemps: function() {\n      if (Wrapper.ensuredTemps) return;\n      Wrapper.ensuredTemps = true;\n      Wrapper.two32 = new BigInteger();\n      Wrapper.two32.fromString('4294967296', 10);\n      Wrapper.two64 = new BigInteger();\n      Wrapper.two64.fromString('18446744073709551616', 10);\n      Wrapper.temp1 = new BigInteger();\n      Wrapper.temp2 = new BigInteger();\n    },\n    lh2bignum: function(l, h) {\n      var a = new BigInteger();\n      a.fromString(h.toString(), 10);\n      var b = new BigInteger();\n      a.multiplyTo(Wrapper.two32, b);\n      var c = new BigInteger();\n      c.fromString(l.toString(), 10);\n      var d = new BigInteger();\n      c.addTo(b, d);\n      return d;\n    },\n    stringify: function(l, h, unsigned) {\n      var ret = new goog.math.Long(l, h).toString();\n      if (unsigned && ret[0] == '-') {\n        // unsign slowly using jsbn bignums\n        Wrapper.ensureTemps();\n        var bignum = new BigInteger();\n        bignum.fromString(ret, 10);\n        ret = new BigInteger();\n        Wrapper.two64.addTo(bignum, ret);\n        ret = ret.toString(10);\n      }\n      return ret;\n    },\n    fromString: function(str, base, min, max, unsigned) {\n      Wrapper.ensureTemps();\n      var bignum = new BigInteger();\n      bignum.fromString(str, base);\n      var bigmin = new BigInteger();\n      bigmin.fromString(min, 10);\n      var bigmax = new BigInteger();\n      bigmax.fromString(max, 10);\n      if (unsigned && bignum.compareTo(BigInteger.ZERO) < 0) {\n        var temp = new BigInteger();\n        bignum.addTo(Wrapper.two64, temp);\n        bignum = temp;\n      }\n      var error = false;\n      if (bignum.compareTo(bigmin) < 0) {\n        bignum = bigmin;\n        error = true;\n      } else if (bignum.compareTo(bigmax) > 0) {\n        bignum = bigmax;\n        error = true;\n      }\n      var ret = goog.math.Long.fromString(bignum.toString()); // min-max checks should have clamped this to a range goog.math.Long can handle well\n      HEAP32[tempDoublePtr>>2] = ret.low_;\n      HEAP32[tempDoublePtr+4>>2] = ret.high_;\n      if (error) throw 'range error';\n    }\n  };\n  return Wrapper;\n})();\n\n//======= end closure i64 code =======\n\n\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "container.cpp", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\nvar __ZTVN10__cxxabiv117__class_type_infoE = 15392;\nvar __ZTVN10__cxxabiv120__si_class_type_infoE = 15432;\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(16259);\n/* global initializers */ __ATINIT__.push({ func: function() { __GLOBAL__I_a() } }, { func: function() { __GLOBAL__I_a18() } });\n\n\n/* memory initializer */ allocate([], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n/* memory initializer */ allocate([144,14,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,119,69,69,0,0,0,0,0,0,0,0,80,60,0,0,112,14,0,0,192,20,0,0,0,0,0,0,0,0,0,0,248,14,0,0,3,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,6,0,0,0,7,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,119,69,69,0,80,60,0,0,224,14,0,0,192,20,0,0,0,0,0,0,117,110,115,117,112,112,111,114,116,101,100,32,108,111,99,97,108,101,32,102,111,114,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,0,0,0,0,0,0,0,144,15,0,0,5,0,0,0,6,0,0,0,3,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,8,0,0,0,9,0,0,0,6,0,0,0,10,0,0,0,11,0,0,0,5,0,0,0,7,0,0,0,6,0,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,99,69,69,0,0,0,0,0,0,0,0,80,60,0,0,112,15,0,0,128,20,0,0,0,0,0,0,0,0,0,0,248,15,0,0,7,0,0,0,8,0,0,0,4,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,12,0,0,0,9,0,0,0,6,0,0,0,13,0,0,0,14,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,99,69,69,0,80,60,0,0,224,15,0,0,128,20,0,0,0,0,0,0,78,83,116,51,95,95,49,49,52,95,95,115,104,97,114,101,100,95,99,111,117,110,116,69,0,0,0,0,0,0,0,0,40,60,0,0,8,16,0,0,0,0,0,0,112,16,0,0,9,0,0,0,10,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,216,16,0,0,11,0,0,0,12,0,0,0,16,0,0,0,0,0,0,0,83,116,49,49,108,111,103,105,99,95,101,114,114,111,114,0,80,60,0,0,96,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,16,0,0,9,0,0,0,13,0,0,0,15,0,0,0,0,0,0,0,83,116,49,50,108,101,110,103,116,104,95,101,114,114,111,114,0,0,0,0,0,0,0,0,80,60,0,0,152,16,0,0,112,16,0,0,0,0,0,0,83,116,49,51,114,117,110,116,105,109,101,95,101,114,114,111,114,0,0,0,0,0,0,0,80,60,0,0,192,16,0,0,0,0,0,0,0,0,0,0,58,32,0,0,0,0,0,0,0,0,0,0,32,17,0,0,14,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,50,115,121,115,116,101,109,95,101,114,114,111,114,69,0,0,80,60,0,0,8,17,0,0,216,16,0,0,0,0,0,0,78,83,116,51,95,95,49,49,52,101,114,114,111,114,95,99,97,116,101,103,111,114,121,69,0,0,0,0,0,0,0,0,40,60,0,0,48,17,0,0,78,83,116,51,95,95,49,49,50,95,95,100,111,95,109,101,115,115,97,103,101,69,0,0,80,60,0,0,88,17,0,0,80,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,97,115,105,99,95,115,116,114,105,110,103,0,0,0,0,0,0,0,0,128,20,0,0,16,0,0,0,17,0,0,0,5,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,12,0,0,0,9,0,0,0,6,0,0,0,10,0,0,0,11,0,0,0,5,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,192,20,0,0,18,0,0,0,19,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,4,0,0,0,8,0,0,0,0,0,0,0,248,20,0,0,20,0,0,0,21,0,0,0,248,255,255,255,248,255,255,255,248,20,0,0,22,0,0,0,23,0,0,0,8,0,0,0,0,0,0,0,64,21,0,0,24,0,0,0,25,0,0,0,248,255,255,255,248,255,255,255,64,21,0,0,26,0,0,0,27,0,0,0,4,0,0,0,0,0,0,0,136,21,0,0,28,0,0,0,29,0,0,0,252,255,255,255,252,255,255,255,136,21,0,0,30,0,0,0,31,0,0,0,4,0,0,0,0,0,0,0,208,21,0,0,32,0,0,0,33,0,0,0,252,255,255,255,252,255,255,255,208,21,0,0,34,0,0,0,35,0,0,0,105,111,115,116,114,101,97,109,0,0,0,0,0,0,0,0,117,110,115,112,101,99,105,102,105,101,100,32,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,32,101,114,114,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,19,0,0,36,0,0,0,37,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,192,19,0,0,38,0,0,0,39,0,0,0,105,111,115,95,98,97,115,101,58,58,99,108,101,97,114,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,55,102,97,105,108,117,114,101,69,0,0,0,0,0,0,0,80,60,0,0,120,19,0,0,32,17,0,0,0,0,0,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,69,0,0,0,0,0,0,0,40,60,0,0,168,19,0,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,0,0,0,0,0,80,60,0,0,200,19,0,0,192,19,0,0,0,0,0,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,0,0,0,0,0,80,60,0,0,8,20,0,0,192,19,0,0,0,0,0,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,0,0,0,0,0,0,40,60,0,0,72,20,0,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,0,0,0,0,0,0,40,60,0,0,136,20,0,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,176,60,0,0,200,20,0,0,0,0,0,0,1,0,0,0,248,19,0,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,176,60,0,0,16,21,0,0,0,0,0,0,1,0,0,0,56,20,0,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,176,60,0,0,88,21,0,0,0,0,0,0,1,0,0,0,248,19,0,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,176,60,0,0,160,21,0,0,0,0,0,0,1,0,0,0,56,20,0,0,3,244,255,255,0,0,0,0,48,22,0,0,40,0,0,0,41,0,0,0,17,0,0,0,1,0,0,0,9,0,0,0,10,0,0,0,2,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,57,95,95,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,69,0,0,0,80,60,0,0,16,22,0,0,112,17,0,0,0,0,0,0,0,0,0,0,88,36,0,0,42,0,0,0,43,0,0,0,44,0,0,0,1,0,0,0,3,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,36,0,0,45,0,0,0,46,0,0,0,44,0,0,0,2,0,0,0,4,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,41,0,0,47,0,0,0,48,0,0,0,44,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102,65,66,67,68,69,70,120,88,43,45,112,80,105,73,110,78,0,0,0,0,0,0,0,0,37,112,0,0,0,0,0,0,0,0,0,0,200,41,0,0,49,0,0,0,50,0,0,0,44,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,42,0,0,51,0,0,0,52,0,0,0,44,0,0,0,3,0,0,0,4,0,0,0,23,0,0,0,5,0,0,0,24,0,0,0,1,0,0,0,2,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,43,0,0,53,0,0,0,54,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,25,0,0,0,9,0,0,0,26,0,0,0,3,0,0,0,4,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,37,112,0,0,0,0,0,0,0,0,0,0,72,38,0,0,55,0,0,0,56,0,0,0,44,0,0,0,18,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,1,0,0,0,248,255,255,255,72,38,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,58,37,77,58,37,83,37,109,47,37,100,47,37,121,37,89,45,37,109,45,37,100,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,37,72,58,37,77,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,232,38,0,0,57,0,0,0,58,0,0,0,44,0,0,0,26,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,2,0,0,0,248,255,255,255,232,38,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,37,0,0,0,89,0,0,0,45,0,0,0,37,0,0,0,109,0,0,0,45,0,0,0,37,0,0,0,100,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,120,39,0,0,59,0,0,0,60,0,0,0,44,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,39,0,0,61,0,0,0,62,0,0,0,44,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,36,0,0,63,0,0,0,64,0,0,0,44,0,0,0,34,0,0,0,35,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,36,0,0,0,11,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,37,0,0,65,0,0,0,66,0,0,0,44,0,0,0,37,0,0,0,38,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,39,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,37,0,0,67,0,0,0,68,0,0,0,44,0,0,0,40,0,0,0,41,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,42,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,37,0,0,69,0,0,0,70,0,0,0,44,0,0,0,43,0,0,0,44,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,45,0,0,0,29,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,43,0,0,71,0,0,0,72,0,0,0,44,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,0,0,0,0,0,37,76,102,0,0,0,0,0,109,111,110,101,121,95,103,101,116,32,101,114,114,111,114,0,0,0,0,0,64,44,0,0,73,0,0,0,74,0,0,0,44,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,0,0,0,0,0,0,0,0,0,208,44,0,0,75,0,0,0,76,0,0,0,44,0,0,0,1,0,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,46,48,76,102,0,0,0,0,0,0,0,96,45,0,0,77,0,0,0,78,0,0,0,44,0,0,0,2,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,40,0,0,79,0,0,0,80,0,0,0,44,0,0,0,13,0,0,0,11,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,40,0,0,81,0,0,0,82,0,0,0,44,0,0,0,14,0,0,0,12,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,118,101,99,116,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,48,36,0,0,83,0,0,0,84,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,33,0,0,85,0,0,0,86,0,0,0,44,0,0,0,9,0,0,0,15,0,0,0,10,0,0,0,16,0,0,0,11,0,0,0,1,0,0,0,17,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,33,0,0,87,0,0,0,88,0,0,0,44,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,46,0,0,0,47,0,0,0,5,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,35,0,0,89,0,0,0,90,0,0,0,44,0,0,0,49,0,0,0,50,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,0,0,0,0,8,36,0,0,91,0,0,0,92,0,0,0,44,0,0,0,51,0,0,0,52,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,116,114,117,101,0,0,0,0,116,0,0,0,114,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,102,0,0,0,97,0,0,0,108,0,0,0,115,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,109,47,37,100,47,37,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,97,32,37,98,32,37,100,32,37,72,58,37,77,58,37,83,32,37,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,97,0,0,0,32,0,0,0,37,0,0,0,98,0,0,0,32,0,0,0,37,0,0,0,100,0,0,0,32,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,108,111,99,97,108,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,0,0,0,0,0,0,0,64,32,0,0,93,0,0,0,94,0,0,0,44,0,0,0,0,0,0,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,102,97,99,101,116,69,0,0,0,80,60,0,0,40,32,0,0,40,16,0,0,0,0,0,0,0,0,0,0,208,32,0,0,93,0,0,0,95,0,0,0,44,0,0,0,18,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,12,0,0,0,19,0,0,0,13,0,0,0,20,0,0,0,14,0,0,0,5,0,0,0,21,0,0,0,6,0,0,0,0,0,0,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,119,69,69,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,48,99,116,121,112,101,95,98,97,115,101,69,0,0,0,0,40,60,0,0,176,32,0,0,176,60,0,0,152,32,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,32,0,0,2,0,0,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,99,69,69,0,0,0,0,0,0,0,176,60,0,0,240,32,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,32,0,0,2,0,0,0,0,0,0,0,160,33,0,0,93,0,0,0,96,0,0,0,44,0,0,0,3,0,0,0,4,0,0,0,7,0,0,0,53,0,0,0,54,0,0,0,8,0,0,0,55,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,99,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,50,99,111,100,101,99,118,116,95,98,97,115,101,69,0,0,40,60,0,0,128,33,0,0,176,60,0,0,88,33,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,152,33,0,0,2,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,119,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,0,176,60,0,0,192,33,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,152,33,0,0,2,0,0,0,0,0,0,0,96,34,0,0,93,0,0,0,97,0,0,0,44,0,0,0,5,0,0,0,6,0,0,0,9,0,0,0,56,0,0,0,57,0,0,0,10,0,0,0,58,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,115,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,176,60,0,0,56,34,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,152,33,0,0,2,0,0,0,0,0,0,0,216,34,0,0,93,0,0,0,98,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,59,0,0,0,60,0,0,0,12,0,0,0,61,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,105,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,176,60,0,0,176,34,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,152,33,0,0,2,0,0,0,0,0,0,0,80,35,0,0,93,0,0,0,99,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,59,0,0,0,60,0,0,0,12,0,0,0,61,0,0,0,78,83,116,51,95,95,49,49,54,95,95,110,97,114,114,111,119,95,116,111,95,117,116,102,56,73,76,106,51,50,69,69,69,0,0,0,0,0,0,0,80,60,0,0,40,35,0,0,216,34,0,0,0,0,0,0,0,0,0,0,184,35,0,0,93,0,0,0,100,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,59,0,0,0,60,0,0,0,12,0,0,0,61,0,0,0,78,83,116,51,95,95,49,49,55,95,95,119,105,100,101,110,95,102,114,111,109,95,117,116,102,56,73,76,106,51,50,69,69,69,0,0,0,0,0,0,80,60,0,0,144,35,0,0,216,34,0,0,0,0,0,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,99,69,69,0,0,0,0,80,60,0,0,200,35,0,0,64,32,0,0,0,0,0,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,119,69,69,0,0,0,0,80,60,0,0,240,35,0,0,64,32,0,0,0,0,0,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,95,95,105,109,112,69,0,0,0,80,60,0,0,24,36,0,0,64,32,0,0,0,0,0,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,99,69,69,0,0,0,0,0,80,60,0,0,64,36,0,0,64,32,0,0,0,0,0,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,119,69,69,0,0,0,0,0,80,60,0,0,104,36,0,0,64,32,0,0,0,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,48,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,95,98,97,115,101,69,0,0,0,0,40,60,0,0,176,36,0,0,176,60,0,0,144,36,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,36,0,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,49,69,69,69,0,0,0,0,0,176,60,0,0,240,36,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,36,0,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,48,69,69,69,0,0,0,0,0,176,60,0,0,48,37,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,36,0,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,49,69,69,69,0,0,0,0,0,176,60,0,0,112,37,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,36,0,0,2,0,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,57,116,105,109,101,95,98,97,115,101,69,0,0,0,0,0,0,40,60,0,0,248,37,0,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,99,69,69,0,0,0,0,0,0,0,40,60,0,0,24,38,0,0,176,60,0,0,176,37,0,0,0,0,0,0,3,0,0,0,64,32,0,0,2,0,0,0,16,38,0,0,2,0,0,0,64,38,0,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,119,69,69,0,0,0,0,0,0,0,40,60,0,0,184,38,0,0,176,60,0,0,112,38,0,0,0,0,0,0,3,0,0,0,64,32,0,0,2,0,0,0,16,38,0,0,2,0,0,0,224,38,0,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,49,48,95,95,116,105,109,101,95,112,117,116,69,0,0,0,0,40,60,0,0,88,39,0,0,176,60,0,0,16,39,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,112,39,0,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,176,60,0,0,152,39,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,112,39,0,0,0,8,0,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,99,69,69,0,0,0,0,78,83,116,51,95,95,49,49,51,109,101,115,115,97,103,101,115,95,98,97,115,101,69,0,40,60,0,0,24,40,0,0,176,60,0,0,0,40,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,48,40,0,0,2,0,0,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,119,69,69,0,0,0,0,176,60,0,0,88,40,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,48,40,0,0,2,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,99,69,69,0,0,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,103,101,116,95,98,97,115,101,69,0,0,0,0,0,0,0,0,40,60,0,0,240,40,0,0,176,60,0,0,216,40,0,0,0,0,0,0,1,0,0,0,16,41,0,0,0,0,0,0,176,60,0,0,144,40,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,24,41,0,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,119,69,69,0,0,0,176,60,0,0,152,41,0,0,0,0,0,0,1,0,0,0,16,41,0,0,0,0,0,0,176,60,0,0,80,41,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,176,41,0,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,99,69,69,0,0,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,112,117,116,95,98,97,115,101,69,0,0,0,0,0,0,0,0,40,60,0,0,72,42,0,0,176,60,0,0,48,42,0,0,0,0,0,0,1,0,0,0,104,42,0,0,0,0,0,0,176,60,0,0,232,41,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,112,42,0,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,119,69,69,0,0,0,176,60,0,0,240,42,0,0,0,0,0,0,1,0,0,0,104,42,0,0,0,0,0,0,176,60,0,0,168,42,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,8,43,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,99,69,69,0,0,0,0,0,0,0,0,40,60,0,0,136,43,0,0,176,60,0,0,64,43,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,168,43,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,119,69,69,0,0,0,0,0,0,0,0,40,60,0,0,24,44,0,0,176,60,0,0,208,43,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,56,44,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,99,69,69,0,0,0,0,0,0,0,0,40,60,0,0,168,44,0,0,176,60,0,0,96,44,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,200,44,0,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,119,69,69,0,0,0,0,0,0,0,0,40,60,0,0,56,45,0,0,176,60,0,0,240,44,0,0,0,0,0,0,2,0,0,0,64,32,0,0,2,0,0,0,88,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,77,0,0,0,0,0,0,80,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,114,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,99,0,0,0,104,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,105,0,0,0,108,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,117,0,0,0,115,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,116,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,111,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+3628);\n/* memory initializer */ allocate([74,97,110,117,97,114,121,0,70,101,98,114,117,97,114,121,0,0,0,0,0,0,0,0,77,97,114,99,104,0,0,0,65,112,114,105,108,0,0,0,77,97,121,0,0,0,0,0,74,117,110,101,0,0,0,0,74,117,108,121,0,0,0,0,65,117,103,117,115,116,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,78,111,118,101,109,98,101,114,0,0,0,0,0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,0,0,0,0,74,97,110,0,0,0,0,0,70,101,98,0,0,0,0,0,77,97,114,0,0,0,0,0,65,112,114,0,0,0,0,0,74,117,110,0,0,0,0,0,74,117,108,0,0,0,0,0,65,117,103,0,0,0,0,0,83,101,112,0,0,0,0,0,79,99,116,0,0,0,0,0,78,111,118,0,0,0,0,0,68,101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,110,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,114,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,117,0,0,0,114,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,117,110,100,97,121,0,0,77,111,110,100,97,121,0,0,84,117,101,115,100,97,121,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,0,0,0,0,70,114,105,100,97,121,0,0,83,97,116,117,114,100,97,121,0,0,0,0,0,0,0,0,83,117,110,0,0,0,0,0,77,111,110,0,0,0,0,0,84,117,101,0,0,0,0,0,87,101,100,0,0,0,0,0,84,104,117,0,0,0,0,0,70,114,105,0,0,0,0,0,83,97,116,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,59,0,0,101,0,0,0,102,0,0,0,62,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,99,97,115,116,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,40,60,0,0,120,59,0,0,83,116,56,98,97,100,95,99,97,115,116,0,0,0,0,0,80,60,0,0,144,59,0,0,0,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,80,60,0,0,176,59,0,0,136,59,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,80,60,0,0,232,59,0,0,216,59,0,0,0,0,0,0,0,0,0,0,16,60,0,0,103,0,0,0,104,0,0,0,105,0,0,0,106,0,0,0,22,0,0,0,13,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,152,60,0,0,103,0,0,0,107,0,0,0,105,0,0,0,106,0,0,0,22,0,0,0,14,0,0,0,2,0,0,0,6,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,80,60,0,0,112,60,0,0,16,60,0,0,0,0,0,0,0,0,0,0,248,60,0,0,103,0,0,0,108,0,0,0,105,0,0,0,106,0,0,0,22,0,0,0,15,0,0,0,3,0,0,0,7,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,80,60,0,0,208,60,0,0,16,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,63,0,0,109,0,0,0,110,0,0,0,63,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,80,60,0,0,40,63,0,0,0,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,110,97,110,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+13888);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  \n  function _atexit(func, arg) {\n      __ATEXIT__.unshift({ func: func, arg: arg });\n    }var ___cxa_atexit=_atexit;\n\n  function _llvm_lifetime_end() {}\n\n  \n   \n  Module[\"_memset\"] = _memset;var _llvm_memset_p0i8_i32=_memset;\n\n   \n  Module[\"_i64Subtract\"] = _i64Subtract;\n\n   \n  Module[\"_i64Add\"] = _i64Add;\n\n  \n  function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()\n      return !!__ZSt18uncaught_exceptionv.uncaught_exception;\n    }\n  \n  \n  \n  function ___cxa_is_number_type(type) {\n      var isNumber = false;\n      try { if (type == __ZTIi) isNumber = true } catch(e){}\n      try { if (type == __ZTIj) isNumber = true } catch(e){}\n      try { if (type == __ZTIl) isNumber = true } catch(e){}\n      try { if (type == __ZTIm) isNumber = true } catch(e){}\n      try { if (type == __ZTIx) isNumber = true } catch(e){}\n      try { if (type == __ZTIy) isNumber = true } catch(e){}\n      try { if (type == __ZTIf) isNumber = true } catch(e){}\n      try { if (type == __ZTId) isNumber = true } catch(e){}\n      try { if (type == __ZTIe) isNumber = true } catch(e){}\n      try { if (type == __ZTIc) isNumber = true } catch(e){}\n      try { if (type == __ZTIa) isNumber = true } catch(e){}\n      try { if (type == __ZTIh) isNumber = true } catch(e){}\n      try { if (type == __ZTIs) isNumber = true } catch(e){}\n      try { if (type == __ZTIt) isNumber = true } catch(e){}\n      return isNumber;\n    }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {\n      if (possibility == 0) return false;\n      if (possibilityType == 0 || possibilityType == definiteType)\n        return true;\n      var possibility_type_info;\n      if (___cxa_is_number_type(possibilityType)) {\n        possibility_type_info = possibilityType;\n      } else {\n        var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;\n        possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];\n      }\n      switch (possibility_type_info) {\n      case 0: // possibility is a pointer\n        // See if definite type is a pointer\n        var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;\n        var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];\n        if (definite_type_info == 0) {\n          // Also a pointer; compare base types of pointers\n          var defPointerBaseAddr = definiteType+8;\n          var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];\n          var possPointerBaseAddr = possibilityType+8;\n          var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];\n          return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility);\n        } else\n          return false; // one pointer and one non-pointer\n      case 1: // class with no base class\n        return false;\n      case 2: // class with base class\n        var parentTypeAddr = possibilityType + 8;\n        var parentType = HEAP32[((parentTypeAddr)>>2)];\n        return ___cxa_does_inherit(definiteType, parentType, possibility);\n      default:\n        return false; // some unencountered type\n      }\n    }\n  \n  \n  \n  var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) {\n      if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; }\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n  \n  var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) {\n      if (thrown == -1) thrown = ___cxa_last_thrown_exception;\n      header = thrown - ___cxa_exception_header_size;\n      if (throwntype == -1) throwntype = HEAP32[((header)>>2)];\n      var typeArray = Array.prototype.slice.call(arguments, 2);\n  \n      // If throwntype is a pointer, this means a pointer has been\n      // thrown. When a pointer is thrown, actually what's thrown\n      // is a pointer to the pointer. We'll dereference it.\n      if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {\n        var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;\n        var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];\n        if (throwntypeInfo == 0)\n          thrown = HEAP32[((thrown)>>2)];\n      }\n      // The different catch blocks are denoted by different types.\n      // Due to inheritance, those types may not precisely match the\n      // type of the thrown object. Find one which matches, and\n      // return the type of the catch block which should be called.\n      for (var i = 0; i < typeArray.length; i++) {\n        if (___cxa_does_inherit(typeArray[i], throwntype, thrown))\n          return ((asm[\"setTempRet0\"](typeArray[i]),thrown)|0);\n      }\n      // Shouldn't happen unless we have bogus data in typeArray\n      // or encounter a type for which emscripten doesn't have suitable\n      // typeinfo defined. Best-efforts match just in case.\n      return ((asm[\"setTempRet0\"](throwntype),thrown)|0);\n    }function ___cxa_throw(ptr, type, destructor) {\n      if (!___cxa_throw.initialized) {\n        try {\n          HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        try {\n          HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        try {\n          HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        ___cxa_throw.initialized = true;\n      }\n      var header = ptr - ___cxa_exception_header_size;\n      HEAP32[((header)>>2)]=type;\n      HEAP32[(((header)+(4))>>2)]=destructor;\n      ___cxa_last_thrown_exception = ptr;\n      if (!(\"uncaught_exception\" in __ZSt18uncaught_exceptionv)) {\n        __ZSt18uncaught_exceptionv.uncaught_exception = 1;\n      } else {\n        __ZSt18uncaught_exceptionv.uncaught_exception++;\n      }\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n\n  function _pthread_mutex_lock() {}\n\n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }\n\n  \n  \n  \n  function _isspace(chr) {\n      return (chr == 32) || (chr >= 9 && chr <= 13);\n    }\n  function __parseInt64(str, endptr, base, min, max, unsign) {\n      var isNegative = false;\n      // Skip space.\n      while (_isspace(HEAP8[(str)])) str++;\n  \n      // Check for a plus/minus sign.\n      if (HEAP8[(str)] == 45) {\n        str++;\n        isNegative = true;\n      } else if (HEAP8[(str)] == 43) {\n        str++;\n      }\n  \n      // Find base.\n      var ok = false;\n      var finalBase = base;\n      if (!finalBase) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            finalBase = 16;\n            str += 2;\n          } else {\n            finalBase = 8;\n            ok = true; // we saw an initial zero, perhaps the entire thing is just \"0\"\n          }\n        }\n      } else if (finalBase==16) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            str += 2;\n          }\n        }\n      }\n      if (!finalBase) finalBase = 10;\n      var start = str;\n  \n      // Get digits.\n      var chr;\n      while ((chr = HEAP8[(str)]) != 0) {\n        var digit = parseInt(String.fromCharCode(chr), finalBase);\n        if (isNaN(digit)) {\n          break;\n        } else {\n          str++;\n          ok = true;\n        }\n      }\n  \n      if (!ok) {\n        ___setErrNo(ERRNO_CODES.EINVAL);\n        return ((asm[\"setTempRet0\"](0),0)|0);\n      }\n  \n      // Set end pointer.\n      if (endptr) {\n        HEAP32[((endptr)>>2)]=str;\n      }\n  \n      try {\n        var numberString = isNegative ? '-'+Pointer_stringify(start, str - start) : Pointer_stringify(start, str - start);\n        i64Math.fromString(numberString, finalBase, min, max, unsign);\n      } catch(e) {\n        ___setErrNo(ERRNO_CODES.ERANGE); // not quite correct\n      }\n  \n      return ((asm[\"setTempRet0\"](((HEAP32[(((tempDoublePtr)+(4))>>2)])|0)),((HEAP32[((tempDoublePtr)>>2)])|0))|0);\n    }function _strtoull(str, endptr, base) {\n      return __parseInt64(str, endptr, base, 0, '18446744073709551615', true);  // ULONG_MAX.\n    }function _strtoull_l(str, endptr, base) {\n      return _strtoull(str, endptr, base); // no locale support yet\n    }\n\n  var _log=Math_log;\n\n  \n  \n  \n  \n  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {\n        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createSocket:function (family, type, protocol) {\n        var streaming = type == 1;\n        if (protocol) {\n          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp\n        }\n  \n        // create our internal socket structure\n        var sock = {\n          family: family,\n          type: type,\n          protocol: protocol,\n          server: null,\n          peers: {},\n          pending: [],\n          recv_queue: [],\n          sock_ops: SOCKFS.websocket_sock_ops\n        };\n  \n        // create the filesystem node to store the socket structure\n        var name = SOCKFS.nextname();\n        var node = FS.createNode(SOCKFS.root, name, 49152, 0);\n        node.sock = sock;\n  \n        // and the wrapping stream that enables library functions such\n        // as read and write to indirectly interact with the socket\n        var stream = FS.createStream({\n          path: name,\n          node: node,\n          flags: FS.modeStringToFlags('r+'),\n          seekable: false,\n          stream_ops: SOCKFS.stream_ops\n        });\n  \n        // map the new stream to the socket structure (sockets have a 1:1\n        // relationship with a stream)\n        sock.stream = stream;\n  \n        return sock;\n      },getSocket:function (fd) {\n        var stream = FS.getStream(fd);\n        if (!stream || !FS.isSocket(stream.node.mode)) {\n          return null;\n        }\n        return stream.node.sock;\n      },stream_ops:{poll:function (stream) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.poll(sock);\n        },ioctl:function (stream, request, varargs) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.ioctl(sock, request, varargs);\n        },read:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          var msg = sock.sock_ops.recvmsg(sock, length);\n          if (!msg) {\n            // socket is closed\n            return 0;\n          }\n          buffer.set(msg.buffer, offset);\n          return msg.buffer.length;\n        },write:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.sendmsg(sock, buffer, offset, length);\n        },close:function (stream) {\n          var sock = stream.node.sock;\n          sock.sock_ops.close(sock);\n        }},nextname:function () {\n        if (!SOCKFS.nextname.current) {\n          SOCKFS.nextname.current = 0;\n        }\n        return 'socket[' + (SOCKFS.nextname.current++) + ']';\n      },websocket_sock_ops:{createPeer:function (sock, addr, port) {\n          var ws;\n  \n          if (typeof addr === 'object') {\n            ws = addr;\n            addr = null;\n            port = null;\n          }\n  \n          if (ws) {\n            // for sockets that've already connected (e.g. we're the server)\n            // we can inspect the _socket property for the address\n            if (ws._socket) {\n              addr = ws._socket.remoteAddress;\n              port = ws._socket.remotePort;\n            }\n            // if we're just now initializing a connection to the remote,\n            // inspect the url property\n            else {\n              var result = /ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);\n              if (!result) {\n                throw new Error('WebSocket URL must be in the format ws(s)://address:port');\n              }\n              addr = result[1];\n              port = parseInt(result[2], 10);\n            }\n          } else {\n            // create the actual websocket object and connect\n            try {\n              var url = 'ws://' + addr + ':' + port;\n              // the node ws library API is slightly different than the browser's\n              var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];\n              // If node we use the ws library.\n              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];\n              ws = new WebSocket(url, opts);\n              ws.binaryType = 'arraybuffer';\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);\n            }\n          }\n  \n  \n          var peer = {\n            addr: addr,\n            port: port,\n            socket: ws,\n            dgram_send_queue: []\n          };\n  \n          SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);\n  \n          // if this is a bound dgram socket, send the port number first to allow\n          // us to override the ephemeral port reported to us by remotePort on the\n          // remote end.\n          if (sock.type === 2 && typeof sock.sport !== 'undefined') {\n            peer.dgram_send_queue.push(new Uint8Array([\n                255, 255, 255, 255,\n                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),\n                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)\n            ]));\n          }\n  \n          return peer;\n        },getPeer:function (sock, addr, port) {\n          return sock.peers[addr + ':' + port];\n        },addPeer:function (sock, peer) {\n          sock.peers[peer.addr + ':' + peer.port] = peer;\n        },removePeer:function (sock, peer) {\n          delete sock.peers[peer.addr + ':' + peer.port];\n        },handlePeerEvents:function (sock, peer) {\n          var first = true;\n  \n          var handleOpen = function () {\n            try {\n              var queued = peer.dgram_send_queue.shift();\n              while (queued) {\n                peer.socket.send(queued);\n                queued = peer.dgram_send_queue.shift();\n              }\n            } catch (e) {\n              // not much we can do here in the way of proper error handling as we've already\n              // lied and said this data was sent. shut it down.\n              peer.socket.close();\n            }\n          };\n  \n          function handleMessage(data) {\n            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer\n            data = new Uint8Array(data);  // make a typed array view on the array buffer\n  \n  \n            // if this is the port message, override the peer's port with it\n            var wasfirst = first;\n            first = false;\n            if (wasfirst &&\n                data.length === 10 &&\n                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&\n                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {\n              // update the peer's port and it's key in the peer map\n              var newport = ((data[8] << 8) | data[9]);\n              SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n              peer.port = newport;\n              SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n              return;\n            }\n  \n            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });\n          };\n  \n          if (ENVIRONMENT_IS_NODE) {\n            peer.socket.on('open', handleOpen);\n            peer.socket.on('message', function(data, flags) {\n              if (!flags.binary) {\n                return;\n              }\n              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer\n            });\n            peer.socket.on('error', function() {\n              // don't throw\n            });\n          } else {\n            peer.socket.onopen = handleOpen;\n            peer.socket.onmessage = function peer_socket_onmessage(event) {\n              handleMessage(event.data);\n            };\n          }\n        },poll:function (sock) {\n          if (sock.type === 1 && sock.server) {\n            // listen sockets should only say they're available for reading\n            // if there are pending clients.\n            return sock.pending.length ? (64 | 1) : 0;\n          }\n  \n          var mask = 0;\n          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets\n            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :\n            null;\n  \n          if (sock.recv_queue.length ||\n              !dest ||  // connection-less sockets are always ready to read\n              (dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed\n            mask |= (64 | 1);\n          }\n  \n          if (!dest ||  // connection-less sockets are always ready to write\n              (dest && dest.socket.readyState === dest.socket.OPEN)) {\n            mask |= 4;\n          }\n  \n          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {\n            mask |= 16;\n          }\n  \n          return mask;\n        },ioctl:function (sock, request, arg) {\n          switch (request) {\n            case 21531:\n              var bytes = 0;\n              if (sock.recv_queue.length) {\n                bytes = sock.recv_queue[0].data.length;\n              }\n              HEAP32[((arg)>>2)]=bytes;\n              return 0;\n            default:\n              return ERRNO_CODES.EINVAL;\n          }\n        },close:function (sock) {\n          // if we've spawned a listen server, close it\n          if (sock.server) {\n            try {\n              sock.server.close();\n            } catch (e) {\n            }\n            sock.server = null;\n          }\n          // close any peer connections\n          var peers = Object.keys(sock.peers);\n          for (var i = 0; i < peers.length; i++) {\n            var peer = sock.peers[peers[i]];\n            try {\n              peer.socket.close();\n            } catch (e) {\n            }\n            SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n          }\n          return 0;\n        },bind:function (sock, addr, port) {\n          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound\n          }\n          sock.saddr = addr;\n          sock.sport = port || _mkport();\n          // in order to emulate dgram sockets, we need to launch a listen server when\n          // binding on a connection-less socket\n          // note: this is only required on the server side\n          if (sock.type === 2) {\n            // close the existing server if it exists\n            if (sock.server) {\n              sock.server.close();\n              sock.server = null;\n            }\n            // swallow error operation not supported error that occurs when binding in the\n            // browser where this isn't supported\n            try {\n              sock.sock_ops.listen(sock, 0);\n            } catch (e) {\n              if (!(e instanceof FS.ErrnoError)) throw e;\n              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;\n            }\n          }\n        },connect:function (sock, addr, port) {\n          if (sock.server) {\n            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);\n          }\n  \n          // TODO autobind\n          // if (!sock.addr && sock.type == 2) {\n          // }\n  \n          // early out if we're already connected / in the middle of connecting\n          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {\n            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n            if (dest) {\n              if (dest.socket.readyState === dest.socket.CONNECTING) {\n                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);\n              } else {\n                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);\n              }\n            }\n          }\n  \n          // add the socket to our peer list and set our\n          // destination address / port to match\n          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n          sock.daddr = peer.addr;\n          sock.dport = peer.port;\n  \n          // always \"fail\" in non-blocking mode\n          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);\n        },listen:function (sock, backlog) {\n          if (!ENVIRONMENT_IS_NODE) {\n            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n          }\n          if (sock.server) {\n             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening\n          }\n          var WebSocketServer = require('ws').Server;\n          var host = sock.saddr;\n          sock.server = new WebSocketServer({\n            host: host,\n            port: sock.sport\n            // TODO support backlog\n          });\n  \n          sock.server.on('connection', function(ws) {\n            if (sock.type === 1) {\n              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);\n  \n              // create a peer on the new socket\n              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);\n              newsock.daddr = peer.addr;\n              newsock.dport = peer.port;\n  \n              // push to queue for accept to pick up\n              sock.pending.push(newsock);\n            } else {\n              // create a peer on the listen socket so calling sendto\n              // with the listen socket and an address will resolve\n              // to the correct client\n              SOCKFS.websocket_sock_ops.createPeer(sock, ws);\n            }\n          });\n          sock.server.on('closed', function() {\n            sock.server = null;\n          });\n          sock.server.on('error', function() {\n            // don't throw\n          });\n        },accept:function (listensock) {\n          if (!listensock.server) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          var newsock = listensock.pending.shift();\n          newsock.stream.flags = listensock.stream.flags;\n          return newsock;\n        },getname:function (sock, peer) {\n          var addr, port;\n          if (peer) {\n            if (sock.daddr === undefined || sock.dport === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            }\n            addr = sock.daddr;\n            port = sock.dport;\n          } else {\n            // TODO saddr and sport will be set for bind()'d UDP sockets, but what\n            // should we be returning for TCP sockets that've been connect()'d?\n            addr = sock.saddr || 0;\n            port = sock.sport || 0;\n          }\n          return { addr: addr, port: port };\n        },sendmsg:function (sock, buffer, offset, length, addr, port) {\n          if (sock.type === 2) {\n            // connection-less sockets will honor the message address,\n            // and otherwise fall back to the bound destination address\n            if (addr === undefined || port === undefined) {\n              addr = sock.daddr;\n              port = sock.dport;\n            }\n            // if there was no address to fall back to, error out\n            if (addr === undefined || port === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);\n            }\n          } else {\n            // connection-based sockets will only use the bound\n            addr = sock.daddr;\n            port = sock.dport;\n          }\n  \n          // find the peer for the destination address\n          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);\n  \n          // early out if not connected with a connection-based socket\n          if (sock.type === 1) {\n            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            } else if (dest.socket.readyState === dest.socket.CONNECTING) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // create a copy of the incoming data to send, as the WebSocket API\n          // doesn't work entirely with an ArrayBufferView, it'll just send\n          // the entire underlying buffer\n          var data;\n          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {\n            data = buffer.slice(offset, offset + length);\n          } else {  // ArrayBufferView\n            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);\n          }\n  \n          // if we're emulating a connection-less dgram socket and don't have\n          // a cached connection, queue the buffer to send upon connect and\n          // lie, saying the data was sent now.\n          if (sock.type === 2) {\n            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {\n              // if we're not connected, open a new connection\n              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n              }\n              dest.dgram_send_queue.push(data);\n              return length;\n            }\n          }\n  \n          try {\n            // send the actual data\n            dest.socket.send(data);\n            return length;\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n        },recvmsg:function (sock, length) {\n          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html\n          if (sock.type === 1 && sock.server) {\n            // tcp servers should not be recv()'ing on the listen socket\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n          }\n  \n          var queued = sock.recv_queue.shift();\n          if (!queued) {\n            if (sock.type === 1) {\n              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n  \n              if (!dest) {\n                // if we have a destination address but are not connected, error out\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n              }\n              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                // return null if the socket has closed\n                return null;\n              }\n              else {\n                // else, our socket is in a valid state but truly has nothing available\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n            } else {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's\n          // requeued TCP data it'll be an ArrayBufferView\n          var queuedLength = queued.data.byteLength || queued.data.length;\n          var queuedOffset = queued.data.byteOffset || 0;\n          var queuedBuffer = queued.data.buffer || queued.data;\n          var bytesRead = Math.min(length, queuedLength);\n          var res = {\n            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),\n            addr: queued.addr,\n            port: queued.port\n          };\n  \n  \n          // push back any unread data for TCP connections\n          if (sock.type === 1 && bytesRead < queuedLength) {\n            var bytesRemaining = queuedLength - bytesRead;\n            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);\n            sock.recv_queue.unshift(queued);\n          }\n  \n          return res;\n        }}};function _send(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _write(fd, buf, len);\n    }\n  \n  function _pwrite(fildes, buf, nbyte, offset) {\n      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _write(fildes, buf, nbyte) {\n      // ssize_t write(int fildes, const void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }\n  \n  function _fileno(stream) {\n      // int fileno(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) return -1;\n      return stream.fd;\n    }function _fwrite(ptr, size, nitems, stream) {\n      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html\n      var bytesToWrite = nitems * size;\n      if (bytesToWrite == 0) return 0;\n      var fd = _fileno(stream);\n      var bytesWritten = _write(fd, ptr, bytesToWrite);\n      if (bytesWritten == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return 0;\n      } else {\n        return Math.floor(bytesWritten / size);\n      }\n    }\n\n  \n  function _strtoll(str, endptr, base) {\n      return __parseInt64(str, endptr, base, '-9223372036854775808', '9223372036854775807');  // LLONG_MIN, LLONG_MAX.\n    }function _strtoll_l(str, endptr, base) {\n      return _strtoll(str, endptr, base); // no locale support yet\n    }\n\n\n  function _sysconf(name) {\n      // long sysconf(int name);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html\n      switch(name) {\n        case 30: return PAGE_SIZE;\n        case 132:\n        case 133:\n        case 12:\n        case 137:\n        case 138:\n        case 15:\n        case 235:\n        case 16:\n        case 17:\n        case 18:\n        case 19:\n        case 20:\n        case 149:\n        case 13:\n        case 10:\n        case 236:\n        case 153:\n        case 9:\n        case 21:\n        case 22:\n        case 159:\n        case 154:\n        case 14:\n        case 77:\n        case 78:\n        case 139:\n        case 80:\n        case 81:\n        case 79:\n        case 82:\n        case 68:\n        case 67:\n        case 164:\n        case 11:\n        case 29:\n        case 47:\n        case 48:\n        case 95:\n        case 52:\n        case 51:\n        case 46:\n          return 200809;\n        case 27:\n        case 246:\n        case 127:\n        case 128:\n        case 23:\n        case 24:\n        case 160:\n        case 161:\n        case 181:\n        case 182:\n        case 242:\n        case 183:\n        case 184:\n        case 243:\n        case 244:\n        case 245:\n        case 165:\n        case 178:\n        case 179:\n        case 49:\n        case 50:\n        case 168:\n        case 169:\n        case 175:\n        case 170:\n        case 171:\n        case 172:\n        case 97:\n        case 76:\n        case 32:\n        case 173:\n        case 35:\n          return -1;\n        case 176:\n        case 177:\n        case 7:\n        case 155:\n        case 8:\n        case 157:\n        case 125:\n        case 126:\n        case 92:\n        case 93:\n        case 129:\n        case 130:\n        case 131:\n        case 94:\n        case 91:\n          return 1;\n        case 74:\n        case 60:\n        case 69:\n        case 70:\n        case 4:\n          return 1024;\n        case 31:\n        case 42:\n        case 72:\n          return 32;\n        case 87:\n        case 26:\n        case 33:\n          return 2147483647;\n        case 34:\n        case 1:\n          return 47839;\n        case 38:\n        case 36:\n          return 99;\n        case 43:\n        case 37:\n          return 2048;\n        case 0: return 2097152;\n        case 3: return 65536;\n        case 28: return 32768;\n        case 44: return 32767;\n        case 75: return 16384;\n        case 39: return 1000;\n        case 89: return 700;\n        case 71: return 256;\n        case 40: return 255;\n        case 2: return 100;\n        case 180: return 64;\n        case 25: return 20;\n        case 5: return 16;\n        case 6: return 6;\n        case 73: return 4;\n        case 84: return 1;\n      }\n      ___setErrNo(ERRNO_CODES.EINVAL);\n      return -1;\n    }\n\n\n  function _pthread_cond_broadcast() {\n      return 0;\n    }\n\n  \n  \n  function __exit(status) {\n      // void _exit(int status);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html\n      Module['exit'](status);\n    }function _exit(status) {\n      __exit(status);\n    }function __ZSt9terminatev() {\n      _exit(-1234);\n    }\n\n  function _pthread_mutex_unlock() {}\n\n  \n  function _isxdigit(chr) {\n      return (chr >= 48 && chr <= 57) ||\n             (chr >= 97 && chr <= 102) ||\n             (chr >= 65 && chr <= 70);\n    }function _isxdigit_l(chr) {\n      return _isxdigit(chr); // no locale support yet\n    }\n\n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;\n\n  function _sbrk(bytes) {\n      // Implement a Linux-like 'memory area' for our 'process'.\n      // Changes the size of the memory area by |bytes|; returns the\n      // address of the previous top ('break') of the memory area\n      // We control the \"dynamic\" memory - DYNAMIC_BASE to DYNAMICTOP\n      var self = _sbrk;\n      if (!self.called) {\n        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned\n        self.called = true;\n        assert(Runtime.dynamicAlloc);\n        self.alloc = Runtime.dynamicAlloc;\n        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };\n      }\n      var ret = DYNAMICTOP;\n      if (bytes != 0) self.alloc(bytes);\n      return ret;  // Previous break location.\n    }\n\n\n  \n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;function _newlocale(mask, locale, base) {\n      return _malloc(4);\n    }\n\n   \n  Module[\"_memmove\"] = _memmove;\n\n  function ___errno_location() {\n      return ___errno_state;\n    }\n\n  var _BItoD=true;\n\n  function _catclose(catd) {\n      // int catclose (nl_catd catd)\n      return 0;\n    }\n\n  function _llvm_lifetime_start() {}\n\n  function _abort() {\n      Module['abort']();\n    }\n\n  function _fmod(x, y) {\n      return x % y;\n    }\n\n  function ___cxa_guard_release() {}\n\n  function _ungetc(c, stream) {\n      // int ungetc(int c, FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) {\n        return -1;\n      }\n      if (c === -1) {\n        // do nothing for EOF character\n        return c;\n      }\n      c = unSign(c & 0xFF);\n      stream.ungotten.push(c);\n      stream.eof = false;\n      return c;\n    }\n\n  function _uselocale(locale) {\n      return 0;\n    }\n\n  \n  \n  \n   \n  Module[\"_strlen\"] = _strlen;\n  \n  function __reallyNegative(x) {\n      return x < 0 || (x === 0 && (1/x) === -Infinity);\n    }function __formatString(format, varargs) {\n      var textIndex = format;\n      var argIndex = 0;\n      function getNextArg(type) {\n        // NOTE: Explicitly ignoring type safety. Otherwise this fails:\n        //       int x = 4; printf(\"%c\\n\", (char)x);\n        var ret;\n        if (type === 'double') {\n          ret = (HEAP32[((tempDoublePtr)>>2)]=HEAP32[(((varargs)+(argIndex))>>2)],HEAP32[(((tempDoublePtr)+(4))>>2)]=HEAP32[(((varargs)+((argIndex)+(4)))>>2)],(+(HEAPF64[(tempDoublePtr)>>3])));\n        } else if (type == 'i64') {\n          ret = [HEAP32[(((varargs)+(argIndex))>>2)],\n                 HEAP32[(((varargs)+(argIndex+4))>>2)]];\n  \n        } else {\n          type = 'i32'; // varargs are always i32, i64, or double\n          ret = HEAP32[(((varargs)+(argIndex))>>2)];\n        }\n        argIndex += Runtime.getNativeFieldSize(type);\n        return ret;\n      }\n  \n      var ret = [];\n      var curr, next, currArg;\n      while(1) {\n        var startTextIndex = textIndex;\n        curr = HEAP8[(textIndex)];\n        if (curr === 0) break;\n        next = HEAP8[((textIndex+1)|0)];\n        if (curr == 37) {\n          // Handle flags.\n          var flagAlwaysSigned = false;\n          var flagLeftAlign = false;\n          var flagAlternative = false;\n          var flagZeroPad = false;\n          var flagPadSign = false;\n          flagsLoop: while (1) {\n            switch (next) {\n              case 43:\n                flagAlwaysSigned = true;\n                break;\n              case 45:\n                flagLeftAlign = true;\n                break;\n              case 35:\n                flagAlternative = true;\n                break;\n              case 48:\n                if (flagZeroPad) {\n                  break flagsLoop;\n                } else {\n                  flagZeroPad = true;\n                  break;\n                }\n              case 32:\n                flagPadSign = true;\n                break;\n              default:\n                break flagsLoop;\n            }\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          }\n  \n          // Handle width.\n          var width = 0;\n          if (next == 42) {\n            width = getNextArg('i32');\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          } else {\n            while (next >= 48 && next <= 57) {\n              width = width * 10 + (next - 48);\n              textIndex++;\n              next = HEAP8[((textIndex+1)|0)];\n            }\n          }\n  \n          // Handle precision.\n          var precisionSet = false, precision = -1;\n          if (next == 46) {\n            precision = 0;\n            precisionSet = true;\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n            if (next == 42) {\n              precision = getNextArg('i32');\n              textIndex++;\n            } else {\n              while(1) {\n                var precisionChr = HEAP8[((textIndex+1)|0)];\n                if (precisionChr < 48 ||\n                    precisionChr > 57) break;\n                precision = precision * 10 + (precisionChr - 48);\n                textIndex++;\n              }\n            }\n            next = HEAP8[((textIndex+1)|0)];\n          }\n          if (precision < 0) {\n            precision = 6; // Standard default.\n            precisionSet = false;\n          }\n  \n          // Handle integer sizes. WARNING: These assume a 32-bit architecture!\n          var argSize;\n          switch (String.fromCharCode(next)) {\n            case 'h':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 104) {\n                textIndex++;\n                argSize = 1; // char (actually i32 in varargs)\n              } else {\n                argSize = 2; // short (actually i32 in varargs)\n              }\n              break;\n            case 'l':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 108) {\n                textIndex++;\n                argSize = 8; // long long\n              } else {\n                argSize = 4; // long\n              }\n              break;\n            case 'L': // long long\n            case 'q': // int64_t\n            case 'j': // intmax_t\n              argSize = 8;\n              break;\n            case 'z': // size_t\n            case 't': // ptrdiff_t\n            case 'I': // signed ptrdiff_t or unsigned size_t\n              argSize = 4;\n              break;\n            default:\n              argSize = null;\n          }\n          if (argSize) textIndex++;\n          next = HEAP8[((textIndex+1)|0)];\n  \n          // Handle type specifier.\n          switch (String.fromCharCode(next)) {\n            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {\n              // Integer.\n              var signed = next == 100 || next == 105;\n              argSize = argSize || 4;\n              var currArg = getNextArg('i' + (argSize * 8));\n              var origArg = currArg;\n              var argText;\n              // Flatten i64-1 [low, high] into a (slightly rounded) double\n              if (argSize == 8) {\n                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);\n              }\n              // Truncate to requested size.\n              if (argSize <= 4) {\n                var limit = Math.pow(256, argSize) - 1;\n                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);\n              }\n              // Format the number.\n              var currAbsArg = Math.abs(currArg);\n              var prefix = '';\n              if (next == 100 || next == 105) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else\n                argText = reSign(currArg, 8 * argSize, 1).toString(10);\n              } else if (next == 117) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else\n                argText = unSign(currArg, 8 * argSize, 1).toString(10);\n                currArg = Math.abs(currArg);\n              } else if (next == 111) {\n                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);\n              } else if (next == 120 || next == 88) {\n                prefix = (flagAlternative && currArg != 0) ? '0x' : '';\n                if (argSize == 8 && i64Math) {\n                  if (origArg[1]) {\n                    argText = (origArg[1]>>>0).toString(16);\n                    var lower = (origArg[0]>>>0).toString(16);\n                    while (lower.length < 8) lower = '0' + lower;\n                    argText += lower;\n                  } else {\n                    argText = (origArg[0]>>>0).toString(16);\n                  }\n                } else\n                if (currArg < 0) {\n                  // Represent negative numbers in hex as 2's complement.\n                  currArg = -currArg;\n                  argText = (currAbsArg - 1).toString(16);\n                  var buffer = [];\n                  for (var i = 0; i < argText.length; i++) {\n                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));\n                  }\n                  argText = buffer.join('');\n                  while (argText.length < argSize * 2) argText = 'f' + argText;\n                } else {\n                  argText = currAbsArg.toString(16);\n                }\n                if (next == 88) {\n                  prefix = prefix.toUpperCase();\n                  argText = argText.toUpperCase();\n                }\n              } else if (next == 112) {\n                if (currAbsArg === 0) {\n                  argText = '(nil)';\n                } else {\n                  prefix = '0x';\n                  argText = currAbsArg.toString(16);\n                }\n              }\n              if (precisionSet) {\n                while (argText.length < precision) {\n                  argText = '0' + argText;\n                }\n              }\n  \n              // Add sign if needed\n              if (currArg >= 0) {\n                if (flagAlwaysSigned) {\n                  prefix = '+' + prefix;\n                } else if (flagPadSign) {\n                  prefix = ' ' + prefix;\n                }\n              }\n  \n              // Move sign to prefix so we zero-pad after the sign\n              if (argText.charAt(0) == '-') {\n                prefix = '-' + prefix;\n                argText = argText.substr(1);\n              }\n  \n              // Add padding.\n              while (prefix.length + argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad) {\n                    argText = '0' + argText;\n                  } else {\n                    prefix = ' ' + prefix;\n                  }\n                }\n              }\n  \n              // Insert the result into the buffer.\n              argText = prefix + argText;\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {\n              // Float.\n              var currArg = getNextArg('double');\n              var argText;\n              if (isNaN(currArg)) {\n                argText = 'nan';\n                flagZeroPad = false;\n              } else if (!isFinite(currArg)) {\n                argText = (currArg < 0 ? '-' : '') + 'inf';\n                flagZeroPad = false;\n              } else {\n                var isGeneral = false;\n                var effectivePrecision = Math.min(precision, 20);\n  \n                // Convert g/G to f/F or e/E, as per:\n                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html\n                if (next == 103 || next == 71) {\n                  isGeneral = true;\n                  precision = precision || 1;\n                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);\n                  if (precision > exponent && exponent >= -4) {\n                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);\n                    precision -= exponent + 1;\n                  } else {\n                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);\n                    precision--;\n                  }\n                  effectivePrecision = Math.min(precision, 20);\n                }\n  \n                if (next == 101 || next == 69) {\n                  argText = currArg.toExponential(effectivePrecision);\n                  // Make sure the exponent has at least 2 digits.\n                  if (/[eE][-+]\\d$/.test(argText)) {\n                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);\n                  }\n                } else if (next == 102 || next == 70) {\n                  argText = currArg.toFixed(effectivePrecision);\n                  if (currArg === 0 && __reallyNegative(currArg)) {\n                    argText = '-' + argText;\n                  }\n                }\n  \n                var parts = argText.split('e');\n                if (isGeneral && !flagAlternative) {\n                  // Discard trailing zeros and periods.\n                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&\n                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {\n                    parts[0] = parts[0].slice(0, -1);\n                  }\n                } else {\n                  // Make sure we have a period in alternative mode.\n                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';\n                  // Zero pad until required precision.\n                  while (precision > effectivePrecision++) parts[0] += '0';\n                }\n                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');\n  \n                // Capitalize 'E' if needed.\n                if (next == 69) argText = argText.toUpperCase();\n  \n                // Add sign.\n                if (currArg >= 0) {\n                  if (flagAlwaysSigned) {\n                    argText = '+' + argText;\n                  } else if (flagPadSign) {\n                    argText = ' ' + argText;\n                  }\n                }\n              }\n  \n              // Add padding.\n              while (argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {\n                    argText = argText[0] + '0' + argText.slice(1);\n                  } else {\n                    argText = (flagZeroPad ? '0' : ' ') + argText;\n                  }\n                }\n              }\n  \n              // Adjust case.\n              if (next < 97) argText = argText.toUpperCase();\n  \n              // Insert the result into the buffer.\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 's': {\n              // String.\n              var arg = getNextArg('i8*');\n              var argLength = arg ? _strlen(arg) : '(null)'.length;\n              if (precisionSet) argLength = Math.min(argLength, precision);\n              if (!flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              if (arg) {\n                for (var i = 0; i < argLength; i++) {\n                  ret.push(HEAPU8[((arg++)|0)]);\n                }\n              } else {\n                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));\n              }\n              if (flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              break;\n            }\n            case 'c': {\n              // Character.\n              if (flagLeftAlign) ret.push(getNextArg('i8'));\n              while (--width > 0) {\n                ret.push(32);\n              }\n              if (!flagLeftAlign) ret.push(getNextArg('i8'));\n              break;\n            }\n            case 'n': {\n              // Write the length written so far to the next parameter.\n              var ptr = getNextArg('i32*');\n              HEAP32[((ptr)>>2)]=ret.length;\n              break;\n            }\n            case '%': {\n              // Literal percent sign.\n              ret.push(curr);\n              break;\n            }\n            default: {\n              // Unknown specifiers remain untouched.\n              for (var i = startTextIndex; i < textIndex + 2; i++) {\n                ret.push(HEAP8[(i)]);\n              }\n            }\n          }\n          textIndex += 2;\n          // TODO: Support a/A (hex float) and m (last error) specifiers.\n          // TODO: Support %1${specifier} for arg selection.\n        } else {\n          ret.push(curr);\n          textIndex += 1;\n        }\n      }\n      return ret;\n    }function _snprintf(s, n, format, varargs) {\n      // int snprintf(char *restrict s, size_t n, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var result = __formatString(format, varargs);\n      var limit = (n === undefined) ? result.length\n                                    : Math.min(result.length, Math.max(n - 1, 0));\n      if (s < 0) {\n        s = -s;\n        var buf = _malloc(limit+1);\n        HEAP32[((s)>>2)]=buf;\n        s = buf;\n      }\n      for (var i = 0; i < limit; i++) {\n        HEAP8[(((s)+(i))|0)]=result[i];\n      }\n      if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0;\n      return result.length;\n    }function _vsnprintf(s, n, format, va_arg) {\n      return _snprintf(s, n, format, HEAP32[((va_arg)>>2)]);\n    }\n\n  \n  \n  \n  function __getFloat(text) {\n      return /^[+-]?[0-9]*\\.?[0-9]+([eE][+-]?[0-9]+)?/.exec(text);\n    }function __scanString(format, get, unget, varargs) {\n      if (!__scanString.whiteSpace) {\n        __scanString.whiteSpace = {};\n        __scanString.whiteSpace[32] = 1;\n        __scanString.whiteSpace[9] = 1;\n        __scanString.whiteSpace[10] = 1;\n        __scanString.whiteSpace[11] = 1;\n        __scanString.whiteSpace[12] = 1;\n        __scanString.whiteSpace[13] = 1;\n      }\n      // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf.\n      // TODO: Support all format specifiers.\n      format = Pointer_stringify(format);\n      var soFar = 0;\n      if (format.indexOf('%n') >= 0) {\n        // need to track soFar\n        var _get = get;\n        get = function get() {\n          soFar++;\n          return _get();\n        }\n        var _unget = unget;\n        unget = function unget() {\n          soFar--;\n          return _unget();\n        }\n      }\n      var formatIndex = 0;\n      var argsi = 0;\n      var fields = 0;\n      var argIndex = 0;\n      var next;\n  \n      mainLoop:\n      for (var formatIndex = 0; formatIndex < format.length;) {\n        if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') {\n          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n          argIndex += Runtime.getAlignSize('void*', null, true);\n          HEAP32[((argPtr)>>2)]=soFar;\n          formatIndex += 2;\n          continue;\n        }\n  \n        if (format[formatIndex] === '%') {\n          var nextC = format.indexOf('c', formatIndex+1);\n          if (nextC > 0) {\n            var maxx = 1;\n            if (nextC > formatIndex+1) {\n              var sub = format.substring(formatIndex+1, nextC);\n              maxx = parseInt(sub);\n              if (maxx != sub) maxx = 0;\n            }\n            if (maxx) {\n              var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n              argIndex += Runtime.getAlignSize('void*', null, true);\n              fields++;\n              for (var i = 0; i < maxx; i++) {\n                next = get();\n                HEAP8[((argPtr++)|0)]=next;\n                if (next === 0) return i > 0 ? fields : fields-1; // we failed to read the full length of this field\n              }\n              formatIndex += nextC - formatIndex + 1;\n              continue;\n            }\n          }\n        }\n  \n        // handle %[...]\n        if (format[formatIndex] === '%' && format.indexOf('[', formatIndex+1) > 0) {\n          var match = /\\%([0-9]*)\\[(\\^)?(\\]?[^\\]]*)\\]/.exec(format.substring(formatIndex));\n          if (match) {\n            var maxNumCharacters = parseInt(match[1]) || Infinity;\n            var negateScanList = (match[2] === '^');\n            var scanList = match[3];\n  \n            // expand \"middle\" dashs into character sets\n            var middleDashMatch;\n            while ((middleDashMatch = /([^\\-])\\-([^\\-])/.exec(scanList))) {\n              var rangeStartCharCode = middleDashMatch[1].charCodeAt(0);\n              var rangeEndCharCode = middleDashMatch[2].charCodeAt(0);\n              for (var expanded = ''; rangeStartCharCode <= rangeEndCharCode; expanded += String.fromCharCode(rangeStartCharCode++));\n              scanList = scanList.replace(middleDashMatch[1] + '-' + middleDashMatch[2], expanded);\n            }\n  \n            var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n            argIndex += Runtime.getAlignSize('void*', null, true);\n            fields++;\n  \n            for (var i = 0; i < maxNumCharacters; i++) {\n              next = get();\n              if (negateScanList) {\n                if (scanList.indexOf(String.fromCharCode(next)) < 0) {\n                  HEAP8[((argPtr++)|0)]=next;\n                } else {\n                  unget();\n                  break;\n                }\n              } else {\n                if (scanList.indexOf(String.fromCharCode(next)) >= 0) {\n                  HEAP8[((argPtr++)|0)]=next;\n                } else {\n                  unget();\n                  break;\n                }\n              }\n            }\n  \n            // write out null-terminating character\n            HEAP8[((argPtr++)|0)]=0;\n            formatIndex += match[0].length;\n            \n            continue;\n          }\n        }      \n        // remove whitespace\n        while (1) {\n          next = get();\n          if (next == 0) return fields;\n          if (!(next in __scanString.whiteSpace)) break;\n        }\n        unget();\n  \n        if (format[formatIndex] === '%') {\n          formatIndex++;\n          var suppressAssignment = false;\n          if (format[formatIndex] == '*') {\n            suppressAssignment = true;\n            formatIndex++;\n          }\n          var maxSpecifierStart = formatIndex;\n          while (format[formatIndex].charCodeAt(0) >= 48 &&\n                 format[formatIndex].charCodeAt(0) <= 57) {\n            formatIndex++;\n          }\n          var max_;\n          if (formatIndex != maxSpecifierStart) {\n            max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10);\n          }\n          var long_ = false;\n          var half = false;\n          var longLong = false;\n          if (format[formatIndex] == 'l') {\n            long_ = true;\n            formatIndex++;\n            if (format[formatIndex] == 'l') {\n              longLong = true;\n              formatIndex++;\n            }\n          } else if (format[formatIndex] == 'h') {\n            half = true;\n            formatIndex++;\n          }\n          var type = format[formatIndex];\n          formatIndex++;\n          var curr = 0;\n          var buffer = [];\n          // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later\n          if (type == 'f' || type == 'e' || type == 'g' ||\n              type == 'F' || type == 'E' || type == 'G') {\n            next = get();\n            while (next > 0 && (!(next in __scanString.whiteSpace)))  {\n              buffer.push(String.fromCharCode(next));\n              next = get();\n            }\n            var m = __getFloat(buffer.join(''));\n            var last = m ? m[0].length : 0;\n            for (var i = 0; i < buffer.length - last + 1; i++) {\n              unget();\n            }\n            buffer.length = last;\n          } else {\n            next = get();\n            var first = true;\n            \n            // Strip the optional 0x prefix for %x.\n            if ((type == 'x' || type == 'X') && (next == 48)) {\n              var peek = get();\n              if (peek == 120 || peek == 88) {\n                next = get();\n              } else {\n                unget();\n              }\n            }\n            \n            while ((curr < max_ || isNaN(max_)) && next > 0) {\n              if (!(next in __scanString.whiteSpace) && // stop on whitespace\n                  (type == 's' ||\n                   ((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) ||\n                                                                     (first && next == 45))) ||\n                   ((type === 'x' || type === 'X') && (next >= 48 && next <= 57 ||\n                                     next >= 97 && next <= 102 ||\n                                     next >= 65 && next <= 70))) &&\n                  (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up\n                buffer.push(String.fromCharCode(next));\n                next = get();\n                curr++;\n                first = false;\n              } else {\n                break;\n              }\n            }\n            unget();\n          }\n          if (buffer.length === 0) return 0;  // Failure.\n          if (suppressAssignment) continue;\n  \n          var text = buffer.join('');\n          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n          argIndex += Runtime.getAlignSize('void*', null, true);\n          switch (type) {\n            case 'd': case 'u': case 'i':\n              if (half) {\n                HEAP16[((argPtr)>>1)]=parseInt(text, 10);\n              } else if (longLong) {\n                (tempI64 = [parseInt(text, 10)>>>0,(tempDouble=parseInt(text, 10),(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]);\n              } else {\n                HEAP32[((argPtr)>>2)]=parseInt(text, 10);\n              }\n              break;\n            case 'X':\n            case 'x':\n              HEAP32[((argPtr)>>2)]=parseInt(text, 16);\n              break;\n            case 'F':\n            case 'f':\n            case 'E':\n            case 'e':\n            case 'G':\n            case 'g':\n            case 'E':\n              // fallthrough intended\n              if (long_) {\n                HEAPF64[((argPtr)>>3)]=parseFloat(text);\n              } else {\n                HEAPF32[((argPtr)>>2)]=parseFloat(text);\n              }\n              break;\n            case 's':\n              var array = intArrayFromString(text);\n              for (var j = 0; j < array.length; j++) {\n                HEAP8[(((argPtr)+(j))|0)]=array[j];\n              }\n              break;\n          }\n          fields++;\n        } else if (format[formatIndex].charCodeAt(0) in __scanString.whiteSpace) {\n          next = get();\n          while (next in __scanString.whiteSpace) {\n            if (next <= 0) break mainLoop;  // End of input.\n            next = get();\n          }\n          unget(next);\n          formatIndex++;\n        } else {\n          // Not a specifier.\n          next = get();\n          if (format[formatIndex].charCodeAt(0) !== next) {\n            unget(next);\n            break mainLoop;\n          }\n          formatIndex++;\n        }\n      }\n      return fields;\n    }function _sscanf(s, format, varargs) {\n      // int sscanf(const char *restrict s, const char *restrict format, ... );\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html\n      var index = 0;\n      function get() { return HEAP8[(((s)+(index++))|0)]; };\n      function unget() { index--; };\n      return __scanString(format, get, unget, varargs);\n    }function _vsscanf(s, format, va_arg) {\n      return _sscanf(s, format, HEAP32[((va_arg)>>2)]);\n    }\n\n\n\n  \n  \n  \n  function _recv(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _read(fd, buf, len);\n    }\n  \n  function _pread(fildes, buf, nbyte, offset) {\n      // ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.read(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _read(fildes, buf, nbyte) {\n      // ssize_t read(int fildes, void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.read(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _fread(ptr, size, nitems, stream) {\n      // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html\n      var bytesToRead = nitems * size;\n      if (bytesToRead == 0) {\n        return 0;\n      }\n      var bytesRead = 0;\n      var streamObj = FS.getStreamFromPtr(stream);\n      if (!streamObj) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return 0;\n      }\n      while (streamObj.ungotten.length && bytesToRead > 0) {\n        HEAP8[((ptr++)|0)]=streamObj.ungotten.pop();\n        bytesToRead--;\n        bytesRead++;\n      }\n      var err = _read(streamObj.fd, ptr, bytesToRead);\n      if (err == -1) {\n        if (streamObj) streamObj.error = true;\n        return 0;\n      }\n      bytesRead += err;\n      if (bytesRead < bytesToRead) streamObj.eof = true;\n      return Math.floor(bytesRead / size);\n    }function _fgetc(stream) {\n      // int fgetc(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html\n      var streamObj = FS.getStreamFromPtr(stream);\n      if (!streamObj) return -1;\n      if (streamObj.eof || streamObj.error) return -1;\n      var ret = _fread(_fgetc.ret, 1, 1, stream);\n      if (ret == 0) {\n        return -1;\n      } else if (ret == -1) {\n        streamObj.error = true;\n        return -1;\n      } else {\n        return HEAPU8[((_fgetc.ret)|0)];\n      }\n    }\n\n  var _llvm_memmove_p0i8_p0i8_i32=_memmove;\n\n  \n  function _strerror_r(errnum, strerrbuf, buflen) {\n      if (errnum in ERRNO_MESSAGES) {\n        if (ERRNO_MESSAGES[errnum].length > buflen - 1) {\n          return ___setErrNo(ERRNO_CODES.ERANGE);\n        } else {\n          var msg = ERRNO_MESSAGES[errnum];\n          writeAsciiToMemory(msg, strerrbuf);\n          return 0;\n        }\n      } else {\n        return ___setErrNo(ERRNO_CODES.EINVAL);\n      }\n    }function _strerror(errnum) {\n      if (!_strerror.buffer) _strerror.buffer = _malloc(256);\n      _strerror_r(errnum, _strerror.buffer, 256);\n      return _strerror.buffer;\n    }\n\n  \n  \n  function __isLeapYear(year) {\n        return year%4 === 0 && (year%100 !== 0 || year%400 === 0);\n    }\n  \n  function __arraySum(array, index) {\n      var sum = 0;\n      for (var i = 0; i <= index; sum += array[i++]);\n      return sum;\n    }\n  \n  \n  var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];\n  \n  var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) {\n      var newDate = new Date(date.getTime());\n      while(days > 0) {\n        var leap = __isLeapYear(newDate.getFullYear());\n        var currentMonth = newDate.getMonth();\n        var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];\n  \n        if (days > daysInCurrentMonth-newDate.getDate()) {\n          // we spill over to next month\n          days -= (daysInCurrentMonth-newDate.getDate()+1);\n          newDate.setDate(1);\n          if (currentMonth < 11) {\n            newDate.setMonth(currentMonth+1)\n          } else {\n            newDate.setMonth(0);\n            newDate.setFullYear(newDate.getFullYear()+1);\n          }\n        } else {\n          // we stay in current month \n          newDate.setDate(newDate.getDate()+days);\n          return newDate;\n        }\n      }\n  \n      return newDate;\n    }function _strftime(s, maxsize, format, tm) {\n      // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html\n      \n      var date = {\n        tm_sec: HEAP32[((tm)>>2)],\n        tm_min: HEAP32[(((tm)+(4))>>2)],\n        tm_hour: HEAP32[(((tm)+(8))>>2)],\n        tm_mday: HEAP32[(((tm)+(12))>>2)],\n        tm_mon: HEAP32[(((tm)+(16))>>2)],\n        tm_year: HEAP32[(((tm)+(20))>>2)],\n        tm_wday: HEAP32[(((tm)+(24))>>2)],\n        tm_yday: HEAP32[(((tm)+(28))>>2)],\n        tm_isdst: HEAP32[(((tm)+(32))>>2)]\n      };\n  \n      var pattern = Pointer_stringify(format);\n  \n      // expand format\n      var EXPANSION_RULES_1 = {\n        '%c': '%a %b %d %H:%M:%S %Y',     // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug  3 14:02:01 2013\n        '%D': '%m/%d/%y',                 // Equivalent to %m / %d / %y\n        '%F': '%Y-%m-%d',                 // Equivalent to %Y - %m - %d\n        '%h': '%b',                       // Equivalent to %b\n        '%r': '%I:%M:%S %p',              // Replaced by the time in a.m. and p.m. notation\n        '%R': '%H:%M',                    // Replaced by the time in 24-hour notation\n        '%T': '%H:%M:%S',                 // Replaced by the time\n        '%x': '%m/%d/%y',                 // Replaced by the locale's appropriate date representation\n        '%X': '%H:%M:%S',                 // Replaced by the locale's appropriate date representation\n      };\n      for (var rule in EXPANSION_RULES_1) {\n        pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);\n      }\n  \n      var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n      var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n  \n      function leadingSomething(value, digits, character) {\n        var str = typeof value === 'number' ? value.toString() : (value || '');\n        while (str.length < digits) {\n          str = character[0]+str;\n        }\n        return str;\n      };\n  \n      function leadingNulls(value, digits) {\n        return leadingSomething(value, digits, '0');\n      };\n  \n      function compareByDay(date1, date2) {\n        function sgn(value) {\n          return value < 0 ? -1 : (value > 0 ? 1 : 0);\n        };\n  \n        var compare;\n        if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) {\n          if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) {\n            compare = sgn(date1.getDate()-date2.getDate());\n          }\n        }\n        return compare;\n      };\n  \n      function getFirstWeekStartDate(janFourth) {\n          switch (janFourth.getDay()) {\n            case 0: // Sunday\n              return new Date(janFourth.getFullYear()-1, 11, 29);\n            case 1: // Monday\n              return janFourth;\n            case 2: // Tuesday\n              return new Date(janFourth.getFullYear(), 0, 3);\n            case 3: // Wednesday\n              return new Date(janFourth.getFullYear(), 0, 2);\n            case 4: // Thursday\n              return new Date(janFourth.getFullYear(), 0, 1);\n            case 5: // Friday\n              return new Date(janFourth.getFullYear()-1, 11, 31);\n            case 6: // Saturday\n              return new Date(janFourth.getFullYear()-1, 11, 30);\n          }\n      };\n  \n      function getWeekBasedYear(date) {\n          var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);\n  \n          var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);\n          var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4);\n  \n          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n  \n          if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {\n            // this date is after the start of the first week of this year\n            if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {\n              return thisDate.getFullYear()+1;\n            } else {\n              return thisDate.getFullYear();\n            }\n          } else { \n            return thisDate.getFullYear()-1;\n          }\n      };\n  \n      var EXPANSION_RULES_2 = {\n        '%a': function(date) {\n          return WEEKDAYS[date.tm_wday].substring(0,3);\n        },\n        '%A': function(date) {\n          return WEEKDAYS[date.tm_wday];\n        },\n        '%b': function(date) {\n          return MONTHS[date.tm_mon].substring(0,3);\n        },\n        '%B': function(date) {\n          return MONTHS[date.tm_mon];\n        },\n        '%C': function(date) {\n          var year = date.tm_year+1900;\n          return leadingNulls(Math.floor(year/100),2);\n        },\n        '%d': function(date) {\n          return leadingNulls(date.tm_mday, 2);\n        },\n        '%e': function(date) {\n          return leadingSomething(date.tm_mday, 2, ' ');\n        },\n        '%g': function(date) {\n          // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. \n          // In this system, weeks begin on a Monday and week 1 of the year is the week that includes \n          // January 4th, which is also the week that includes the first Thursday of the year, and \n          // is also the first week that contains at least four days in the year. \n          // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of \n          // the last week of the preceding year; thus, for Saturday 2nd January 1999, \n          // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, \n          // or 31st is a Monday, it and any following days are part of week 1 of the following year. \n          // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01.\n          \n          return getWeekBasedYear(date).toString().substring(2);\n        },\n        '%G': function(date) {\n          return getWeekBasedYear(date);\n        },\n        '%H': function(date) {\n          return leadingNulls(date.tm_hour, 2);\n        },\n        '%I': function(date) {\n          return leadingNulls(date.tm_hour < 13 ? date.tm_hour : date.tm_hour-12, 2);\n        },\n        '%j': function(date) {\n          // Day of the year (001-366)\n          return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3);\n        },\n        '%m': function(date) {\n          return leadingNulls(date.tm_mon+1, 2);\n        },\n        '%M': function(date) {\n          return leadingNulls(date.tm_min, 2);\n        },\n        '%n': function() {\n          return '\\n';\n        },\n        '%p': function(date) {\n          if (date.tm_hour > 0 && date.tm_hour < 13) {\n            return 'AM';\n          } else {\n            return 'PM';\n          }\n        },\n        '%S': function(date) {\n          return leadingNulls(date.tm_sec, 2);\n        },\n        '%t': function() {\n          return '\\t';\n        },\n        '%u': function(date) {\n          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);\n          return day.getDay() || 7;\n        },\n        '%U': function(date) {\n          // Replaced by the week number of the year as a decimal number [00,53]. \n          // The first Sunday of January is the first day of week 1; \n          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]\n          var janFirst = new Date(date.tm_year+1900, 0, 1);\n          var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay());\n          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);\n          \n          // is target date after the first Sunday?\n          if (compareByDay(firstSunday, endDate) < 0) {\n            // calculate difference in days between first Sunday and endDate\n            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;\n            var firstSundayUntilEndJanuary = 31-firstSunday.getDate();\n            var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();\n            return leadingNulls(Math.ceil(days/7), 2);\n          }\n  \n          return compareByDay(firstSunday, janFirst) === 0 ? '01': '00';\n        },\n        '%V': function(date) {\n          // Replaced by the week number of the year (Monday as the first day of the week) \n          // as a decimal number [01,53]. If the week containing 1 January has four \n          // or more days in the new year, then it is considered week 1. \n          // Otherwise, it is the last week of the previous year, and the next week is week 1. \n          // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday]\n          var janFourthThisYear = new Date(date.tm_year+1900, 0, 4);\n          var janFourthNextYear = new Date(date.tm_year+1901, 0, 4);\n  \n          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n  \n          var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);\n  \n          if (compareByDay(endDate, firstWeekStartThisYear) < 0) {\n            // if given date is before this years first week, then it belongs to the 53rd week of last year\n            return '53';\n          } \n  \n          if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {\n            // if given date is after next years first week, then it belongs to the 01th week of next year\n            return '01';\n          }\n  \n          // given date is in between CW 01..53 of this calendar year\n          var daysDifference;\n          if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) {\n            // first CW of this year starts last year\n            daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate()\n          } else {\n            // first CW of this year starts this year\n            daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate();\n          }\n          return leadingNulls(Math.ceil(daysDifference/7), 2);\n        },\n        '%w': function(date) {\n          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);\n          return day.getDay();\n        },\n        '%W': function(date) {\n          // Replaced by the week number of the year as a decimal number [00,53]. \n          // The first Monday of January is the first day of week 1; \n          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]\n          var janFirst = new Date(date.tm_year, 0, 1);\n          var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1);\n          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);\n  \n          // is target date after the first Monday?\n          if (compareByDay(firstMonday, endDate) < 0) {\n            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;\n            var firstMondayUntilEndJanuary = 31-firstMonday.getDate();\n            var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();\n            return leadingNulls(Math.ceil(days/7), 2);\n          }\n          return compareByDay(firstMonday, janFirst) === 0 ? '01': '00';\n        },\n        '%y': function(date) {\n          // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year]\n          return (date.tm_year+1900).toString().substring(2);\n        },\n        '%Y': function(date) {\n          // Replaced by the year as a decimal number (for example, 1997). [ tm_year]\n          return date.tm_year+1900;\n        },\n        '%z': function(date) {\n          // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ),\n          // or by no characters if no timezone is determinable. \n          // For example, \"-0430\" means 4 hours 30 minutes behind UTC (west of Greenwich). \n          // If tm_isdst is zero, the standard time offset is used. \n          // If tm_isdst is greater than zero, the daylight savings time offset is used. \n          // If tm_isdst is negative, no characters are returned. \n          // FIXME: we cannot determine time zone (or can we?)\n          return '';\n        },\n        '%Z': function(date) {\n          // Replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. [ tm_isdst]\n          // FIXME: we cannot determine time zone (or can we?)\n          return '';\n        },\n        '%%': function() {\n          return '%';\n        }\n      };\n      for (var rule in EXPANSION_RULES_2) {\n        if (pattern.indexOf(rule) >= 0) {\n          pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));\n        }\n      }\n  \n      var bytes = intArrayFromString(pattern, false);\n      if (bytes.length > maxsize) {\n        return 0;\n      } \n  \n      writeArrayToMemory(bytes, s);\n      return bytes.length-1;\n    }function _strftime_l(s, maxsize, format, tm) {\n      return _strftime(s, maxsize, format, tm); // no locale support yet\n    }\n\n  var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;\n\n\n  function _pthread_cond_wait() {\n      return 0;\n    }\n\n  \n  function _isdigit(chr) {\n      return chr >= 48 && chr <= 57;\n    }function _isdigit_l(chr) {\n      return _isdigit(chr); // no locale support yet\n    }\n\n  var _fabs=Math_abs;\n\n  var _floor=Math_floor;\n\n  var _getc=_fgetc;\n\n  var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  function ___ctype_b_loc() {\n      // http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/baselib---ctype-b-loc.html\n      var me = ___ctype_b_loc;\n      if (!me.ret) {\n        var values = [\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,8195,8194,8194,8194,8194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,24577,49156,49156,49156,\n          49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,55304,55304,55304,55304,55304,55304,55304,55304,\n          55304,55304,49156,49156,49156,49156,49156,49156,49156,54536,54536,54536,54536,54536,54536,50440,50440,50440,50440,50440,\n          50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,49156,49156,49156,49156,49156,\n          49156,54792,54792,54792,54792,54792,54792,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,\n          50696,50696,50696,50696,50696,50696,50696,49156,49156,49156,49156,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n        ];\n        var i16size = 2;\n        var arr = _malloc(values.length * i16size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP16[(((arr)+(i * i16size))>>1)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i16size], 'i16*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  \n  function _free() {\n  }\n  Module[\"_free\"] = _free;function _freelocale(locale) {\n      _free(locale);\n    }\n\n  function ___cxa_allocate_exception(size) {\n      var ptr = _malloc(size + ___cxa_exception_header_size);\n      return ptr + ___cxa_exception_header_size;\n    }\n\n  var _fmodl=_fmod;\n\n  function _catopen(name, oflag) {\n      // nl_catd catopen (const char *name, int oflag)\n      return -1;\n    }\n\n  function _catgets(catd, set_id, msg_id, s) {\n      // char *catgets (nl_catd catd, int set_id, int msg_id, const char *s)\n      return s;\n    }\n\n  \n  \n  function _sprintf(s, format, varargs) {\n      // int sprintf(char *restrict s, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      return _snprintf(s, undefined, format, varargs);\n    }function _asprintf(s, format, varargs) {\n      return _sprintf(-s, format, varargs);\n    }function _vasprintf(s, format, va_arg) {\n      return _asprintf(s, format, HEAP32[((va_arg)>>2)]);\n    }\n\n  var ctlz_i8 = allocate([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], \"i8\", ALLOC_STATIC); \n  Module[\"_llvm_ctlz_i32\"] = _llvm_ctlz_i32;\n\n  function _time(ptr) {\n      var ret = Math.floor(Date.now()/1000);\n      if (ptr) {\n        HEAP32[((ptr)>>2)]=ret;\n      }\n      return ret;\n    }\n\n  function _copysign(a, b) {\n      return __reallyNegative(a) === __reallyNegative(b) ? a : -a;\n    }\n\n  function ___ctype_toupper_loc() {\n      // http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/libutil---ctype-toupper-loc.html\n      var me = ___ctype_toupper_loc;\n      if (!me.ret) {\n        var values = [\n          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,\n          158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n          188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,\n          218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,\n          248,249,250,251,252,253,254,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n          33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,\n          73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,\n          81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,\n          145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,\n          175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,\n          205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,\n          235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255\n        ];\n        var i32size = 4;\n        var arr = _malloc(values.length * i32size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP32[(((arr)+(i * i32size))>>2)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i32size], 'i32*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function ___cxa_guard_acquire(variable) {\n      if (!HEAP8[(variable)]) { // ignore SAFE_HEAP stuff because llvm mixes i64 and i8 here\n        HEAP8[(variable)]=1;\n        return 1;\n      }\n      return 0;\n    }\n\n  function ___ctype_tolower_loc() {\n      // http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/libutil---ctype-tolower-loc.html\n      var me = ___ctype_tolower_loc;\n      if (!me.ret) {\n        var values = [\n          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,\n          158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n          188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,\n          218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,\n          248,249,250,251,252,253,254,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n          33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,100,101,102,103,\n          104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,96,97,98,99,100,101,102,103,\n          104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,\n          134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,\n          164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,\n          194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,\n          224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,\n          254,255\n        ];\n        var i32size = 4;\n        var arr = _malloc(values.length * i32size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP32[(((arr)+(i * i32size))>>2)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i32size], 'i32*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  \n  var ___cxa_caught_exceptions=[];function ___cxa_begin_catch(ptr) {\n      __ZSt18uncaught_exceptionv.uncaught_exception--;\n      ___cxa_caught_exceptions.push(___cxa_last_thrown_exception);\n      return ptr;\n    }\n\n   \n  Module[\"_bitshift64Shl\"] = _bitshift64Shl;\n\n\n  function __ZNSt9exceptionD2Ev() {}\n\n  var _copysignl=_copysign;\n\n  var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], \"i8\", ALLOC_STATIC)+8, 0], \"i32\", ALLOC_STATIC);\n\n  var ___dso_handle=allocate(1, \"i32*\", ALLOC_STATIC);\n\n\n\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\n__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });\n_fgetc.ret = allocate([0], \"i8\", ALLOC_STATIC);\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], \"i8\", ALLOC_DYNAMIC);\n\nvar Math_min = Math.min;\nfunction invoke_iiii(index,a1,a2,a3) {\n  try {\n    return Module[\"dynCall_iiii\"](index,a1,a2,a3);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {\n  try {\n    Module[\"dynCall_viiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiii(index,a1,a2,a3,a4,a5) {\n  try {\n    Module[\"dynCall_viiiii\"](index,a1,a2,a3,a4,a5);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_vi(index,a1) {\n  try {\n    Module[\"dynCall_vi\"](index,a1);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_vii(index,a1,a2) {\n  try {\n    Module[\"dynCall_vii\"](index,a1,a2);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {\n  try {\n    Module[\"dynCall_viiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_ii(index,a1) {\n  try {\n    return Module[\"dynCall_ii\"](index,a1);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiid(index,a1,a2,a3,a4,a5,a6,a7) {\n  try {\n    Module[\"dynCall_viiiiiid\"](index,a1,a2,a3,a4,a5,a6,a7);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viii(index,a1,a2,a3) {\n  try {\n    Module[\"dynCall_viii\"](index,a1,a2,a3);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiid(index,a1,a2,a3,a4,a5,a6) {\n  try {\n    Module[\"dynCall_viiiiid\"](index,a1,a2,a3,a4,a5,a6);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_v(index) {\n  try {\n    Module[\"dynCall_v\"](index);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {\n  try {\n    return Module[\"dynCall_iiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiii(index,a1,a2,a3,a4) {\n  try {\n    return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {\n  try {\n    Module[\"dynCall_viiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {\n  try {\n    Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iii(index,a1,a2) {\n  try {\n    return Module[\"dynCall_iii\"](index,a1,a2);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiiii(index,a1,a2,a3,a4,a5) {\n  try {\n    return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiii(index,a1,a2,a3,a4) {\n  try {\n    Module[\"dynCall_viiii\"](index,a1,a2,a3,a4);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=env.__ZTISt9exception|0;var p=env.___dso_handle|0;var q=env._stderr|0;var r=env._stdin|0;var s=env._stdout|0;var t=0;var u=0;var v=0;var w=0;var x=+env.NaN,y=+env.Infinity;var z=0,A=0,B=0,C=0,D=0.0,E=0,F=0,G=0,H=0.0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=0;var S=global.Math.floor;var T=global.Math.abs;var U=global.Math.sqrt;var V=global.Math.pow;var W=global.Math.cos;var X=global.Math.sin;var Y=global.Math.tan;var Z=global.Math.acos;var _=global.Math.asin;var $=global.Math.atan;var aa=global.Math.atan2;var ba=global.Math.exp;var ca=global.Math.log;var da=global.Math.ceil;var ea=global.Math.imul;var fa=env.abort;var ga=env.assert;var ha=env.asmPrintInt;var ia=env.asmPrintFloat;var ja=env.min;var ka=env.invoke_iiii;var la=env.invoke_viiiiiii;var ma=env.invoke_viiiii;var na=env.invoke_vi;var oa=env.invoke_vii;var pa=env.invoke_viiiiiiiii;var qa=env.invoke_ii;var ra=env.invoke_viiiiiid;var sa=env.invoke_viii;var ta=env.invoke_viiiiid;var ua=env.invoke_v;var va=env.invoke_iiiiiiiii;var wa=env.invoke_iiiii;var xa=env.invoke_viiiiiiii;var ya=env.invoke_viiiiii;var za=env.invoke_iii;var Aa=env.invoke_iiiiii;var Ba=env.invoke_viiii;var Ca=env._fabs;var Da=env._pthread_cond_wait;var Ea=env._llvm_lifetime_start;var Fa=env._sprintf;var Ga=env._send;var Ha=env._strtoll_l;var Ia=env._vsscanf;var Ja=env.___ctype_b_loc;var Ka=env.__ZSt9terminatev;var La=env._fmod;var Ma=env.___cxa_guard_acquire;var Na=env._isspace;var Oa=env.__reallyNegative;var Pa=env.___cxa_is_number_type;var Qa=env._ungetc;var Ra=env._fread;var Sa=env.__getFloat;var Ta=env.___cxa_allocate_exception;var Ua=env.__ZSt18uncaught_exceptionv;var Va=env._floor;var Wa=env._isxdigit_l;var Xa=env._strtoll;var Ya=env._fflush;var Za=env.___cxa_guard_release;var _a=env.__addDays;var $a=env._pwrite;var ab=env._strerror_r;var bb=env._strftime_l;var cb=env._pthread_mutex_lock;var db=env._sscanf;var eb=env._sbrk;var fb=env._uselocale;var gb=env._catgets;var hb=env._newlocale;var ib=env._snprintf;var jb=env.___cxa_begin_catch;var kb=env._emscripten_memcpy_big;var lb=env._asprintf;var mb=env.__scanString;var nb=env.___resumeException;var ob=env.___cxa_find_matching_catch;var pb=env.__exit;var qb=env._strtoull;var rb=env._strftime;var sb=env._strtoull_l;var tb=env._freelocale;var ub=env.__arraySum;var vb=env.__formatString;var wb=env.___ctype_tolower_loc;var xb=env._isdigit_l;var yb=env._fileno;var zb=env._pthread_mutex_unlock;var Ab=env._pread;var Bb=env._isxdigit;var Cb=env.___ctype_toupper_loc;var Db=env._log;var Eb=env._vasprintf;var Fb=env._write;var Gb=env.__isLeapYear;var Hb=env.___errno_location;var Ib=env._recv;var Jb=env._vsnprintf;var Kb=env.__ZNSt9exceptionD2Ev;var Lb=env._copysign;var Mb=env._fgetc;var Nb=env._mkport;var Ob=env.___cxa_does_inherit;var Pb=env._sysconf;var Qb=env._pthread_cond_broadcast;var Rb=env.__parseInt64;var Sb=env._abort;var Tb=env._catclose;var Ub=env._fwrite;var Vb=env.___cxa_throw;var Wb=env._isdigit;var Xb=env._strerror;var Yb=env._llvm_lifetime_end;var Zb=env._atexit;var _b=env._catopen;var $b=env._exit;var ac=env._time;var bc=env._read;var cc=env.___setErrNo;var dc=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction wc(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function xc(){return i|0}function yc(a){a=a|0;i=a}function zc(a,b){a=a|0;b=b|0;if((t|0)==0){t=a;u=b}}function Ac(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function Bc(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function Cc(a){a=a|0;I=a}function Dc(a){a=a|0;J=a}function Ec(a){a=a|0;K=a}function Fc(a){a=a|0;L=a}function Gc(a){a=a|0;M=a}function Hc(a){a=a|0;N=a}function Ic(a){a=a|0;O=a}function Jc(a){a=a|0;P=a}function Kc(a){a=a|0;Q=a}function Lc(a){a=a|0;R=a}function Mc(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]|0;if((d|0)==0){i=b;return}e=a+4|0;a=c[e>>2]|0;if((a|0)!=(d|0)){c[e>>2]=a+(~((a+ -8+(0-d)|0)>>>3)<<3)}Om(d);i=b;return}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0;c=i;i=i+8|0;d=c;e=a;f=b-e|0;g=f>>3;do{if((g|0)==0){j=0;k=0}else{if(g>>>0>536870911){Oj(0)}l=Mm(f)|0;if((a|0)==(b|0)){j=l;k=l;break}m=b+ -8+(0-e)|0;n=a;o=l;while(1){if((o|0)!=0){h[o>>3]=+h[n>>3]}p=n+8|0;if((p|0)==(b|0)){break}else{n=p;o=o+8|0}}j=l+((m>>>3)+1<<3)|0;k=l}}while(0);md(k,j,d);a:do{if((k|0)!=(j|0)){d=k;while(1){b=d+8|0;if((b|0)==(j|0)){break a}if(+h[d>>3]==+h[b>>3]){break}else{d=b}}if((d|0)==(j|0)){break}l=d;m=d+8|0;while(1){b=m;do{b=b+8|0;if((b|0)==(j|0)){break a}q=+h[b>>3];}while(+h[l>>3]==q);a=l+8|0;h[a>>3]=q;l=a;m=b}}}while(0);if((k|0)==0){i=c;return}Om(k);i=c;return}function Oc(a){a=a|0;jb(a|0)|0;Ka()}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0;c=i;i=i+8|0;d=c;e=a;f=b-e|0;g=f>>3;do{if((g|0)==0){j=0;k=0}else{if(g>>>0>536870911){Oj(0)}l=Mm(f)|0;if((a|0)==(b|0)){j=l;k=l;break}m=b+ -8+(0-e)|0;n=a;o=l;while(1){if((o|0)!=0){h[o>>3]=+h[n>>3]}p=n+8|0;if((p|0)==(b|0)){break}else{n=p;o=o+8|0}}j=l;k=l+((m>>>3)+1<<3)|0}}while(0);md(j,k,d);a:do{if((j|0)!=(k|0)){d=j+8|0;if((d|0)==(k|0)){break}q=+h[j>>3];b=j;a=d;while(1){r=+h[a>>3];if(q==r){break}d=a+8|0;if((d|0)==(k|0)){break a}else{e=a;a=d;b=e;q=r}}if((b|0)==(k|0)){break}a=b+16|0;if((a|0)==(k|0)){break}q=+h[b>>3];m=b;l=a;while(1){r=+h[l>>3];if(q==r){s=q;t=m}else{a=m+8|0;h[a>>3]=r;s=r;t=a}a=l+8|0;if((a|0)==(k|0)){break}else{q=s;m=t;l=a}}}}while(0);if((j|0)==0){i=c;return}Om(j);i=c;return}function Qc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=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,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;e=i;i=i+120|0;f=e;g=e+8|0;j=e+16|0;k=e+24|0;l=e+32|0;m=e+40|0;n=e+48|0;o=e+56|0;p=e+64|0;q=e+72|0;r=e+80|0;s=e+88|0;t=e+112|0;u=d;v=u-b>>3;w=s;x=s;c[x+0>>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;do{if((v|0)==0){y=s+16|0;z=s+8|0;A=s+4|0;B=0;C=0;D=0;E=0;F=0}else{x=s+8|0;G=s+4|0;H=s+16|0;I=s+20|0;hd(s,v);J=c[I>>2]|0;K=c[H>>2]|0;L=c[G>>2]|0;M=c[x>>2]|0;N=J+K|0;O=L+(N>>>9<<2)|0;if((M|0)==(L|0)){P=v;Q=O;R=0}else{P=v;Q=O;R=(c[O>>2]|0)+((N&511)<<3)|0}while(1){if((R|0)!=0){h[R>>3]=0.0}N=P+ -1|0;O=R+8|0;if((O-(c[Q>>2]|0)|0)==4096){S=Q+4|0;T=c[S>>2]|0;U=S}else{T=O;U=Q}if((N|0)==0){break}else{P=N;Q=U;R=T}}c[I>>2]=J+v;N=L+(K>>>9<<2)|0;if((M|0)==(L|0)){y=H;z=x;A=G;B=N;C=K;D=L;E=M;F=0;break}y=H;z=x;A=G;B=N;C=K;D=L;E=M;F=(c[N>>2]|0)+((K&511)<<3)|0}}while(0);if((b|0)==(d|0)){V=E;W=D;X=C}else{C=b;b=F;D=B;B=F;while(1){F=(c[D>>2]|0)+4096-B>>3;E=C;v=u-E>>3;if((v|0)>(F|0)){Y=C+(F<<3)|0;Z=F}else{Y=d;Z=v}gn(B|0,C|0,Y-E|0)|0;do{if((Z|0)==0){_=b;$=D;aa=B}else{E=(b-(c[D>>2]|0)>>3)+Z|0;if((E|0)>0){v=D+(((E|0)/512|0)<<2)|0;F=(c[v>>2]|0)+(((E|0)%512|0)<<3)|0;_=F;$=v;aa=F;break}else{F=511-E|0;E=D+(((F|0)/-512|0)<<2)|0;v=(c[E>>2]|0)+(511-((F|0)%512|0)<<3)|0;_=v;$=E;aa=v;break}}}while(0);if((Y|0)==(d|0)){break}else{C=Y;b=_;D=$;B=aa}}V=c[z>>2]|0;W=c[A>>2]|0;X=c[y>>2]|0}aa=W+(X>>>9<<2)|0;if((V|0)==(W|0)){ba=0;ca=0}else{ba=0;ca=(c[aa>>2]|0)+((X&511)<<3)|0}B=s+20|0;s=X+(c[B>>2]|0)|0;X=W+(s>>>9<<2)|0;if((V|0)==(W|0)){da=0;ea=0}else{da=0;ea=(c[X>>2]|0)+((s&511)<<3)|0}s=n;W=m;c[W>>2]=ba|aa;c[W+4>>2]=ca;ca=n;c[ca>>2]=da|X;c[ca+4>>2]=ea;ea=l;ca=m;c[ea+0>>2]=c[ca+0>>2];c[ea+4>>2]=c[ca+4>>2];ca=k;ea=s;c[ca+0>>2]=c[ea+0>>2];c[ca+4>>2]=c[ea+4>>2];cd(l,k,o);o=c[A>>2]|0;A=c[y>>2]|0;y=o+(A>>>9<<2)|0;if((c[z>>2]|0)==(o|0)){fa=o+((A+(c[B>>2]|0)|0)>>>9<<2)|0;ga=0;ha=0;ia=0;ja=0;ka=p;la=q;ma=r;na=p;oa=q;pa=y;qa=ga|pa;ra=p;sa=ra;c[sa>>2]=qa;ta=ra+4|0;ua=ta;c[ua>>2]=ha;va=fa;wa=ia|va;xa=q;ya=xa;c[ya>>2]=wa;za=xa+4|0;Aa=za;c[Aa>>2]=ja;Ba=j;Ca=j;Da=na;c[Ca+0>>2]=c[Da+0>>2];c[Ca+4>>2]=c[Da+4>>2];Ea=g;Fa=g;Ga=oa;c[Fa+0>>2]=c[Ga+0>>2];c[Fa+4>>2]=c[Ga+4>>2];Ha=f;Ia=f;Ja=r;a[Ia+0|0]=a[Ja+0|0]|0;bd(t,j,g,f);Ka=f;La=g;Ma=j;gd(w);i=e;return}else{z=A+(c[B>>2]|0)|0;B=o+(z>>>9<<2)|0;fa=B;ga=0;ha=(c[y>>2]|0)+((A&511)<<3)|0;ia=0;ja=(c[B>>2]|0)+((z&511)<<3)|0;ka=p;la=q;ma=r;na=p;oa=q;pa=y;qa=ga|pa;ra=p;sa=ra;c[sa>>2]=qa;ta=ra+4|0;ua=ta;c[ua>>2]=ha;va=fa;wa=ia|va;xa=q;ya=xa;c[ya>>2]=wa;za=xa+4|0;Aa=za;c[Aa>>2]=ja;Ba=j;Ca=j;Da=na;c[Ca+0>>2]=c[Da+0>>2];c[Ca+4>>2]=c[Da+4>>2];Ea=g;Fa=g;Ga=oa;c[Fa+0>>2]=c[Ga+0>>2];c[Fa+4>>2]=c[Ga+4>>2];Ha=f;Ia=f;Ja=r;a[Ia+0|0]=a[Ja+0|0]|0;bd(t,j,g,f);Ka=f;La=g;Ma=j;gd(w);i=e;return}}function Rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=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.0,z=0,A=0;d=i;i=i+64|0;e=d;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+40|0;m=d+48|0;n=m;o=m;c[n>>2]=o;p=m+4|0;c[p>>2]=o;q=m+8|0;c[q>>2]=0;if((a|0)==(b|0)){r=0;s=o}else{m=a;a=0;t=o;while(1){u=Mm(16)|0;v=u;h[u+8>>3]=+h[m>>3];c[t+4>>2]=v;c[u>>2]=c[n>>2];c[n>>2]=v;c[u+4>>2]=o;w=a+1|0;c[q>>2]=w;u=m+8|0;if((u|0)==(b|0)){break}else{t=v;a=w;m=u}}r=w;s=c[p>>2]|0}c[g>>2]=s;c[j>>2]=o;s=f;w=g;c[s+0>>2]=c[w+0>>2];w=e;s=j;c[w+0>>2]=c[s+0>>2];ad(k,f,e,r,l);l=c[p>>2]|0;if((l|0)!=(o|0)){r=l;while(1){l=c[r+4>>2]|0;a:do{if((l|0)==(o|0)){x=o}else{y=+h[r+8>>3];e=l;while(1){if(!(y==+h[e+8>>3])){x=e;break a}f=c[e+4>>2]|0;if((f|0)==(o|0)){x=o;break}else{e=f}}}}while(0);if((l|0)==(x|0)){z=l}else{e=(c[x>>2]|0)+4|0;f=l;c[(c[f>>2]|0)+4>>2]=c[e>>2];c[c[e>>2]>>2]=c[f>>2];f=l;while(1){e=c[f+4>>2]|0;c[q>>2]=(c[q>>2]|0)+ -1;Om(f);if((e|0)==(x|0)){z=x;break}else{f=e}}}if((z|0)==(o|0)){break}else{r=z}}}if((c[q>>2]|0)==0){i=d;return}z=c[p>>2]|0;p=(c[n>>2]|0)+4|0;n=z;c[(c[n>>2]|0)+4>>2]=c[p>>2];c[c[p>>2]>>2]=c[n>>2];c[q>>2]=0;if((z|0)==(o|0)){i=d;return}else{A=z}while(1){z=c[A+4>>2]|0;Om(A);if((z|0)==(o|0)){break}else{A=z}}i=d;return}function Sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=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;d=i;i=i+40|0;e=d;f=d+8|0;g=d+16|0;j=d+24|0;k=j;l=j+4|0;c[l>>2]=0;m=j+8|0;c[m>>2]=0;n=j+4|0;o=j;c[o>>2]=n;if((a|0)==(b|0)){p=0;Yc(k,p);i=d;return}j=g;q=a;do{c[j>>2]=n;a=e;r=g;c[a+0>>2]=c[r+0>>2];r=$c(k,e,f,q)|0;if((c[r>>2]|0)==0){a=Mm(24)|0;h[a+16>>3]=+h[q>>3];s=c[f>>2]|0;t=a;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=s;c[r>>2]=t;s=c[c[o>>2]>>2]|0;if((s|0)==0){u=t}else{c[o>>2]=s;u=c[r>>2]|0}_c(c[l>>2]|0,u);c[m>>2]=(c[m>>2]|0)+1}q=q+8|0;}while((q|0)!=(b|0));p=c[l>>2]|0;Yc(k,p);i=d;return}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=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;d=i;i=i+40|0;e=d;f=d+8|0;g=d+16|0;j=d+24|0;k=j;l=j+4|0;c[l>>2]=0;m=j+8|0;c[m>>2]=0;n=j+4|0;o=n;p=j;c[p>>2]=o;if((a|0)==(b|0)){q=c[l>>2]|0;r=q;Yc(k,r);i=d;return}j=g;s=a;do{c[j>>2]=o;a=e;t=g;c[a+0>>2]=c[t+0>>2];t=Zc(k,e,f,s)|0;a=Mm(24)|0;h[a+16>>3]=+h[s>>3];u=c[f>>2]|0;v=a;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=u;c[t>>2]=v;u=c[c[p>>2]>>2]|0;if((u|0)==0){w=v}else{c[p>>2]=u;w=c[t>>2]|0}_c(c[l>>2]|0,w);c[m>>2]=(c[m>>2]|0)+1;s=s+8|0;}while((s|0)!=(b|0));b=c[p>>2]|0;if((b|0)==(o|0)){q=c[l>>2]|0;r=q;Yc(k,r);i=d;return}o=n;n=b;a:while(1){b=n+4|0;s=n;w=n+16|0;while(1){x=c[b>>2]|0;if((x|0)==0){f=s;while(1){e=c[f+8>>2]|0;if((c[e>>2]|0)==(f|0)){y=e;break}else{f=e}}}else{f=x;while(1){e=c[f>>2]|0;if((e|0)==0){y=f;break}else{f=e}}}f=y;if((y|0)==(o|0)){z=24;break a}if(!(+h[w>>3]==+h[y+16>>3])){break}e=c[y+4>>2]|0;if((e|0)==0){g=y;while(1){j=c[g+8>>2]|0;if((c[j>>2]|0)==(g|0)){A=j;break}else{g=j}}}else{g=e;while(1){j=c[g>>2]|0;if((j|0)==0){A=g;break}else{g=j}}}if((c[p>>2]|0)==(f|0)){c[p>>2]=A}c[m>>2]=(c[m>>2]|0)+ -1;Xc(c[l>>2]|0,y);Om(y)}if((x|0)==0){w=s;while(1){b=c[w+8>>2]|0;if((c[b>>2]|0)==(w|0)){B=b;break}else{w=b}}}else{w=x;while(1){s=c[w>>2]|0;if((s|0)==0){B=w;break}else{w=s}}}if((B|0)==(o|0)){z=24;break}else{n=B}}if((z|0)==24){q=c[l>>2]|0;r=q;Yc(k,r);i=d;return}}function Uc(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=i;i=i+8|0;d=b;e=+(a|0);f=~~+S(+(19931568.569324173/(e*(+ca(+e)/.6931471805599453))));g=a<<1;j=c[2]|0;k=c[12>>2]|0;if((k|0)!=(j|0)){c[12>>2]=k+(~((k+ -8+(0-j)|0)>>>3)<<3)}j=(a|0)==0;do{if(j){l=0+(a<<3)|0;m=0+(g<<3)|0;n=0}else{if(g>>>0>536870911){Oj(0)}k=Mm(a<<4)|0;o=g;p=k;while(1){if((p|0)!=0){h[p>>3]=0.0}q=o+ -1|0;if((q|0)==0){break}else{o=q;p=p+8|0}}p=k+(g<<3)|0;o=k+(a<<3)|0;if(j){l=o;m=p;n=k;break}else{r=k;s=0.0}while(1){q=r+8|0;h[r>>3]=s;if((q|0)==(o|0)){l=o;m=p;n=k;break}else{s=s+1.0;r=q}}}}while(0);if((g|0)!=(a|0)){g=l;s=0.0;while(1){l=g+8|0;h[g>>3]=s;if((l|0)==(m|0)){break}else{s=s+1.0;g=l}}}Vc(n,m);if((f|0)>0){g=a<<4;a=g>>3;l=a>>>0>536870911?-1:a<<3;r=n;j=f;while(1){k=j+ -1|0;p=Nm(l)|0;o=p;fn(p|0,r|0,g|0)|0;q=o+(a<<3)|0;md(o,q,d);a:do{if((o|0)==(q|0)){t=o;u=20}else{v=o;while(1){w=v+8|0;if((w|0)==(q|0)){break a}if(+h[v>>3]==+h[w>>3]){t=v;u=20;break}else{v=w}}}}while(0);b:do{if((u|0)==20){u=0;if((t|0)==(q|0)){break}o=t;v=t+8|0;while(1){w=v;do{w=w+8|0;if((w|0)==(q|0)){break b}x=+h[w>>3];}while(+h[o>>3]==x);y=o+8|0;h[y>>3]=x;o=y;v=w}}}while(0);if((p|0)!=0){Pm(p)}if((k|0)>0){j=k}else{z=f;break}}while(1){j=z+ -1|0;Nc(n,m,j);if((j|0)>0){z=j}else{A=f;break}}while(1){z=A+ -1|0;Pc(n,m,z);if((z|0)>0){A=z}else{B=f;break}}while(1){A=B+ -1|0;Qc(n,m,A);if((A|0)>0){B=A}else{C=f;break}}while(1){B=C+ -1|0;Rc(n,m,B);if((B|0)>0){C=B}else{D=f;break}}while(1){C=D+ -1|0;Sc(n,m,C);if((C|0)>0){D=C}else{E=f;break}}do{E=E+ -1|0;Tc(n,m,E);}while((E|0)>0)}if((n|0)==0){i=b;return}Om(n);i=b;return}function Vc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0;c=i;i=i+8|0;d=c;e=b-a|0;if((e|0)<=8){i=c;return}qd(d);f=b+ -8|0;if(f>>>0>a>>>0){b=a;a=e>>3;while(1){e=a+ -1|0;do{if((e|0)!=0){if((a|0)==0){g=pd(d)|0}else{j=32-(jn(a|0)|0)|0;k=(((-1>>>(33-j|0)&a|0)==0)<<31>>31)+j|0;j=(k>>>0)/((((k&31|0)!=0)+(k>>>5)|0)>>>0)|0;if((j|0)==0){l=0}else{l=-1>>>(32-j|0)}while(1){j=(pd(d)|0)&l;if(j>>>0<a>>>0){g=j;break}}}if((g|0)==0){break}j=b+(g<<3)|0;m=+h[b>>3];h[b>>3]=+h[j>>3];h[j>>3]=m}}while(0);j=b+8|0;if(j>>>0<f>>>0){b=j;a=e}else{break}}}od(d);i=c;return}function Wc(){var a=0;a=i;Uc(1e5);i=a;return 0}function Xc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;f=d;g=c[f>>2]|0;do{if((g|0)==0){h=0;j=d}else{k=c[d+4>>2]|0;if((k|0)==0){h=g;j=d;break}else{l=k}while(1){k=c[l>>2]|0;if((k|0)==0){h=0;j=l;break}else{l=k}}}}while(0);l=j;g=j+4|0;k=c[((h|0)==0?g:l)>>2]|0;h=(k|0)==0;m=j+8|0;if(!h){c[k+8>>2]=c[m>>2]}n=c[m>>2]|0;o=n;do{if((c[o>>2]|0)==(j|0)){c[o>>2]=k;if((j|0)==(b|0)){p=k;q=0;break}p=b;q=c[(c[m>>2]|0)+4>>2]|0}else{c[n+4>>2]=k;p=b;q=c[c[m>>2]>>2]|0}}while(0);b=j+12|0;n=(a[b]|0)==0;if((j|0)==(d|0)){r=p}else{o=d+8|0;s=c[o>>2]|0;c[m>>2]=s;if((c[c[o>>2]>>2]|0)==(d|0)){c[s>>2]=j}else{c[s+4>>2]=j}s=c[f>>2]|0;c[l>>2]=s;c[s+8>>2]=j;s=c[d+4>>2]|0;c[g>>2]=s;if((s|0)!=0){c[s+8>>2]=j}a[b]=a[d+12|0]|0;r=(p|0)==(d|0)?j:p}if(n|(r|0)==0){i=e;return}if(h){t=r;u=q}else{a[k+12|0]=1;i=e;return}while(1){k=u+8|0;q=c[k>>2]|0;r=q;h=u+12|0;n=(a[h]|0)!=0;if((c[r>>2]|0)==(u|0)){if(n){v=t;w=u}else{a[h]=1;a[q+12|0]=0;p=u+4|0;j=c[p>>2]|0;c[r>>2]=j;if((j|0)!=0){c[j+8>>2]=q}j=q+8|0;c[k>>2]=c[j>>2];k=c[j>>2]|0;r=k;if((c[r>>2]|0)==(q|0)){c[r>>2]=u}else{c[k+4>>2]=u}c[p>>2]=q;c[j>>2]=u;j=c[p>>2]|0;v=(t|0)==(j|0)?u:t;w=c[j>>2]|0}x=c[w>>2]|0;y=(x|0)==0;if(!y){if((a[x+12|0]|0)==0){z=66;break}}j=c[w+4>>2]|0;if((j|0)!=0){if((a[j+12|0]|0)==0){z=65;break}}a[w+12|0]=0;j=c[w+8>>2]|0;A=j+12|0;if((a[A]|0)==0|(j|0)==(v|0)){z=62;break}p=c[j+8>>2]|0;k=p;B=v;C=(c[k>>2]|0)==(j|0)?p+4|0:k}else{if(n){D=t;E=u}else{a[h]=1;a[q+12|0]=0;h=q+4|0;n=c[h>>2]|0;k=n;p=c[k>>2]|0;c[h>>2]=p;if((p|0)!=0){c[p+8>>2]=q}p=q+8|0;c[n+8>>2]=c[p>>2];h=c[p>>2]|0;j=h;if((c[j>>2]|0)==(q|0)){c[j>>2]=n}else{c[h+4>>2]=n}c[k>>2]=q;c[p>>2]=n;n=c[u>>2]|0;D=(t|0)==(n|0)?u:t;E=c[n+4>>2]|0}F=E;G=c[F>>2]|0;if((G|0)!=0){if((a[G+12|0]|0)==0){z=36;break}}n=c[E+4>>2]|0;if((n|0)!=0){if((a[n+12|0]|0)==0){H=n;z=37;break}}a[E+12|0]=0;n=c[E+8>>2]|0;if((n|0)==(D|0)){I=D;z=34;break}if((a[n+12|0]|0)==0){I=n;z=34;break}p=c[n+8>>2]|0;q=p;B=D;C=(c[q>>2]|0)==(n|0)?p+4|0:q}t=B;u=c[C>>2]|0}if((z|0)==34){a[I+12|0]=1;i=e;return}else if((z|0)==36){I=c[E+4>>2]|0;if((I|0)==0){z=38}else{H=I;z=37}}else if((z|0)==62){a[A]=1;i=e;return}else if((z|0)==65){if(y){z=67}else{z=66}}if((z|0)==37){if((a[H+12|0]|0)==0){J=H;K=E;z=44}else{z=38}}else if((z|0)==66){if((a[x+12|0]|0)==0){L=x;M=w;z=73}else{z=67}}if((z|0)==38){a[G+12|0]=1;a[E+12|0]=0;x=G+4|0;H=c[x>>2]|0;c[F>>2]=H;if((H|0)!=0){c[H+8>>2]=E}H=E+8|0;c[G+8>>2]=c[H>>2];F=c[H>>2]|0;y=F;if((c[y>>2]|0)==(E|0)){c[y>>2]=G}else{c[F+4>>2]=G}c[x>>2]=E;c[H>>2]=G;J=c[x>>2]|0;K=G;z=44}else if((z|0)==67){G=w+4|0;x=c[G>>2]|0;a[x+12|0]=1;a[w+12|0]=0;H=x;E=c[H>>2]|0;c[G>>2]=E;if((E|0)!=0){c[E+8>>2]=w}E=w+8|0;c[x+8>>2]=c[E>>2];G=c[E>>2]|0;F=G;if((c[F>>2]|0)==(w|0)){c[F>>2]=x}else{c[G+4>>2]=x}c[H>>2]=w;c[E>>2]=x;L=c[H>>2]|0;M=x;z=73}if((z|0)==44){x=c[K+8>>2]|0;H=x+12|0;a[K+12|0]=a[H]|0;a[H]=1;a[J+12|0]=1;J=x+4|0;H=c[J>>2]|0;K=H;E=c[K>>2]|0;c[J>>2]=E;if((E|0)!=0){c[E+8>>2]=x}E=x+8|0;c[H+8>>2]=c[E>>2];J=c[E>>2]|0;w=J;if((c[w>>2]|0)==(x|0)){c[w>>2]=H}else{c[J+4>>2]=H}c[K>>2]=x;c[E>>2]=H;i=e;return}else if((z|0)==73){z=c[M+8>>2]|0;H=z+12|0;a[M+12|0]=a[H]|0;a[H]=1;a[L+12|0]=1;L=z;H=c[L>>2]|0;M=H+4|0;E=c[M>>2]|0;c[L>>2]=E;if((E|0)!=0){c[E+8>>2]=z}E=z+8|0;c[H+8>>2]=c[E>>2];L=c[E>>2]|0;x=L;if((c[x>>2]|0)==(z|0)){c[x>>2]=H}else{c[L+4>>2]=H}c[M>>2]=z;c[E>>2]=H;i=e;return}}function Yc(a,b){a=a|0;b=b|0;var d=0;d=i;if((b|0)==0){i=d;return}else{Yc(a,c[b>>2]|0);Yc(a,c[b+4>>2]|0);Om(b);i=d;return}}function Zc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;g=a+4|0;j=c[b>>2]|0;do{if((j|0)!=(g|0)){k=+h[e>>3];if(!(+h[j+16>>3]<k)){break}b=c[a+4>>2]|0;if((b|0)==0){c[d>>2]=g;l=g;i=f;return l|0}else{m=b}while(1){if(+h[m+16>>3]<k){n=m+4|0;b=c[n>>2]|0;if((b|0)==0){o=22;break}else{m=b;continue}}else{p=m;b=c[p>>2]|0;if((b|0)==0){o=24;break}else{m=b;continue}}}if((o|0)==22){c[d>>2]=m;l=n;i=f;return l|0}else if((o|0)==24){c[d>>2]=m;l=p;i=f;return l|0}}}while(0);p=c[j>>2]|0;do{if((j|0)==(c[a>>2]|0)){q=j}else{if((p|0)==0){m=j;while(1){n=c[m+8>>2]|0;if((c[n>>2]|0)==(m|0)){m=n}else{r=n;break}}}else{m=p;while(1){n=c[m+4>>2]|0;if((n|0)==0){r=m;break}else{m=n}}}k=+h[e>>3];if(!(k<+h[r+16>>3])){q=r;break}m=c[a+4>>2]|0;if((m|0)==0){c[d>>2]=g;l=g;i=f;return l|0}else{s=m}while(1){if(k<+h[s+16>>3]){t=s;m=c[t>>2]|0;if((m|0)==0){o=15;break}else{s=m;continue}}else{u=s+4|0;m=c[u>>2]|0;if((m|0)==0){o=17;break}else{s=m;continue}}}if((o|0)==15){c[d>>2]=s;l=t;i=f;return l|0}else if((o|0)==17){c[d>>2]=s;l=u;i=f;return l|0}}}while(0);if((p|0)==0){c[d>>2]=j;l=j;i=f;return l|0}else{c[d>>2]=q;l=q+4|0;i=f;return l|0}return 0}function _c(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;f=(d|0)==(b|0);a[d+12|0]=f&1;if(f){i=e;return}else{g=d}while(1){h=g+8|0;j=c[h>>2]|0;d=j+12|0;if((a[d]|0)!=0){k=37;break}l=j+8|0;m=c[l>>2]|0;f=c[m>>2]|0;if((f|0)==(j|0)){n=c[m+4>>2]|0;if((n|0)==0){k=7;break}o=n+12|0;if((a[o]|0)!=0){k=7;break}a[d]=1;a[m+12|0]=(m|0)==(b|0)|0;a[o]=1}else{if((f|0)==0){k=24;break}o=f+12|0;if((a[o]|0)!=0){k=24;break}a[d]=1;a[m+12|0]=(m|0)==(b|0)|0;a[o]=1}if((m|0)==(b|0)){k=37;break}else{g=m}}if((k|0)==7){if((c[j>>2]|0)==(g|0)){p=j;q=m;r=j}else{b=j+4|0;o=c[b>>2]|0;d=o;f=c[d>>2]|0;c[b>>2]=f;if((f|0)==0){s=m}else{c[f+8>>2]=j;s=c[l>>2]|0}f=o+8|0;c[f>>2]=s;s=c[l>>2]|0;b=s;if((c[b>>2]|0)==(j|0)){c[b>>2]=o}else{c[s+4>>2]=o}c[d>>2]=j;c[l>>2]=o;d=c[f>>2]|0;p=c[d>>2]|0;q=d;r=o}a[r+12|0]=1;a[q+12|0]=0;r=p+4|0;o=c[r>>2]|0;c[q>>2]=o;if((o|0)!=0){c[o+8>>2]=q}o=q+8|0;c[p+8>>2]=c[o>>2];d=c[o>>2]|0;f=d;if((c[f>>2]|0)==(q|0)){c[f>>2]=p}else{c[d+4>>2]=p}c[r>>2]=q;c[o>>2]=p;i=e;return}else if((k|0)==24){p=j;if((c[p>>2]|0)==(g|0)){o=g+4|0;q=c[o>>2]|0;c[p>>2]=q;if((q|0)==0){t=m}else{c[q+8>>2]=j;t=c[l>>2]|0}c[h>>2]=t;t=c[l>>2]|0;q=t;if((c[q>>2]|0)==(j|0)){c[q>>2]=g}else{c[t+4>>2]=g}c[o>>2]=j;c[l>>2]=g;u=c[h>>2]|0;v=g}else{u=m;v=j}a[v+12|0]=1;a[u+12|0]=0;v=u+4|0;j=c[v>>2]|0;m=j;g=c[m>>2]|0;c[v>>2]=g;if((g|0)!=0){c[g+8>>2]=u}g=u+8|0;c[j+8>>2]=c[g>>2];v=c[g>>2]|0;h=v;if((c[h>>2]|0)==(u|0)){c[h>>2]=j}else{c[v+4>>2]=j}c[m>>2]=u;c[g>>2]=j;i=e;return}else if((k|0)==37){i=e;return}}function $c(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0.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;f=i;g=a+4|0;j=c[b>>2]|0;do{if((j|0)!=(g|0)){k=+h[e>>3];l=+h[j+16>>3];if(k<l){break}if(!(l<k)){c[d>>2]=j;m=d;i=f;return m|0}b=j+4|0;n=c[b>>2]|0;o=(n|0)==0;if(o){p=j;while(1){q=c[p+8>>2]|0;if((c[q>>2]|0)==(p|0)){r=q;break}else{p=q}}}else{p=n;while(1){q=c[p>>2]|0;if((q|0)==0){r=p;break}else{p=q}}}p=g;do{if((r|0)!=(p|0)){if(k<+h[r+16>>3]){break}n=c[a+4>>2]|0;if((n|0)==0){c[d>>2]=p;m=g;i=f;return m|0}else{s=n}while(1){l=+h[s+16>>3];if(k<l){t=s;n=c[t>>2]|0;if((n|0)==0){u=34;break}else{s=n;continue}}if(!(l<k)){u=38;break}v=s+4|0;n=c[v>>2]|0;if((n|0)==0){u=37;break}else{s=n}}if((u|0)==34){c[d>>2]=s;m=t;i=f;return m|0}else if((u|0)==37){c[d>>2]=s;m=v;i=f;return m|0}else if((u|0)==38){c[d>>2]=s;m=d;i=f;return m|0}}}while(0);if(o){c[d>>2]=j;m=b;i=f;return m|0}else{c[d>>2]=r;m=r;i=f;return m|0}}}while(0);r=c[j>>2]|0;do{if((j|0)==(c[a>>2]|0)){w=j}else{if((r|0)==0){s=j;while(1){v=c[s+8>>2]|0;if((c[v>>2]|0)==(s|0)){s=v}else{x=v;break}}}else{s=r;while(1){b=c[s+4>>2]|0;if((b|0)==0){x=s;break}else{s=b}}}k=+h[e>>3];if(+h[x+16>>3]<k){w=x;break}s=c[a+4>>2]|0;if((s|0)==0){c[d>>2]=g;m=g;i=f;return m|0}else{y=s}while(1){l=+h[y+16>>3];if(k<l){z=y;s=c[z>>2]|0;if((s|0)==0){u=15;break}else{y=s;continue}}if(!(l<k)){u=19;break}A=y+4|0;s=c[A>>2]|0;if((s|0)==0){u=18;break}else{y=s}}if((u|0)==15){c[d>>2]=y;m=z;i=f;return m|0}else if((u|0)==18){c[d>>2]=y;m=A;i=f;return m|0}else if((u|0)==19){c[d>>2]=y;m=d;i=f;return m|0}}}while(0);if((r|0)==0){c[d>>2]=j;m=j;i=f;return m|0}else{c[d>>2]=w;m=w+4|0;i=f;return m|0}return 0}function ad(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=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.0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0;g=i;i=i+80|0;j=g;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+40|0;p=g+48|0;q=g+56|0;r=g+64|0;s=g+72|0;if((e|0)==2){t=d;u=c[c[t>>2]>>2]|0;c[t>>2]=u;t=c[b>>2]|0;if(+h[u+8>>3]<+h[t+8>>3]){v=u+4|0;w=u;c[(c[w>>2]|0)+4>>2]=c[v>>2];c[c[v>>2]>>2]=c[w>>2];x=t;c[(c[x>>2]|0)+4>>2]=u;c[w>>2]=c[x>>2];c[x>>2]=u;c[v>>2]=t;c[a>>2]=u;i=g;return}else{c[a>>2]=t;i=g;return}}else if((e|0)==1|(e|0)==0){c[a>>2]=c[b>>2];i=g;return}else{t=e>>>1;u=b;b=c[u>>2]|0;if((t|0)==0){y=b}else{v=t;x=b;while(1){w=c[x+4>>2]|0;z=v+ -1|0;if((z|0)>0){x=w;v=z}else{y=w;break}}}c[o>>2]=b;c[p>>2]=y;b=m;v=o;c[b+0>>2]=c[v+0>>2];v=l;b=p;c[v+0>>2]=c[b+0>>2];ad(n,m,l,t,f);l=c[n>>2]|0;c[u>>2]=l;c[r>>2]=y;y=d;d=c[y>>2]|0;c[s>>2]=d;n=e-t|0;t=k;e=r;c[t+0>>2]=c[e+0>>2];e=j;t=s;c[e+0>>2]=c[t+0>>2];ad(q,k,j,n,f);f=c[q>>2]|0;A=+h[l+8>>3];if(+h[f+8>>3]<A){q=c[f+4>>2]|0;a:do{if((q|0)==(d|0)){B=d}else{n=q;while(1){if(!(+h[n+8>>3]<A)){B=n;break a}j=c[n+4>>2]|0;if((j|0)==(d|0)){B=d;break}else{n=j}}}}while(0);q=c[B>>2]|0;n=q+4|0;j=f;c[(c[j>>2]|0)+4>>2]=c[n>>2];c[c[n>>2]>>2]=c[j>>2];k=c[l+4>>2]|0;t=l;c[(c[t>>2]|0)+4>>2]=f;c[j>>2]=c[t>>2];c[t>>2]=q;c[n>>2]=l;C=B;D=f;E=k}else{C=f;D=l;E=c[l+4>>2]|0}c[u>>2]=E;b:do{if((E|0)!=(C|0)){l=C;f=C;k=d;B=E;while(1){n=f+8|0;if((f|0)==(k|0)){break b}else{F=B}while(1){G=+h[F+8>>3];if(+h[n>>3]<G){break}q=c[F+4>>2]|0;c[u>>2]=q;if((q|0)==(l|0)){break b}else{F=q}}n=c[f+4>>2]|0;c:do{if((n|0)==(k|0)){H=k}else{q=n;while(1){if(!(+h[q+8>>3]<G)){H=q;break c}t=c[q+4>>2]|0;if((t|0)==(k|0)){H=k;break}else{q=t}}}}while(0);n=c[H>>2]|0;q=n+4|0;t=f;c[(c[t>>2]|0)+4>>2]=c[q>>2];c[c[q>>2]>>2]=c[t>>2];j=c[F+4>>2]|0;e=(l|0)==(f|0)?H:l;s=F;c[(c[s>>2]|0)+4>>2]=f;c[t>>2]=c[s>>2];c[s>>2]=n;c[q>>2]=F;c[u>>2]=j;if((j|0)==(e|0)){break b}l=e;f=H;k=c[y>>2]|0;B=j}}}while(0);c[a>>2]=D;i=g;return}}function bd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=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.0,I=0,J=0;e=i;f=b;g=f;j=c[g>>2]|0;k=c[g+4>>2]|0;g=d;l=c[g>>2]|0;m=c[g+4>>2]|0;g=k;n=m;a:do{if((g|0)==(n|0)){o=l;p=m}else{q=j;r=c[q>>2]|0;s=j;t=k;u=g;v=q;while(1){q=u+8|0;if((q-r|0)==4096){w=v+4|0;x=c[w>>2]|0;y=x;z=x;A=w}else{y=r;z=q;A=v}if((z|0)==(n|0)){o=l;p=m;break a}if(+h[u>>3]==+h[z>>3]){o=s;p=t;break a}r=y;s=A;t=z;u=z;v=A}}}while(0);A=f;c[A>>2]=o;c[A+4>>2]=p;A=b+4|0;z=p;p=c[d+4>>2]|0;d=o;do{if((z|0)!=(p|0)){o=z+8|0;y=c[d>>2]|0;if((o-y|0)==4096){m=d+4|0;l=c[m>>2]|0;B=l;C=m;D=l}else{B=o;C=d;D=y}y=b;o=d;l=d;m=z;n=D;g=B;k=C;while(1){j=g+8|0;if((j-n|0)==4096){v=k+4|0;u=c[v>>2]|0;E=u;F=u;G=v}else{E=n;F=j;G=k}if((F|0)==(p|0)){break}H=+h[F>>3];if(+h[m>>3]==H){n=E;g=F;k=G;m=m;l=l;o=o;continue}j=m+8|0;c[A>>2]=j;if((j-(c[o>>2]|0)|0)==4096){v=o+4|0;c[y>>2]=v;u=c[v>>2]|0;c[A>>2]=u;I=u;J=v}else{I=j;J=o}h[I>>3]=H;o=J;l=J;m=I;n=c[G>>2]|0;g=F;k=G}k=m+8|0;c[A>>2]=k;if((k-(c[l>>2]|0)|0)!=4096){break}k=l+4|0;c[y>>2]=k;c[A>>2]=c[k>>2]}}while(0);A=f;f=c[A+4>>2]|0;G=a;c[G>>2]=c[A>>2];c[G+4>>2]=f;i=e;return}function cd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=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,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,Xa=0,Ya=0,Za=0,_a=0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0.0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0.0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0.0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0.0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0.0,oc=0,pc=0,qc=0,rc=0,sc=0.0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0.0,Lc=0,Mc=0,Nc=0,Oc=0;e=i;i=i+168|0;f=e;g=e+8|0;j=e+16|0;k=e+24|0;l=e+32|0;m=e+40|0;n=e+48|0;o=e+56|0;p=e+64|0;q=e+72|0;r=e+80|0;s=e+88|0;t=e+96|0;u=e+104|0;v=e+112|0;w=e+120|0;x=e+128|0;y=e+136|0;z=e+144|0;A=e+152|0;B=e+160|0;C=B;D=i;i=i+8|0;E=D;F=i;i=i+8|0;G=F;H=i;i=i+8|0;I=H;J=i;i=i+8|0;K=J;L=i;i=i+8|0;M=L;N=i;i=i+8|0;O=N;P=i;i=i+8|0;Q=P;R=i;i=i+8|0;S=R;T=i;i=i+8|0;U=T;V=i;i=i+8|0;W=V;X=i;i=i+8|0;Y=X;Z=i;i=i+8|0;_=Z;$=i;i=i+8|0;aa=$;ba=i;i=i+8|0;ca=ba;da=i;i=i+8|0;ea=da;fa=i;i=i+8|0;ga=fa;ha=i;i=i+8|0;ia=ha;ja=i;i=i+8|0;ka=ja;la=i;i=i+8|0;ma=la;na=b+4|0;oa=c[na>>2]|0;pa=c[a+4>>2]|0;if((oa|0)==(pa|0)){i=e;return}qa=b;ra=a;sa=b;b=W+4|0;ta=V;ua=S+4|0;va=R;wa=ca+4|0;xa=ba;ya=ka+4|0;za=ja;Aa=c[qa>>2]|0;Ba=oa;Ca=oa;Da=oa;Ea=pa;Fa=oa;Ga=c[a>>2]|0;a=pa;pa=oa;a:while(1){oa=pa;Ha=a;Ia=(oa-(c[Aa>>2]|0)>>3)+(Aa-Ga<<7)-(Ha-(c[Ga>>2]|0)>>3)|0;switch(Ia|0){case 2:{Ja=4;break a;break};case 3:{Ja=8;break a;break};case 4:{Ja=21;break a;break};case 5:{Ja=41;break a;break};case 1:case 0:{Ja=155;break a;break};default:{}}Ka=ra;La=c[Ka>>2]|0;Ma=c[Ka+4>>2]|0;if((Ia|0)<31){Ja=54;break}Ka=La;Na=Ma;Oa=sa;Pa=c[Oa>>2]|0;Qa=c[Oa+4>>2]|0;if((Qa|0)==(c[Pa>>2]|0)){Oa=Pa+ -4|0;Ra=Oa;Sa=(c[Oa>>2]|0)+4096|0}else{Ra=Pa;Sa=Qa}Qa=Sa+ -8|0;Oa=(Ia|0)>999;do{if((Ia+1|0)>>>0<3){Ta=Na;Ua=Ka}else{Va=(Ma-(c[Ka>>2]|0)>>3)+((Ia|0)/2|0)|0;if((Va|0)>0){Wa=Ka+(((Va|0)/512|0)<<2)|0;Ta=(c[Wa>>2]|0)+(((Va|0)%512|0)<<3)|0;Ua=Wa;break}else{Wa=511-Va|0;Va=Ka+(((Wa|0)/-512|0)<<2)|0;Ta=(c[Va>>2]|0)+(511-((Wa|0)%512|0)<<3)|0;Ua=Va;break}}}while(0);do{if(Oa){Va=(Ia|0)/4|0;Wa=P;c[Wa>>2]=La;c[Wa+4>>2]=Ma;Wa=R;c[Wa>>2]=La;c[Wa+4>>2]=Ma;Wa=(Ia+3|0)>>>0<7;do{if(!Wa){Xa=(Ma-(c[Ka>>2]|0)>>3)+Va|0;if((Xa|0)>0){Ya=Ka+(((Xa|0)/512|0)<<2)|0;c[va>>2]=Ya;c[ua>>2]=(c[Ya>>2]|0)+(((Xa|0)%512|0)<<3);break}else{Ya=511-Xa|0;Xa=Ka+(((Ya|0)/-512|0)<<2)|0;c[va>>2]=Xa;c[ua>>2]=(c[Xa>>2]|0)+(511-((Ya|0)%512|0)<<3);break}}}while(0);Ya=Ua;Xa=Ta;Za=T;c[Za>>2]=Ya;c[Za+4>>2]=Xa;Za=V;c[Za>>2]=Ya;c[Za+4>>2]=Xa;do{if(!Wa){Za=(Xa-(c[Ua>>2]|0)>>3)+Va|0;if((Za|0)>0){Ya=Ua+(((Za|0)/512|0)<<2)|0;c[ta>>2]=Ya;c[b>>2]=(c[Ya>>2]|0)+(((Za|0)%512|0)<<3);break}else{Ya=511-Za|0;Za=Ua+(((Ya|0)/-512|0)<<2)|0;c[ta>>2]=Za;c[b>>2]=(c[Za>>2]|0)+(511-((Ya|0)%512|0)<<3);break}}}while(0);Va=X;c[Va>>2]=Ra;c[Va+4>>2]=Qa;Va=t;Xa=Q;c[Va+0>>2]=c[Xa+0>>2];c[Va+4>>2]=c[Xa+4>>2];Xa=s;Va=S;c[Xa+0>>2]=c[Va+0>>2];c[Xa+4>>2]=c[Va+4>>2];Va=r;Xa=U;c[Va+0>>2]=c[Xa+0>>2];c[Va+4>>2]=c[Xa+4>>2];Xa=q;Va=W;c[Xa+0>>2]=c[Va+0>>2];c[Xa+4>>2]=c[Va+4>>2];Va=p;Xa=Y;c[Va+0>>2]=c[Xa+0>>2];c[Va+4>>2]=c[Xa+4>>2];Xa=dd(t,s,r,q,p,0)|0;_a=Xa}else{$a=+h[Ta>>3];ab=+h[Na>>3];bb=+h[Qa>>3];Xa=bb<$a;if(!($a<ab)){if(!Xa){_a=0;break}h[Ta>>3]=bb;h[Qa>>3]=$a;cb=+h[Ta>>3];db=+h[Na>>3];if(!(cb<db)){_a=1;break}h[Na>>3]=cb;h[Ta>>3]=db;_a=2;break}if(Xa){h[Na>>3]=bb;h[Qa>>3]=ab;_a=1;break}h[Na>>3]=$a;h[Ta>>3]=ab;$a=+h[Qa>>3];if(!($a<ab)){_a=1;break}h[Ta>>3]=$a;h[Qa>>3]=ab;_a=2}}while(0);Na=ra;Ka=c[Na>>2]|0;Ia=c[Na+4>>2]|0;ab=+h[Ia>>3];$a=+h[Ta>>3];do{if(ab<$a){eb=Qa;fb=Ra;gb=_a;Ja=112}else{Na=c[Ra>>2]|0;Oa=Qa;Xa=Ra;while(1){if((Oa|0)==(Na|0)){Va=Xa+ -4|0;Wa=c[Va>>2]|0;hb=Wa;ib=Va;jb=Wa+4096|0}else{hb=Na;ib=Xa;jb=Oa}kb=jb+ -8|0;if((Ia|0)==(kb|0)){break}lb=+h[kb>>3];if(lb<$a){Ja=111;break}else{Na=hb;Oa=kb;Xa=ib}}if((Ja|0)==111){Ja=0;h[Ia>>3]=lb;h[kb>>3]=ab;eb=kb;fb=ib;gb=_a+1|0;Ja=112;break}Xa=Ia+8|0;Oa=c[Ka>>2]|0;if((Xa-Oa|0)==4096){Na=Ka+4|0;Wa=c[Na>>2]|0;mb=Wa;nb=Wa;ob=Na}else{mb=Oa;nb=Xa;ob=Ka}Xa=sa;Oa=c[Xa>>2]|0;Na=c[Xa+4>>2]|0;Xa=c[Oa>>2]|0;if((Na|0)==(Xa|0)){Wa=Oa+ -4|0;Va=c[Wa>>2]|0;pb=Va;qb=Wa;rb=Va+4096|0}else{pb=Xa;qb=Oa;rb=Na}Na=rb+ -8|0;bb=+h[a>>3];db=+h[Na>>3];do{if(bb<db){sb=nb;tb=ob}else{Xa=nb;Va=ob;Wa=mb;b:while(1){ub=Xa;while(1){if((ub|0)==(Na|0)){Ja=155;break a}vb=+h[ub>>3];if(bb<vb){break b}Ya=ub+8|0;if((Ya-Wa|0)==4096){break}else{ub=Ya}}Ya=Va+4|0;Za=c[Ya>>2]|0;Xa=Za;Va=Ya;Wa=Za}h[ub>>3]=db;h[Na>>3]=vb;Xa=ub+8|0;if((Xa-Wa|0)!=4096){sb=Xa;tb=Va;break}Xa=Va+4|0;sb=c[Xa>>2]|0;tb=Xa}}while(0);if((sb|0)==(Na|0)){Ja=155;break a}else{wb=sb;xb=tb;yb=Na;zb=qb;Ab=pb}c:while(1){Xa=wb;Za=yb;Ya=zb;Bb=Ab;d:while(1){db=+h[a>>3];Cb=Xa;while(1){Db=+h[Cb>>3];if(db<Db){Eb=Bb;Fb=Za;Gb=Ya;break}Hb=Cb+8|0;if((Hb-(c[xb>>2]|0)|0)==4096){Ib=Za;Jb=Ya;Kb=Bb;break d}else{Cb=Hb}}while(1){if((Fb|0)==(Eb|0)){Hb=Gb+ -4|0;Lb=c[Hb>>2]|0;Mb=Lb;Nb=Hb;Ob=Lb+4096|0}else{Mb=Eb;Nb=Gb;Ob=Fb}Pb=Ob+ -8|0;Qb=+h[Pb>>3];if(db<Qb){Eb=Mb;Fb=Pb;Gb=Nb}else{break}}if(!(xb>>>0<Nb>>>0)){if((xb|0)!=(Nb|0)|Cb>>>0>=Pb>>>0){break c}}h[Cb>>3]=Qb;h[Pb>>3]=Db;Lb=Cb+8|0;if((Lb-(c[xb>>2]|0)|0)==4096){Ib=Pb;Jb=Nb;Kb=Mb;break}else{Xa=Lb;Za=Pb;Ya=Nb;Bb=Mb}}Bb=xb+4|0;wb=c[Bb>>2]|0;xb=Bb;yb=Ib;zb=Jb;Ab=Kb}Na=ra;c[Na>>2]=xb;c[Na+4>>2]=Cb;Rb=Oa;Sb=Ba;Tb=Ca;Ub=Da;Vb=Cb;Wb=Fa;Xb=Cb;Yb=pa;Zb=xb}}while(0);e:do{if((Ja|0)==112){Ja=0;Qa=Ia+8|0;Na=c[Ka>>2]|0;if((Qa-Na|0)==4096){Bb=Ka+4|0;Ya=c[Bb>>2]|0;_b=Ya;$b=Ya;ac=Bb}else{_b=Na;$b=Qa;ac=Ka}if(ac>>>0<fb>>>0){bc=Ta;cc=$b;dc=ac;ec=eb;fc=fb;gc=_b;hc=gb;Ja=116}else{if((ac|0)==(fb|0)&$b>>>0<eb>>>0){bc=Ta;cc=$b;dc=ac;ec=eb;fc=fb;gc=_b;hc=gb;Ja=116}else{ic=Ta;jc=$b;kc=ac;lc=gb}}f:do{if((Ja|0)==116){while(1){Ja=0;ab=+h[bc>>3];Qa=cc;Na=dc;Bb=gc;g:while(1){mc=Qa;while(1){nc=+h[mc>>3];if(!(nc<ab)){break g}Ya=mc+8|0;if((Ya-Bb|0)==4096){break}else{mc=Ya}}Ya=Na+4|0;Za=c[Ya>>2]|0;Qa=Za;Na=Ya;Bb=Za}Qa=c[fc>>2]|0;Za=ec;Ya=fc;while(1){if((Za|0)==(Qa|0)){Xa=Ya+ -4|0;Va=c[Xa>>2]|0;oc=Va;pc=Xa;qc=Va+4096|0}else{oc=Qa;pc=Ya;qc=Za}rc=qc+ -8|0;sc=+h[rc>>3];if(sc<ab){break}else{Qa=oc;Za=rc;Ya=pc}}if(pc>>>0<Na>>>0){ic=bc;jc=mc;kc=Na;lc=hc;break f}if((pc|0)==(Na|0)&rc>>>0<mc>>>0){ic=bc;jc=mc;kc=Na;lc=hc;break f}h[mc>>3]=sc;h[rc>>3]=nc;Ya=hc+1|0;Za=(bc|0)==(mc|0)?rc:bc;Qa=mc+8|0;if((Qa-Bb|0)!=4096){bc=Za;cc=Qa;dc=Na;ec=rc;fc=pc;gc=Bb;hc=Ya;Ja=116;continue}Qa=Na+4|0;Va=c[Qa>>2]|0;bc=Za;cc=Va;dc=Qa;ec=rc;fc=pc;gc=Va;hc=Ya;Ja=116}}}while(0);do{if((jc|0)==(ic|0)){tc=lc}else{ab=+h[ic>>3];$a=+h[jc>>3];if(!(ab<$a)){tc=lc;break}h[jc>>3]=ab;h[ic>>3]=$a;tc=lc+1|0}}while(0);do{if((tc|0)==0){Oa=ra;Ya=c[Oa>>2]|0;Va=c[Oa+4>>2]|0;Oa=Z;c[Oa>>2]=Ya;c[Oa+4>>2]=Va;Va=kc;Oa=jc;Qa=$;c[Qa>>2]=Va;c[Qa+4>>2]=Oa;Qa=o;Za=_;c[Qa+0>>2]=c[Za+0>>2];c[Qa+4>>2]=c[Za+4>>2];Za=n;Qa=aa;c[Za+0>>2]=c[Qa+0>>2];c[Za+4>>2]=c[Qa+4>>2];Qa=fd(o,n,0)|0;Za=ba;c[Za>>2]=Va;c[Za+4>>2]=Oa;Za=Oa-(c[kc>>2]|0)|0;Xa=Za>>3;Wa=Xa+1|0;Lb=Ya;if((Za|0)>-8){Za=kc+(((Wa|0)/512|0)<<2)|0;c[xa>>2]=Za;uc=(c[Za>>2]|0)+(((Wa|0)%512|0)<<3)|0}else{Wa=510-Xa|0;Xa=kc+(((Wa|0)/-512|0)<<2)|0;c[xa>>2]=Xa;uc=(c[Xa>>2]|0)+(511-((Wa|0)%512|0)<<3)|0}c[wa>>2]=uc;Wa=sa;Xa=c[Wa>>2]|0;Za=c[Wa+4>>2]|0;Wa=da;c[Wa>>2]=Xa;c[Wa+4>>2]=Za;Za=m;Wa=ca;c[Za+0>>2]=c[Wa+0>>2];c[Za+4>>2]=c[Wa+4>>2];Wa=l;Za=ea;c[Wa+0>>2]=c[Za+0>>2];c[Wa+4>>2]=c[Za+4>>2];Za=fd(m,l,0)|0;Wa=Xa;if(Za){if(Qa){Ja=155;break a}Za=sa;c[Za>>2]=Va;c[Za+4>>2]=Oa;Rb=kc;Sb=jc;Tb=jc;Ub=jc;Vb=Ea;Wb=jc;Xb=a;Yb=jc;Zb=Lb;break e}if(!Qa){vc=Wa;wc=Lb;break}Lb=jc+8|0;if((Lb-(c[kc>>2]|0)|0)==4096){Qa=kc+4|0;xc=c[Qa>>2]|0;yc=Qa}else{xc=Lb;yc=kc}Lb=ra;c[Lb>>2]=yc;c[Lb+4>>2]=xc;Rb=Wa;Sb=Ba;Tb=Ca;Ub=Da;Vb=xc;Wb=Fa;Xb=xc;Yb=pa;Zb=yc;break e}else{vc=Pa;wc=Ka}}while(0);if((jc|0)==(a|0)){zc=0}else{zc=(jc-(c[kc>>2]|0)>>3)+(kc-wc<<7)-(Ha-(c[wc>>2]|0)>>3)|0}if((pa|0)==(jc|0)){Ac=0}else{Ac=(oa-(c[vc>>2]|0)>>3)+(vc-kc<<7)-(jc-(c[kc>>2]|0)>>3)|0}if((zc|0)<(Ac|0)){Wa=ra;Lb=c[Wa+4>>2]|0;Qa=fa;c[Qa>>2]=c[Wa>>2];c[Qa+4>>2]=Lb;Lb=ha;c[Lb>>2]=kc;c[Lb+4>>2]=jc;Lb=k;Qa=ga;c[Lb+0>>2]=c[Qa+0>>2];c[Lb+4>>2]=c[Qa+4>>2];Qa=j;Lb=ia;c[Qa+0>>2]=c[Lb+0>>2];c[Qa+4>>2]=c[Lb+4>>2];cd(k,j,d);Lb=jc+8|0;if((Lb-(c[kc>>2]|0)|0)==4096){Qa=kc+4|0;Bc=c[Qa>>2]|0;Cc=Qa}else{Bc=Lb;Cc=kc}Lb=ra;c[Lb>>2]=Cc;c[Lb+4>>2]=Bc;Rb=vc;Sb=Ba;Tb=Ca;Ub=Da;Vb=Bc;Wb=Fa;Xb=Bc;Yb=pa;Zb=Cc;break}Lb=kc;Qa=jc;Wa=ja;c[Wa>>2]=Lb;c[Wa+4>>2]=Qa;Wa=Qa-(c[kc>>2]|0)|0;Oa=Wa>>3;Za=Oa+1|0;if((Wa|0)>-8){Wa=kc+(((Za|0)/512|0)<<2)|0;c[za>>2]=Wa;Dc=(c[Wa>>2]|0)+(((Za|0)%512|0)<<3)|0}else{Za=510-Oa|0;Oa=kc+(((Za|0)/-512|0)<<2)|0;c[za>>2]=Oa;Dc=(c[Oa>>2]|0)+(511-((Za|0)%512|0)<<3)|0}c[ya>>2]=Dc;Za=sa;Oa=c[Za+4>>2]|0;Wa=la;c[Wa>>2]=c[Za>>2];c[Wa+4>>2]=Oa;Oa=g;Wa=ka;c[Oa+0>>2]=c[Wa+0>>2];c[Oa+4>>2]=c[Wa+4>>2];Wa=f;Oa=ma;c[Wa+0>>2]=c[Oa+0>>2];c[Wa+4>>2]=c[Oa+4>>2];cd(g,f,d);Oa=sa;c[Oa>>2]=Lb;c[Oa+4>>2]=Qa;Rb=kc;Sb=jc;Tb=jc;Ub=jc;Vb=Ea;Wb=jc;Xb=a;Yb=jc;Zb=wc}}while(0);if((Yb|0)==(Xb|0)){Ja=155;break}else{Aa=Rb;Ba=Sb;Ca=Tb;Da=Ub;Ea=Vb;Fa=Wb;Ga=Zb;a=Xb;pa=Yb}}if((Ja|0)==4){if((Fa|0)==(c[Aa>>2]|0)){Yb=Aa+ -4|0;c[qa>>2]=Yb;pa=(c[Yb>>2]|0)+4096|0;c[na>>2]=pa;Ec=pa}else{Ec=Fa}Fa=Ec+ -8|0;c[na>>2]=Fa;nc=+h[Fa>>3];sc=+h[Ea>>3];if(!(nc<sc)){i=e;return}h[Ea>>3]=nc;h[Fa>>3]=sc;i=e;return}else if((Ja|0)==8){Fa=ra;Ea=c[Fa+4>>2]|0;Ec=c[Fa>>2]|0;Fa=Ea-(c[Ec>>2]|0)|0;pa=Fa>>3;Yb=pa+1|0;if((Fa|0)>-8){Fc=(c[Ec+(((Yb|0)/512|0)<<2)>>2]|0)+(((Yb|0)%512|0)<<3)|0}else{Yb=510-pa|0;Fc=(c[Ec+(((Yb|0)/-512|0)<<2)>>2]|0)+(511-((Yb|0)%512|0)<<3)|0}if((Da|0)==(c[Aa>>2]|0)){Yb=Aa+ -4|0;c[qa>>2]=Yb;Ec=(c[Yb>>2]|0)+4096|0;c[na>>2]=Ec;Gc=Ec}else{Gc=Da}c[na>>2]=Gc+ -8;Gc=Ea;Ea=c[sa+4>>2]|0;sc=+h[Fc>>3];nc=+h[Gc>>3];Db=+h[Ea>>3];Da=Db<sc;if(!(sc<nc)){if(!Da){i=e;return}h[Fc>>3]=Db;h[Ea>>3]=sc;Qb=+h[Fc>>3];vb=+h[Gc>>3];if(!(Qb<vb)){i=e;return}h[Gc>>3]=Qb;h[Fc>>3]=vb;i=e;return}if(Da){h[Gc>>3]=Db;h[Ea>>3]=nc;i=e;return}h[Gc>>3]=sc;h[Fc>>3]=nc;sc=+h[Ea>>3];if(!(sc<nc)){i=e;return}h[Fc>>3]=sc;h[Ea>>3]=nc;i=e;return}else if((Ja|0)==21){Ea=ra;Fc=c[Ea+4>>2]|0;Gc=c[Ea>>2]|0;Ea=Fc-(c[Gc>>2]|0)|0;Da=Ea>>3;Ec=Da+1|0;if((Ea|0)>-8){Hc=(c[Gc+(((Ec|0)/512|0)<<2)>>2]|0)+(((Ec|0)%512|0)<<3)|0}else{Ec=510-Da|0;Hc=(c[Gc+(((Ec|0)/-512|0)<<2)>>2]|0)+(511-((Ec|0)%512|0)<<3)|0}Ec=Da+2|0;if((Ec|0)>0){Ic=(c[Gc+(((Ec|0)/512|0)<<2)>>2]|0)+(((Ec|0)%512|0)<<3)|0}else{Ec=509-Da|0;Ic=(c[Gc+(((Ec|0)/-512|0)<<2)>>2]|0)+(511-((Ec|0)%512|0)<<3)|0}if((Ca|0)==(c[Aa>>2]|0)){Ec=Aa+ -4|0;c[qa>>2]=Ec;Gc=(c[Ec>>2]|0)+4096|0;c[na>>2]=Gc;Jc=Gc}else{Jc=Ca}c[na>>2]=Jc+ -8;Jc=Fc;Fc=c[sa+4>>2]|0;nc=+h[Hc>>3];sc=+h[Jc>>3];Db=+h[Ic>>3];Ca=Db<nc;do{if(nc<sc){if(Ca){h[Jc>>3]=Db;h[Ic>>3]=sc;Kc=sc;break}h[Jc>>3]=nc;h[Hc>>3]=sc;vb=+h[Ic>>3];if(!(vb<sc)){Kc=vb;break}h[Hc>>3]=vb;h[Ic>>3]=sc;Kc=sc}else{if(!Ca){Kc=Db;break}h[Hc>>3]=Db;h[Ic>>3]=nc;vb=+h[Hc>>3];Qb=+h[Jc>>3];if(!(vb<Qb)){Kc=nc;break}h[Jc>>3]=vb;h[Hc>>3]=Qb;Kc=+h[Ic>>3]}}while(0);nc=+h[Fc>>3];if(!(nc<Kc)){i=e;return}h[Ic>>3]=nc;h[Fc>>3]=Kc;Kc=+h[Ic>>3];nc=+h[Hc>>3];if(!(Kc<nc)){i=e;return}h[Hc>>3]=Kc;h[Ic>>3]=nc;nc=+h[Hc>>3];Kc=+h[Jc>>3];if(!(nc<Kc)){i=e;return}h[Jc>>3]=nc;h[Hc>>3]=Kc;i=e;return}else if((Ja|0)==41){Hc=ra;ra=c[Hc>>2]|0;Jc=c[Hc+4>>2]|0;Hc=B;c[Hc>>2]=ra;c[Hc+4>>2]=Jc;Hc=D;c[Hc>>2]=ra;c[Hc+4>>2]=Jc;Hc=ra;B=D;D=Jc-(c[Hc>>2]|0)|0;Ic=D>>3;Fc=Ic+1|0;if((D|0)>-8){D=Hc+(((Fc|0)/512|0)<<2)|0;c[B>>2]=D;Lc=(c[D>>2]|0)+(((Fc|0)%512|0)<<3)|0}else{Fc=510-Ic|0;Ic=Hc+(((Fc|0)/-512|0)<<2)|0;c[B>>2]=Ic;Lc=(c[Ic>>2]|0)+(511-((Fc|0)%512|0)<<3)|0}c[E+4>>2]=Lc;Lc=F;c[Lc>>2]=ra;c[Lc+4>>2]=Jc;Lc=F;F=Jc-(c[Hc>>2]|0)>>3;Fc=F+2|0;if((Fc|0)>0){Ic=Hc+(((Fc|0)/512|0)<<2)|0;c[Lc>>2]=Ic;Mc=(c[Ic>>2]|0)+(((Fc|0)%512|0)<<3)|0}else{Fc=509-F|0;F=Hc+(((Fc|0)/-512|0)<<2)|0;c[Lc>>2]=F;Mc=(c[F>>2]|0)+(511-((Fc|0)%512|0)<<3)|0}c[G+4>>2]=Mc;Mc=H;c[Mc>>2]=ra;c[Mc+4>>2]=Jc;Mc=H;H=Jc-(c[Hc>>2]|0)>>3;Jc=H+3|0;if((Jc|0)>0){ra=Hc+(((Jc|0)/512|0)<<2)|0;c[Mc>>2]=ra;Nc=(c[ra>>2]|0)+(((Jc|0)%512|0)<<3)|0}else{Jc=508-H|0;H=Hc+(((Jc|0)/-512|0)<<2)|0;c[Mc>>2]=H;Nc=(c[H>>2]|0)+(511-((Jc|0)%512|0)<<3)|0}c[I+4>>2]=Nc;if((Ba|0)==(c[Aa>>2]|0)){Nc=Aa+ -4|0;c[qa>>2]=Nc;qa=(c[Nc>>2]|0)+4096|0;c[na>>2]=qa;Oc=qa}else{Oc=Ba}c[na>>2]=Oc+ -8;Oc=sa;na=c[Oc+4>>2]|0;Ba=J;c[Ba>>2]=c[Oc>>2];c[Ba+4>>2]=na;na=A;Ba=C;c[na+0>>2]=c[Ba+0>>2];c[na+4>>2]=c[Ba+4>>2];Ba=z;na=E;c[Ba+0>>2]=c[na+0>>2];c[Ba+4>>2]=c[na+4>>2];na=y;Ba=G;c[na+0>>2]=c[Ba+0>>2];c[na+4>>2]=c[Ba+4>>2];Ba=x;na=I;c[Ba+0>>2]=c[na+0>>2];c[Ba+4>>2]=c[na+4>>2];na=w;Ba=K;c[na+0>>2]=c[Ba+0>>2];c[na+4>>2]=c[Ba+4>>2];dd(A,z,y,x,w,0)|0;i=e;return}else if((Ja|0)==54){w=L;c[w>>2]=La;c[w+4>>2]=Ma;Ma=sa;sa=c[Ma+4>>2]|0;w=N;c[w>>2]=c[Ma>>2];c[w+4>>2]=sa;sa=v;w=M;c[sa+0>>2]=c[w+0>>2];c[sa+4>>2]=c[w+4>>2];w=u;sa=O;c[w+0>>2]=c[sa+0>>2];c[w+4>>2]=c[sa+4>>2];ed(v,u,0);i=e;return}else if((Ja|0)==155){i=e;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 j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0;g=i;j=c[a+4>>2]|0;k=c[b+4>>2]|0;l=c[d+4>>2]|0;m=c[e+4>>2]|0;n=+h[k>>3];o=+h[j>>3];p=+h[l>>3];q=p<n;do{if(n<o){if(q){h[j>>3]=p;h[l>>3]=o;r=1;s=o;break}h[j>>3]=n;h[k>>3]=o;t=+h[l>>3];if(!(t<o)){r=1;s=t;break}h[k>>3]=t;h[l>>3]=o;r=2;s=o}else{if(!q){r=0;s=p;break}h[k>>3]=p;h[l>>3]=n;t=+h[k>>3];u=+h[j>>3];if(!(t<u)){r=1;s=n;break}h[j>>3]=t;h[k>>3]=u;r=2;s=+h[l>>3]}}while(0);n=+h[m>>3];do{if(n<s){h[l>>3]=n;h[m>>3]=s;p=+h[l>>3];o=+h[k>>3];if(!(p<o)){v=r+1|0;break}h[k>>3]=p;h[l>>3]=o;o=+h[k>>3];p=+h[j>>3];if(!(o<p)){v=r+2|0;break}h[j>>3]=o;h[k>>3]=p;v=r+3|0}else{v=r}}while(0);r=c[f+4>>2]|0;f=c[e+4>>2]|0;s=+h[r>>3];n=+h[f>>3];if(!(s<n)){w=v;i=g;return w|0}h[f>>3]=s;h[r>>3]=n;r=c[d+4>>2]|0;n=+h[f>>3];s=+h[r>>3];if(!(n<s)){w=v+1|0;i=g;return w|0}h[r>>3]=n;h[f>>3]=s;f=c[b+4>>2]|0;s=+h[r>>3];n=+h[f>>3];if(!(s<n)){w=v+2|0;i=g;return w|0}h[f>>3]=s;h[r>>3]=n;r=c[a+4>>2]|0;n=+h[f>>3];s=+h[r>>3];if(!(n<s)){w=v+3|0;i=g;return w|0}h[r>>3]=n;h[f>>3]=s;w=v+4|0;i=g;return w|0}function ed(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;e=a;f=c[e+4>>2]|0;g=c[e>>2]|0;e=f-(c[g>>2]|0)|0;j=e>>3;k=j+2|0;if((k|0)>0){l=g+(((k|0)/512|0)<<2)|0;m=c[l>>2]|0;n=m;o=m+(((k|0)%512|0)<<3)|0;p=l}else{l=509-j|0;k=g+(((l|0)/-512|0)<<2)|0;m=c[k>>2]|0;n=m;o=m+(511-((l|0)%512|0)<<3)|0;p=k}k=j+1|0;if((e|0)>-8){q=(c[g+(((k|0)/512|0)<<2)>>2]|0)+(((k|0)%512|0)<<3)|0}else{k=510-j|0;q=(c[g+(((k|0)/-512|0)<<2)>>2]|0)+(511-((k|0)%512|0)<<3)|0}k=o;g=f;r=+h[q>>3];s=+h[g>>3];t=+h[o>>3];f=t<r;do{if(r<s){if(f){h[g>>3]=t;h[o>>3]=s;break}h[g>>3]=r;h[q>>3]=s;u=+h[o>>3];if(!(u<s)){break}h[q>>3]=u;h[o>>3]=s}else{if(!f){break}h[q>>3]=t;h[o>>3]=r;u=+h[q>>3];v=+h[g>>3];if(!(u<v)){break}h[g>>3]=u;h[q>>3]=v}}while(0);q=k-n|0;n=q>>3;k=n+1|0;if((q|0)>-8){q=p+(((k|0)/512|0)<<2)|0;g=c[q>>2]|0;w=g+(((k|0)%512|0)<<3)|0;x=q;y=g}else{g=510-n|0;n=p+(((g|0)/-512|0)<<2)|0;q=c[n>>2]|0;w=q+(511-((g|0)%512|0)<<3)|0;x=n;y=q}q=c[b+4>>2]|0;b=c[a+4>>2]|0;a=o;o=p;p=w;w=x;x=y;a:while(1){y=a;n=o;g=p;while(1){if((g|0)==(q|0)){break a}r=+h[g>>3];t=+h[y>>3];if(r<t){s=t;k=g;f=y;j=n;while(1){h[k>>3]=s;if((f|0)==(b|0)){z=b;break}if((f|0)==(c[j>>2]|0)){e=j+ -4|0;A=e;B=(c[e>>2]|0)+4096|0}else{A=j;B=f}e=B+ -8|0;t=+h[e>>3];if(r<t){l=f;s=t;f=e;j=A;k=l}else{z=f;break}}h[z>>3]=r}f=g+8|0;if((f-x|0)==4096){break}else{k=g;n=w;g=f;y=k}}y=w+4|0;n=c[y>>2]|0;k=w;a=g;p=n;w=y;x=n;o=k}i=d;return}function fd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=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.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.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;d=i;i=i+56|0;e=d;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+40|0;m=d+48|0;n=m;o=i;i=i+8|0;p=o;q=i;i=i+8|0;r=q;s=i;i=i+8|0;t=b+4|0;u=c[t>>2]|0;v=c[a+4>>2]|0;if((u|0)==(v|0)){w=1;i=d;return w|0}x=b;y=c[x>>2]|0;z=c[a>>2]|0;A=c[y>>2]|0;switch((u-A>>3)+(y-z<<7)-(v-(c[z>>2]|0)>>3)|0){case 4:{z=a;B=c[z+4>>2]|0;C=c[z>>2]|0;z=B-(c[C>>2]|0)|0;D=z>>3;E=D+1|0;if((z|0)>-8){F=(c[C+(((E|0)/512|0)<<2)>>2]|0)+(((E|0)%512|0)<<3)|0}else{E=510-D|0;F=(c[C+(((E|0)/-512|0)<<2)>>2]|0)+(511-((E|0)%512|0)<<3)|0}E=D+2|0;if((E|0)>0){G=(c[C+(((E|0)/512|0)<<2)>>2]|0)+(((E|0)%512|0)<<3)|0}else{E=509-D|0;G=(c[C+(((E|0)/-512|0)<<2)>>2]|0)+(511-((E|0)%512|0)<<3)|0}if((u|0)==(A|0)){E=y+ -4|0;c[x>>2]=E;C=(c[E>>2]|0)+4096|0;c[t>>2]=C;H=C}else{H=u}c[t>>2]=H+ -8;H=B;B=c[b+4>>2]|0;I=+h[F>>3];J=+h[H>>3];K=+h[G>>3];C=K<I;do{if(I<J){if(C){h[H>>3]=K;h[G>>3]=J;L=J;break}h[H>>3]=I;h[F>>3]=J;M=+h[G>>3];if(!(M<J)){L=M;break}h[F>>3]=M;h[G>>3]=J;L=J}else{if(!C){L=K;break}h[F>>3]=K;h[G>>3]=I;M=+h[F>>3];N=+h[H>>3];if(!(M<N)){L=I;break}h[H>>3]=M;h[F>>3]=N;L=+h[G>>3]}}while(0);I=+h[B>>3];if(!(I<L)){w=1;i=d;return w|0}h[G>>3]=I;h[B>>3]=L;L=+h[G>>3];I=+h[F>>3];if(!(L<I)){w=1;i=d;return w|0}h[F>>3]=L;h[G>>3]=I;I=+h[F>>3];L=+h[H>>3];if(!(I<L)){w=1;i=d;return w|0}h[H>>3]=I;h[F>>3]=L;w=1;i=d;return w|0};case 2:{if((u|0)==(A|0)){F=y+ -4|0;c[x>>2]=F;H=(c[F>>2]|0)+4096|0;c[t>>2]=H;O=H}else{O=u}H=O+ -8|0;c[t>>2]=H;L=+h[H>>3];I=+h[v>>3];if(!(L<I)){w=1;i=d;return w|0}h[v>>3]=L;h[H>>3]=I;w=1;i=d;return w|0};case 3:{H=a;O=c[H+4>>2]|0;F=c[H>>2]|0;H=O-(c[F>>2]|0)|0;G=H>>3;B=G+1|0;if((H|0)>-8){P=(c[F+(((B|0)/512|0)<<2)>>2]|0)+(((B|0)%512|0)<<3)|0}else{B=510-G|0;P=(c[F+(((B|0)/-512|0)<<2)>>2]|0)+(511-((B|0)%512|0)<<3)|0}if((u|0)==(A|0)){B=y+ -4|0;c[x>>2]=B;F=(c[B>>2]|0)+4096|0;c[t>>2]=F;Q=F}else{Q=u}c[t>>2]=Q+ -8;Q=O;O=c[b+4>>2]|0;I=+h[P>>3];L=+h[Q>>3];K=+h[O>>3];F=K<I;if(!(I<L)){if(!F){w=1;i=d;return w|0}h[P>>3]=K;h[O>>3]=I;J=+h[P>>3];N=+h[Q>>3];if(!(J<N)){w=1;i=d;return w|0}h[Q>>3]=J;h[P>>3]=N;w=1;i=d;return w|0}if(F){h[Q>>3]=K;h[O>>3]=L;w=1;i=d;return w|0}h[Q>>3]=I;h[P>>3]=L;I=+h[O>>3];if(!(I<L)){w=1;i=d;return w|0}h[P>>3]=I;h[O>>3]=L;w=1;i=d;return w|0};case 1:case 0:{w=1;i=d;return w|0};case 5:{O=a;P=c[O>>2]|0;Q=c[O+4>>2]|0;O=l;c[O>>2]=P;c[O+4>>2]=Q;O=m;c[O>>2]=P;c[O+4>>2]=Q;O=P;F=m;m=Q-(c[O>>2]|0)|0;B=m>>3;G=B+1|0;if((m|0)>-8){m=O+(((G|0)/512|0)<<2)|0;c[F>>2]=m;R=(c[m>>2]|0)+(((G|0)%512|0)<<3)|0}else{G=510-B|0;B=O+(((G|0)/-512|0)<<2)|0;c[F>>2]=B;R=(c[B>>2]|0)+(511-((G|0)%512|0)<<3)|0}c[n+4>>2]=R;R=o;c[R>>2]=P;c[R+4>>2]=Q;R=o;o=Q-(c[O>>2]|0)>>3;G=o+2|0;if((G|0)>0){B=O+(((G|0)/512|0)<<2)|0;c[R>>2]=B;S=(c[B>>2]|0)+(((G|0)%512|0)<<3)|0}else{G=509-o|0;o=O+(((G|0)/-512|0)<<2)|0;c[R>>2]=o;S=(c[o>>2]|0)+(511-((G|0)%512|0)<<3)|0}c[p+4>>2]=S;S=q;c[S>>2]=P;c[S+4>>2]=Q;S=q;q=Q-(c[O>>2]|0)>>3;Q=q+3|0;if((Q|0)>0){P=O+(((Q|0)/512|0)<<2)|0;c[S>>2]=P;T=(c[P>>2]|0)+(((Q|0)%512|0)<<3)|0}else{Q=508-q|0;q=O+(((Q|0)/-512|0)<<2)|0;c[S>>2]=q;T=(c[q>>2]|0)+(511-((Q|0)%512|0)<<3)|0}c[r+4>>2]=T;if((u|0)==(A|0)){A=y+ -4|0;c[x>>2]=A;x=(c[A>>2]|0)+4096|0;c[t>>2]=x;U=x}else{U=u}c[t>>2]=U+ -8;U=b;b=c[U+4>>2]|0;t=s;c[t>>2]=c[U>>2];c[t+4>>2]=b;b=k;t=l;c[b+0>>2]=c[t+0>>2];c[b+4>>2]=c[t+4>>2];t=j;b=n;c[t+0>>2]=c[b+0>>2];c[t+4>>2]=c[b+4>>2];b=g;t=p;c[b+0>>2]=c[t+0>>2];c[b+4>>2]=c[t+4>>2];t=f;b=r;c[t+0>>2]=c[b+0>>2];c[t+4>>2]=c[b+4>>2];b=e;t=s;c[b+0>>2]=c[t+0>>2];c[b+4>>2]=c[t+4>>2];dd(k,j,g,f,e,0)|0;w=1;i=d;return w|0};default:{e=a;a=c[e+4>>2]|0;f=c[e>>2]|0;e=a-(c[f>>2]|0)|0;g=e>>3;j=g+2|0;if((j|0)>0){k=f+(((j|0)/512|0)<<2)|0;t=c[k>>2]|0;V=t;W=t+(((j|0)%512|0)<<3)|0;X=k}else{k=509-g|0;j=f+(((k|0)/-512|0)<<2)|0;t=c[j>>2]|0;V=t;W=t+(511-((k|0)%512|0)<<3)|0;X=j}j=g+1|0;if((e|0)>-8){Y=(c[f+(((j|0)/512|0)<<2)>>2]|0)+(((j|0)%512|0)<<3)|0}else{j=510-g|0;Y=(c[f+(((j|0)/-512|0)<<2)>>2]|0)+(511-((j|0)%512|0)<<3)|0}j=W;f=a;L=+h[Y>>3];I=+h[f>>3];K=+h[W>>3];a=K<L;do{if(L<I){if(a){h[f>>3]=K;h[W>>3]=I;break}h[f>>3]=L;h[Y>>3]=I;N=+h[W>>3];if(!(N<I)){break}h[Y>>3]=N;h[W>>3]=I}else{if(!a){break}h[Y>>3]=K;h[W>>3]=L;N=+h[Y>>3];J=+h[f>>3];if(!(N<J)){break}h[f>>3]=N;h[Y>>3]=J}}while(0);Y=j-V|0;V=Y>>3;j=V+1|0;if((Y|0)>-8){Y=X+(((j|0)/512|0)<<2)|0;f=c[Y>>2]|0;Z=W;_=X;$=f+(((j|0)%512|0)<<3)|0;aa=Y;ba=f;ca=0}else{f=510-V|0;V=X+(((f|0)/-512|0)<<2)|0;Y=c[V>>2]|0;Z=W;_=X;$=Y+(511-((f|0)%512|0)<<3)|0;aa=V;ba=Y;ca=0}a:while(1){Y=Z;V=_;da=$;f=ca;while(1){if((da|0)==(u|0)){w=1;ea=82;break a}L=+h[da>>3];K=+h[Y>>3];if(L<K){I=K;X=da;W=Y;j=V;while(1){h[X>>3]=I;if((W|0)==(v|0)){fa=v;break}if((W|0)==(c[j>>2]|0)){a=j+ -4|0;ga=a;ha=(c[a>>2]|0)+4096|0}else{ga=j;ha=W}a=ha+ -8|0;K=+h[a>>3];if(L<K){g=W;I=K;W=a;j=ga;X=g}else{fa=W;break}}h[fa>>3]=L;W=f+1|0;if((W|0)==8){break a}else{ia=W}}else{ia=f}W=da+8|0;if((W-ba|0)==4096){break}else{X=da;V=aa;da=W;f=ia;Y=X}}Y=aa+4|0;f=c[Y>>2]|0;V=aa;Z=da;$=f;aa=Y;ba=f;ca=ia;_=V}if((ea|0)==82){i=d;return w|0}ea=da+8|0;if((ea-ba|0)==4096){ja=c[aa+4>>2]|0}else{ja=ea}w=(ja|0)==(u|0);i=d;return w|0}}return 0}function gd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;d=a+4|0;e=c[d>>2]|0;f=a+16|0;g=c[f>>2]|0;h=e+(g>>>9<<2)|0;j=a+8|0;k=c[j>>2]|0;if((k|0)==(e|0)){l=a+20|0;m=0;n=0}else{o=a+20|0;p=(c[o>>2]|0)+g|0;l=o;m=(c[h>>2]|0)+((g&511)<<3)|0;n=(c[e+(p>>>9<<2)>>2]|0)+((p&511)<<3)|0}p=m;m=h;a:while(1){h=p;do{if((h|0)==(n|0)){break a}h=h+8|0;}while((h-(c[m>>2]|0)|0)!=4096);h=m+4|0;p=c[h>>2]|0;m=h}c[l>>2]=0;l=k-e>>2;if(l>>>0>2){k=e;while(1){Om(c[k>>2]|0);e=(c[d>>2]|0)+4|0;c[d>>2]=e;m=(c[j>>2]|0)-e>>2;if(m>>>0>2){k=e}else{q=m;break}}}else{q=l}if((q|0)==1){c[f>>2]=256}else if((q|0)==2){c[f>>2]=512}f=c[d>>2]|0;q=c[j>>2]|0;do{if((f|0)!=(q|0)){l=f;do{Om(c[l>>2]|0);l=l+4|0;}while((l|0)!=(q|0));l=c[d>>2]|0;k=c[j>>2]|0;if((k|0)==(l|0)){break}c[j>>2]=k+(~((k+ -4+(0-l)|0)>>>2)<<2)}}while(0);j=c[a>>2]|0;if((j|0)==0){i=b;return}Om(j);i=b;return}function hd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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,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;d=i;i=i+32|0;e=d;f=d+8|0;g=a;h=a+8|0;j=c[h>>2]|0;k=a+4|0;l=c[k>>2]|0;m=((j|0)==(l|0))+b|0;b=((m&511|0)!=0)+(m>>>9)|0;m=a+16|0;n=c[m>>2]|0;o=n>>>9;p=b>>>0<o>>>0?b:o;q=b-p|0;if((b|0)==(p|0)){c[m>>2]=n-(b<<9);if((b|0)==0){i=d;return}n=a+12|0;r=a;s=l;t=j;u=b;while(1){v=c[s>>2]|0;w=s+4|0;c[k>>2]=w;do{if((t|0)==(c[n>>2]|0)){x=c[r>>2]|0;if(w>>>0>x>>>0){y=w;z=((y-x>>2)+1|0)/-2|0;A=t-y|0;gn(s+(z+1<<2)|0,w|0,A|0)|0;y=s+((A>>2)+1+z<<2)|0;c[h>>2]=y;c[k>>2]=(c[k>>2]|0)+(z<<2);B=y;C=15;break}y=t-x>>1;z=(y|0)==0?1:y;y=Mm(z<<2)|0;A=y+(z>>>2<<2)|0;D=y+(z<<2)|0;if((w|0)==(t|0)){E=x;F=A}else{x=A;z=w;do{if((x|0)==0){G=0}else{c[x>>2]=c[z>>2];G=x}x=G+4|0;z=z+4|0;}while((z|0)!=(t|0));E=c[r>>2]|0;F=x}c[r>>2]=y;c[k>>2]=A;c[h>>2]=F;c[n>>2]=D;if((E|0)==0){H=F;C=14;break}Om(E);H=c[h>>2]|0;C=14}else{H=t;C=14}}while(0);if((C|0)==14){C=0;if((H|0)==0){I=0}else{B=H;C=15}}if((C|0)==15){C=0;c[B>>2]=v;I=c[h>>2]|0}w=I+4|0;c[h>>2]=w;z=u+ -1|0;if((z|0)==0){break}s=c[k>>2]|0;t=w;u=z}i=d;return}u=a+12|0;t=c[u>>2]|0;s=a;I=t-(c[s>>2]|0)|0;B=j-l>>2;if(!(q>>>0>((I>>2)-B|0)>>>0)){l=t;t=j;j=q;while(1){if((l|0)==(t|0)){C=19;break}H=Mm(4096)|0;if((t|0)==0){J=0}else{c[t>>2]=H;J=c[h>>2]|0}H=J+4|0;c[h>>2]=H;E=j+ -1|0;if((E|0)==0){K=H;C=20;break}l=c[u>>2]|0;t=H;j=E}do{if((C|0)==19){if((j|0)==0){K=l;C=20;break}t=~o;J=~b;E=t>>>0>J>>>0?t:J;J=j;do{c[e>>2]=Mm(4096)|0;id(g,e);J=J+ -1|0;L=c[h>>2]|0;M=(c[m>>2]|0)+512+(((L-(c[k>>2]|0)|0)==4)<<31>>31)|0;c[m>>2]=M;}while((J|0)!=0);N=j+ -1-E|0;O=M;P=L}}while(0);if((C|0)==20){N=p;O=c[m>>2]|0;P=K}c[m>>2]=O-(N<<9);if((N|0)==0){i=d;return}else{Q=P;R=N}do{N=c[k>>2]|0;P=c[N>>2]|0;O=N+4|0;c[k>>2]=O;do{if((Q|0)==(c[u>>2]|0)){K=c[s>>2]|0;if(O>>>0>K>>>0){L=O;M=((L-K>>2)+1|0)/-2|0;j=Q-L|0;gn(N+(M+1<<2)|0,O|0,j|0)|0;L=N+((j>>2)+1+M<<2)|0;c[h>>2]=L;c[k>>2]=(c[k>>2]|0)+(M<<2);S=L;C=41;break}L=Q-K>>1;M=(L|0)==0?1:L;L=Mm(M<<2)|0;j=L+(M>>>2<<2)|0;e=L+(M<<2)|0;if((O|0)==(Q|0)){T=K;U=j}else{K=j;M=O;do{if((K|0)==0){V=0}else{c[K>>2]=c[M>>2];V=K}K=V+4|0;M=M+4|0;}while((M|0)!=(Q|0));T=c[s>>2]|0;U=K}c[s>>2]=L;c[k>>2]=j;c[h>>2]=U;c[u>>2]=e;if((T|0)==0){W=U;C=40;break}Om(T);W=c[h>>2]|0;C=40}else{W=Q;C=40}}while(0);if((C|0)==40){C=0;if((W|0)==0){X=0}else{S=W;C=41}}if((C|0)==41){C=0;c[S>>2]=P;X=c[h>>2]|0}Q=X+4|0;c[h>>2]=Q;R=R+ -1|0;}while((R|0)!=0);i=d;return}R=p<<9;Q=I>>1;I=q+B|0;X=Q>>>0<I>>>0?I:Q;Q=f+12|0;c[Q>>2]=0;c[f+16>>2]=a+12;if((X|0)==0){Y=0}else{Y=Mm(X<<2)|0}a=f;c[a>>2]=Y;I=Y+(B-p<<2)|0;B=f+8|0;c[B>>2]=I;S=f+4|0;c[S>>2]=I;c[Q>>2]=Y+(X<<2);X=I;I=q;do{q=Mm(4096)|0;do{if((X|0)==(c[Q>>2]|0)){Y=c[S>>2]|0;W=c[a>>2]|0;if(Y>>>0>W>>>0){T=Y;U=((T-W>>2)+1|0)/-2|0;V=Y+(U<<2)|0;O=X-T|0;gn(V|0,Y|0,O|0)|0;T=Y+(U+(O>>2)<<2)|0;c[B>>2]=T;c[S>>2]=V;Z=T;break}T=X-W>>1;V=(T|0)==0?1:T;T=Mm(V<<2)|0;O=T+(V>>>2<<2)|0;U=T+(V<<2)|0;if((Y|0)==(X|0)){_=O;$=W}else{W=O;V=Y;do{if((W|0)==0){aa=0}else{c[W>>2]=c[V>>2];aa=W}W=aa+4|0;V=V+4|0;}while((V|0)!=(X|0));_=W;$=c[a>>2]|0}c[a>>2]=T;c[S>>2]=O;c[B>>2]=_;c[Q>>2]=U;if(($|0)==0){Z=_;break}Om($);Z=_}else{Z=X}}while(0);if((Z|0)==0){ba=0}else{c[Z>>2]=q;ba=c[B>>2]|0}X=ba+4|0;c[B>>2]=X;I=I+ -1|0;}while((I|0)!=0);if((p|0)!=0){I=X;X=c[k>>2]|0;ba=p;do{if((I|0)==(c[Q>>2]|0)){p=c[S>>2]|0;Z=c[a>>2]|0;do{if(p>>>0>Z>>>0){_=p;$=((_-Z>>2)+1|0)/-2|0;aa=p+($<<2)|0;P=I-_|0;gn(aa|0,p|0,P|0)|0;_=p+($+(P>>2)<<2)|0;c[B>>2]=_;c[S>>2]=aa;ca=_}else{_=I-Z>>1;aa=(_|0)==0?1:_;_=Mm(aa<<2)|0;P=_+(aa>>>2<<2)|0;$=_+(aa<<2)|0;if((p|0)==(I|0)){da=P;ea=Z}else{aa=P;V=p;do{if((aa|0)==0){fa=0}else{c[aa>>2]=c[V>>2];fa=aa}aa=fa+4|0;V=V+4|0;}while((V|0)!=(I|0));da=aa;ea=c[a>>2]|0}c[a>>2]=_;c[S>>2]=P;c[B>>2]=da;c[Q>>2]=$;if((ea|0)==0){ca=da;break}Om(ea);ca=da}}while(0);if((ca|0)==0){ga=0}else{ha=ca;C=72}}else{ha=I;C=72}if((C|0)==72){C=0;c[ha>>2]=c[X>>2];ga=c[B>>2]|0}I=ga+4|0;c[B>>2]=I;X=(c[k>>2]|0)+4|0;c[k>>2]=X;ba=ba+ -1|0;}while((ba|0)!=0)}ba=c[h>>2]|0;while(1){if((ba|0)==(c[k>>2]|0)){break}X=ba+ -4|0;jd(f,X);ba=X}f=c[s>>2]|0;c[s>>2]=c[a>>2];c[a>>2]=f;c[k>>2]=c[S>>2];c[S>>2]=ba;S=c[h>>2]|0;c[h>>2]=c[B>>2];c[B>>2]=S;h=c[u>>2]|0;c[u>>2]=c[Q>>2];c[Q>>2]=h;c[m>>2]=(c[m>>2]|0)-R;if((S|0)!=(ba|0)){c[B>>2]=S+(~((S+ -4+(0-ba)|0)>>>2)<<2)}if((f|0)==0){i=d;return}Om(f);i=d;return}function id(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;e=a+4|0;f=c[e>>2]|0;g=a;do{if((f|0)==(c[g>>2]|0)){h=a+8|0;j=c[h>>2]|0;k=a+12|0;l=c[k>>2]|0;m=l;if(j>>>0<l>>>0){l=j;n=((m-l>>2)+1|0)/2|0;o=l-f|0;l=j+(n-(o>>2)<<2)|0;gn(l|0,f|0,o|0)|0;c[e>>2]=l;c[h>>2]=(c[h>>2]|0)+(n<<2);p=l;break}l=m-f>>1;m=(l|0)==0?1:l;l=Mm(m<<2)|0;n=l+((m+3|0)>>>2<<2)|0;o=l+(m<<2)|0;if((f|0)==(j|0)){q=f;r=n}else{m=n;s=f;do{if((m|0)==0){t=0}else{c[m>>2]=c[s>>2];t=m}m=t+4|0;s=s+4|0;}while((s|0)!=(j|0));q=c[g>>2]|0;r=m}c[g>>2]=l;c[e>>2]=n;c[h>>2]=r;c[k>>2]=o;if((q|0)==0){p=n;break}Om(q);p=c[e>>2]|0}else{p=f}}while(0);c[p+ -4>>2]=c[b>>2];c[e>>2]=(c[e>>2]|0)+ -4;i=d;return}function jd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;e=a+4|0;f=c[e>>2]|0;g=a;do{if((f|0)==(c[g>>2]|0)){h=a+8|0;j=c[h>>2]|0;k=a+12|0;l=c[k>>2]|0;m=l;if(j>>>0<l>>>0){l=j;n=((m-l>>2)+1|0)/2|0;o=l-f|0;l=j+(n-(o>>2)<<2)|0;gn(l|0,f|0,o|0)|0;c[e>>2]=l;c[h>>2]=(c[h>>2]|0)+(n<<2);p=l;break}l=m-f>>1;m=(l|0)==0?1:l;l=Mm(m<<2)|0;n=l+((m+3|0)>>>2<<2)|0;o=l+(m<<2)|0;if((f|0)==(j|0)){q=f;r=n}else{m=n;s=f;do{if((m|0)==0){t=0}else{c[m>>2]=c[s>>2];t=m}m=t+4|0;s=s+4|0;}while((s|0)!=(j|0));q=c[g>>2]|0;r=m}c[g>>2]=l;c[e>>2]=n;c[h>>2]=r;c[k>>2]=o;if((q|0)==0){p=n;break}Om(q);p=c[e>>2]|0}else{p=f}}while(0);c[p+ -4>>2]=c[b>>2];c[e>>2]=(c[e>>2]|0)+ -4;i=d;return}function kd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0;f=i;g=+h[b>>3];j=+h[a>>3];k=+h[c>>3];l=k<g;do{if(g<j){if(l){h[a>>3]=k;h[c>>3]=j;m=1;n=j;break}h[a>>3]=g;h[b>>3]=j;o=+h[c>>3];if(!(o<j)){m=1;n=o;break}h[b>>3]=o;h[c>>3]=j;m=2;n=j}else{if(!l){m=0;n=k;break}h[b>>3]=k;h[c>>3]=g;o=+h[b>>3];p=+h[a>>3];if(!(o<p)){m=1;n=g;break}h[a>>3]=o;h[b>>3]=p;m=2;n=+h[c>>3]}}while(0);g=+h[d>>3];do{if(g<n){h[c>>3]=g;h[d>>3]=n;k=+h[c>>3];j=+h[b>>3];if(!(k<j)){q=m+1|0;break}h[b>>3]=k;h[c>>3]=j;j=+h[b>>3];k=+h[a>>3];if(j<k){h[a>>3]=j;h[b>>3]=k;q=m+3|0;break}else{q=m+2|0;break}}else{q=m}}while(0);n=+h[e>>3];g=+h[d>>3];if(!(n<g)){r=q;i=f;return r|0}h[d>>3]=n;h[e>>3]=g;g=+h[d>>3];n=+h[c>>3];if(!(g<n)){r=q+1|0;i=f;return r|0}h[c>>3]=g;h[d>>3]=n;n=+h[c>>3];g=+h[b>>3];if(!(n<g)){r=q+2|0;i=f;return r|0}h[b>>3]=n;h[c>>3]=g;g=+h[b>>3];n=+h[a>>3];if(!(g<n)){r=q+3|0;i=f;return r|0}h[a>>3]=g;h[b>>3]=n;r=q+4|0;i=f;return r|0}function ld(){var a=0;a=i;c[2]=0;c[12>>2]=0;c[16>>2]=0;Zb(111,8,p|0)|0;i=a;return}function md(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,$=0;d=i;e=a;a=b;a:while(1){b=a;f=a+ -8|0;g=e;b:while(1){j=g;k=b-j|0;l=k>>3;switch(l|0){case 5:{m=26;break a;break};case 3:{m=6;break a;break};case 1:case 0:{m=84;break a;break};case 2:{m=4;break a;break};case 4:{m=14;break a;break};default:{}}if((k|0)<248){m=28;break a}n=(l|0)/2|0;o=g+(n<<3)|0;do{if((k|0)>7992){p=(l|0)/4|0;q=kd(g,g+(p<<3)|0,o,g+(p+n<<3)|0,f,0)|0}else{r=+h[o>>3];s=+h[g>>3];t=+h[f>>3];p=t<r;if(!(r<s)){if(!p){q=0;break}h[o>>3]=t;h[f>>3]=r;u=+h[o>>3];v=+h[g>>3];if(!(u<v)){q=1;break}h[g>>3]=u;h[o>>3]=v;q=2;break}if(p){h[g>>3]=t;h[f>>3]=s;q=1;break}h[g>>3]=r;h[o>>3]=s;r=+h[f>>3];if(!(r<s)){q=1;break}h[o>>3]=r;h[f>>3]=s;q=2}}while(0);s=+h[g>>3];r=+h[o>>3];do{if(s<r){w=f;x=q}else{n=f;while(1){y=n+ -8|0;if((g|0)==(y|0)){break}z=+h[y>>3];if(z<r){m=67;break}else{n=y}}if((m|0)==67){m=0;h[g>>3]=z;h[y>>3]=s;w=y;x=q+1|0;break}n=g+8|0;t=+h[f>>3];if(s<t){A=n}else{if((n|0)==(f|0)){m=84;break a}else{B=n}while(1){C=+h[B>>3];D=B+8|0;if(s<C){break}if((D|0)==(f|0)){m=84;break a}else{B=D}}h[B>>3]=t;h[f>>3]=C;A=D}if((A|0)==(f|0)){m=84;break a}else{E=A;F=f}while(1){v=+h[g>>3];n=E;while(1){G=+h[n>>3];H=n+8|0;if(v<G){I=F;break}else{n=H}}do{I=I+ -8|0;J=+h[I>>3];}while(v<J);if(!(n>>>0<I>>>0)){g=n;continue b}h[n>>3]=J;h[I>>3]=G;E=H;F=I}}}while(0);l=g+8|0;c:do{if(l>>>0<w>>>0){k=l;p=w;K=o;L=x;while(1){s=+h[K>>3];M=k;while(1){N=+h[M>>3];O=M+8|0;if(N<s){M=O}else{P=p;break}}do{P=P+ -8|0;Q=+h[P>>3];}while(!(Q<s));if(M>>>0>P>>>0){R=M;S=K;T=L;break c}h[M>>3]=Q;h[P>>3]=N;k=O;p=P;K=(K|0)==(M|0)?P:K;L=L+1|0}}else{R=l;S=o;T=x}}while(0);do{if((R|0)==(S|0)){U=T}else{s=+h[S>>3];r=+h[R>>3];if(!(s<r)){U=T;break}h[R>>3]=s;h[S>>3]=r;U=T+1|0}}while(0);if((U|0)==0){V=nd(g,R,0)|0;o=R+8|0;if(nd(o,a,0)|0){m=79;break}if(V){g=o;continue}}o=R;if((o-j|0)>=(b-o|0)){m=83;break}md(g,R,c);g=R+8|0}if((m|0)==79){m=0;if(V){m=84;break}else{e=g;a=R;continue}}else if((m|0)==83){m=0;md(R+8|0,a,c);e=g;a=R;continue}}if((m|0)==4){N=+h[f>>3];Q=+h[g>>3];if(!(N<Q)){i=d;return}h[g>>3]=N;h[f>>3]=Q;i=d;return}else if((m|0)==6){R=g+8|0;Q=+h[R>>3];N=+h[g>>3];G=+h[f>>3];e=G<Q;if(!(Q<N)){if(!e){i=d;return}h[R>>3]=G;h[f>>3]=Q;J=+h[R>>3];C=+h[g>>3];if(!(J<C)){i=d;return}h[g>>3]=J;h[R>>3]=C;i=d;return}if(e){h[g>>3]=G;h[f>>3]=N;i=d;return}h[g>>3]=Q;h[R>>3]=N;Q=+h[f>>3];if(!(Q<N)){i=d;return}h[R>>3]=Q;h[f>>3]=N;i=d;return}else if((m|0)==14){R=g+8|0;e=g+16|0;N=+h[R>>3];Q=+h[g>>3];G=+h[e>>3];c=G<N;do{if(N<Q){if(c){h[g>>3]=G;h[e>>3]=Q;W=Q;break}h[g>>3]=N;h[R>>3]=Q;if(!(G<Q)){W=G;break}h[R>>3]=G;h[e>>3]=Q;W=Q}else{if(!c){W=G;break}h[R>>3]=G;h[e>>3]=N;if(!(G<Q)){W=N;break}h[g>>3]=G;h[R>>3]=Q;W=N}}while(0);N=+h[f>>3];if(!(N<W)){i=d;return}h[e>>3]=N;h[f>>3]=W;W=+h[e>>3];N=+h[R>>3];if(!(W<N)){i=d;return}h[R>>3]=W;h[e>>3]=N;N=+h[g>>3];if(!(W<N)){i=d;return}h[g>>3]=W;h[R>>3]=N;i=d;return}else if((m|0)==26){kd(g,g+8|0,g+16|0,g+24|0,f,0)|0;i=d;return}else if((m|0)==28){f=g+16|0;R=g+8|0;N=+h[R>>3];W=+h[g>>3];Q=+h[f>>3];e=Q<N;do{if(N<W){if(e){h[g>>3]=Q;h[f>>3]=W;X=W;break}h[g>>3]=N;h[R>>3]=W;if(!(Q<W)){X=Q;break}h[R>>3]=Q;h[f>>3]=W;X=W}else{if(!e){X=Q;break}h[R>>3]=Q;h[f>>3]=N;if(!(Q<W)){X=N;break}h[g>>3]=Q;h[R>>3]=W;X=N}}while(0);R=g+24|0;if((R|0)==(a|0)){i=d;return}else{Y=X;Z=R;_=f}while(1){X=+h[Z>>3];if(X<Y){N=Y;f=Z;R=_;while(1){h[f>>3]=N;if((R|0)==(g|0)){$=g;break}e=R+ -8|0;W=+h[e>>3];if(X<W){c=R;N=W;R=e;f=c}else{$=R;break}}h[$>>3]=X}R=Z+8|0;if((R|0)==(a|0)){break}f=Z;Y=+h[Z>>3];Z=R;_=f}i=d;return}else if((m|0)==84){i=d;return}}function nd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0,g=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0;c=i;switch(b-a>>3|0){case 2:{d=b+ -8|0;e=+h[d>>3];f=+h[a>>3];if(!(e<f)){g=1;i=c;return g|0}h[a>>3]=e;h[d>>3]=f;g=1;i=c;return g|0};case 3:{d=a+8|0;j=b+ -8|0;f=+h[d>>3];e=+h[a>>3];k=+h[j>>3];l=k<f;if(!(f<e)){if(!l){g=1;i=c;return g|0}h[d>>3]=k;h[j>>3]=f;m=+h[d>>3];n=+h[a>>3];if(!(m<n)){g=1;i=c;return g|0}h[a>>3]=m;h[d>>3]=n;g=1;i=c;return g|0}if(l){h[a>>3]=k;h[j>>3]=e;g=1;i=c;return g|0}h[a>>3]=f;h[d>>3]=e;f=+h[j>>3];if(!(f<e)){g=1;i=c;return g|0}h[d>>3]=f;h[j>>3]=e;g=1;i=c;return g|0};case 4:{j=a+8|0;d=a+16|0;l=b+ -8|0;e=+h[j>>3];f=+h[a>>3];k=+h[d>>3];o=k<e;do{if(e<f){if(o){h[a>>3]=k;h[d>>3]=f;p=f;break}h[a>>3]=e;h[j>>3]=f;if(!(k<f)){p=k;break}h[j>>3]=k;h[d>>3]=f;p=f}else{if(!o){p=k;break}h[j>>3]=k;h[d>>3]=e;if(!(k<f)){p=e;break}h[a>>3]=k;h[j>>3]=f;p=e}}while(0);e=+h[l>>3];if(!(e<p)){g=1;i=c;return g|0}h[d>>3]=e;h[l>>3]=p;p=+h[d>>3];e=+h[j>>3];if(!(p<e)){g=1;i=c;return g|0}h[j>>3]=p;h[d>>3]=e;e=+h[a>>3];if(!(p<e)){g=1;i=c;return g|0}h[a>>3]=p;h[j>>3]=e;g=1;i=c;return g|0};case 5:{kd(a,a+8|0,a+16|0,a+24|0,b+ -8|0,0)|0;g=1;i=c;return g|0};case 1:case 0:{g=1;i=c;return g|0};default:{j=a+16|0;d=a+8|0;e=+h[d>>3];p=+h[a>>3];f=+h[j>>3];l=f<e;do{if(e<p){if(l){h[a>>3]=f;h[j>>3]=p;q=p;break}h[a>>3]=e;h[d>>3]=p;if(!(f<p)){q=f;break}h[d>>3]=f;h[j>>3]=p;q=p}else{if(!l){q=f;break}h[d>>3]=f;h[j>>3]=e;if(!(f<p)){q=e;break}h[a>>3]=f;h[d>>3]=p;q=e}}while(0);d=a+24|0;if((d|0)==(b|0)){g=1;i=c;return g|0}else{r=q;s=0;t=d;u=j}while(1){q=+h[t>>3];if(q<r){e=r;j=t;d=u;while(1){h[j>>3]=e;if((d|0)==(a|0)){v=a;break}l=d+ -8|0;p=+h[l>>3];if(q<p){o=d;e=p;d=l;j=o}else{v=d;break}}h[v>>3]=q;d=s+1|0;if((d|0)==8){break}else{w=d}}else{w=s}d=t+8|0;if((d|0)==(b|0)){g=1;x=41;break}j=t;r=+h[t>>3];s=w;t=d;u=j}if((x|0)==41){i=c;return g|0}g=(t+8|0)==(b|0);i=c;return g|0}}return 0}function od(a){a=a|0;var b=0;a=i;b=(c[6]|0)+ -1|0;c[6]=b;if((b|0)!=0){i=a;return}zb(32)|0;i=a;return}function pd(b){b=b|0;var d=0,e=0,f=0,g=0;b=i;do{if((a[2560]|0)==0){if((Ma(2560)|0)==0){break}c[14]=5489;d=5489;e=1;do{d=(ea(d>>>30^d,1812433253)|0)+e|0;c[56+(e<<2)>>2]=d;e=e+1|0;}while((e|0)!=624);c[2552>>2]=0;Za(2560)}}while(0);e=c[2552>>2]|0;d=((e+1|0)>>>0)%624|0;f=56+(e<<2)|0;g=c[56+(d<<2)>>2]|0;c[f>>2]=0-(g&1)&-1727483681^c[56+((((e+397|0)>>>0)%624|0)<<2)>>2]^(g&2147483646|c[f>>2]&-2147483648)>>>1;f=c[56+(c[2552>>2]<<2)>>2]|0;g=f>>>11^f;c[2552>>2]=d;d=g<<7&-1658038656^g;g=d<<15&-272236544^d;i=b;return g>>>18^g|0}function qd(a){a=a|0;a=i;cb(32)|0;c[6]=1;i=a;return}function rd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+32|0;d=b;e=b+8|0;f=b+16|0;g=b+24|0;h=c[r>>2]|0;Nd(3280,h,3336);c[642]=4708;c[2576>>2]=4728;c[2572>>2]=0;Qe(2576|0,3280);c[2648>>2]=0;c[2652>>2]=-1;j=c[s>>2]|0;c[846]=4576;Uj(3388|0);c[3392>>2]=0;c[3396>>2]=0;c[3400>>2]=0;c[3404>>2]=0;c[3408>>2]=0;c[3412>>2]=0;c[846]=3896;c[3416>>2]=j;Vj(g,3388|0);k=Xj(g,7368)|0;l=k;Wj(g);c[3420>>2]=l;c[3424>>2]=3344;a[3428|0]=(kc[c[(c[k>>2]|0)+28>>2]&63](l)|0)&1;c[664]=4788;c[2660>>2]=4808;Qe(2660|0,3384);c[2732>>2]=0;c[2736>>2]=-1;l=c[q>>2]|0;c[858]=4576;Uj(3436|0);c[3440>>2]=0;c[3444>>2]=0;c[3448>>2]=0;c[3452>>2]=0;c[3456>>2]=0;c[3460>>2]=0;c[858]=3896;c[3464>>2]=l;Vj(f,3436|0);k=Xj(f,7368)|0;g=k;Wj(f);c[3468>>2]=g;c[3472>>2]=3352;a[3476|0]=(kc[c[(c[k>>2]|0)+28>>2]&63](g)|0)&1;c[686]=4788;c[2748>>2]=4808;Qe(2748|0,3432);c[2820>>2]=0;c[2824>>2]=-1;g=c[(c[(c[686]|0)+ -12>>2]|0)+2768>>2]|0;c[708]=4788;c[2836>>2]=4808;Qe(2836|0,g);c[2908>>2]=0;c[2912>>2]=-1;c[(c[(c[642]|0)+ -12>>2]|0)+2640>>2]=2656;g=(c[(c[686]|0)+ -12>>2]|0)+2748|0;c[g>>2]=c[g>>2]|8192;c[(c[(c[686]|0)+ -12>>2]|0)+2816>>2]=2656;zd(3480,h,3360|0);c[730]=4748;c[2928>>2]=4768;c[2924>>2]=0;Qe(2928|0,3480);c[3e3>>2]=0;c[3004>>2]=-1;c[884]=4640;Uj(3540|0);c[3544>>2]=0;c[3548>>2]=0;c[3552>>2]=0;c[3556>>2]=0;c[3560>>2]=0;c[3564>>2]=0;c[884]=3640;c[3568>>2]=j;Vj(e,3540|0);j=Xj(e,7376)|0;h=j;Wj(e);c[3572>>2]=h;c[3576>>2]=3368;a[3580|0]=(kc[c[(c[j>>2]|0)+28>>2]&63](h)|0)&1;c[752]=4828;c[3012>>2]=4848;Qe(3012|0,3536);c[3084>>2]=0;c[3088>>2]=-1;c[896]=4640;Uj(3588|0);c[3592>>2]=0;c[3596>>2]=0;c[3600>>2]=0;c[3604>>2]=0;c[3608>>2]=0;c[3612>>2]=0;c[896]=3640;c[3616>>2]=l;Vj(d,3588|0);l=Xj(d,7376)|0;h=l;Wj(d);c[3620>>2]=h;c[3624>>2]=3376;a[3628|0]=(kc[c[(c[l>>2]|0)+28>>2]&63](h)|0)&1;c[774]=4828;c[3100>>2]=4848;Qe(3100|0,3584);c[3172>>2]=0;c[3176>>2]=-1;h=c[(c[(c[774]|0)+ -12>>2]|0)+3120>>2]|0;c[796]=4828;c[3188>>2]=4848;Qe(3188|0,h);c[3260>>2]=0;c[3264>>2]=-1;c[(c[(c[730]|0)+ -12>>2]|0)+2992>>2]=3008;h=(c[(c[774]|0)+ -12>>2]|0)+3100|0;c[h>>2]=c[h>>2]|8192;c[(c[(c[774]|0)+ -12>>2]|0)+3168>>2]=3008;i=b;return}function sd(a){a=a|0;a=i;wf(2656)|0;wf(2832)|0;Bf(3008)|0;Bf(3184)|0;i=a;return}function td(a){a=a|0;var b=0;b=i;c[a>>2]=4640;Wj(a+4|0);i=b;return}function ud(a){a=a|0;var b=0;b=i;c[a>>2]=4640;Wj(a+4|0);Om(a);i=b;return}function vd(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;kc[c[(c[b>>2]|0)+24>>2]&63](b)|0;f=Xj(d,7376)|0;d=f;c[b+36>>2]=d;a[b+44|0]=(kc[c[(c[f>>2]|0)+28>>2]&63](d)|0)&1;i=e;return}function wd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=b+8|0;f=a+36|0;g=a+40|0;h=d;j=d+8|0;k=d;d=a+32|0;while(1){a=c[f>>2]|0;l=uc[c[(c[a>>2]|0)+20>>2]&15](a,c[g>>2]|0,h,j,e)|0;a=(c[e>>2]|0)-k|0;if((Ub(h|0,1,a|0,c[d>>2]|0)|0)!=(a|0)){m=-1;n=5;break}if((l|0)==2){m=-1;n=5;break}else if((l|0)!=1){n=4;break}}if((n|0)==4){m=((Ya(c[d>>2]|0)|0)!=0)<<31>>31;i=b;return m|0}else if((n|0)==5){i=b;return m|0}return 0}function xd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((a[b+44|0]|0)!=0){g=Ub(d|0,4,e|0,c[b+32>>2]|0)|0;i=f;return g|0}h=b;if((e|0)>0){j=d;k=0}else{g=0;i=f;return g|0}while(1){if((tc[c[(c[h>>2]|0)+52>>2]&15](b,c[j>>2]|0)|0)==-1){g=k;l=6;break}d=k+1|0;if((d|0)<(e|0)){j=j+4|0;k=d}else{g=d;l=6;break}}if((l|0)==6){i=f;return g|0}return 0}function yd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=(d|0)==-1;a:do{if(!k){c[g>>2]=d;if((a[b+44|0]|0)!=0){if((Ub(g|0,4,1,c[b+32>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}m=f;c[h>>2]=m;n=g+4|0;o=b+36|0;p=b+40|0;q=f+8|0;r=f;s=b+32|0;t=g;while(1){u=c[o>>2]|0;v=pc[c[(c[u>>2]|0)+12>>2]&15](u,c[p>>2]|0,t,n,j,m,q,h)|0;if((c[j>>2]|0)==(t|0)){l=-1;w=12;break}if((v|0)==3){w=7;break}u=(v|0)==1;if(!(v>>>0<2)){l=-1;w=12;break}v=(c[h>>2]|0)-r|0;if((Ub(m|0,1,v|0,c[s>>2]|0)|0)!=(v|0)){l=-1;w=12;break}if(u){t=u?c[j>>2]|0:t}else{break a}}if((w|0)==7){if((Ub(t|0,1,1,c[s>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}else if((w|0)==12){i=e;return l|0}}}while(0);l=k?0:d;i=e;return l|0}function zd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f;h=b;c[h>>2]=4640;j=b+4|0;Uj(j);k=b+8|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[h>>2]=3752;c[b+32>>2]=d;c[b+40>>2]=e;c[b+48>>2]=-1;a[b+52|0]=0;Vj(g,j);j=Xj(g,7376)|0;e=j;d=b+36|0;c[d>>2]=e;h=b+44|0;c[h>>2]=kc[c[(c[j>>2]|0)+24>>2]&63](e)|0;e=c[d>>2]|0;a[b+53|0]=(kc[c[(c[e>>2]|0)+28>>2]&63](e)|0)&1;if((c[h>>2]|0)>8){fj(3848)}else{Wj(g);i=f;return}}function Ad(a){a=a|0;var b=0;b=i;c[a>>2]=4640;Wj(a+4|0);i=b;return}function Bd(a){a=a|0;var b=0;b=i;c[a>>2]=4640;Wj(a+4|0);Om(a);i=b;return}function Cd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Xj(d,7376)|0;d=f;g=b+36|0;c[g>>2]=d;h=b+44|0;c[h>>2]=kc[c[(c[f>>2]|0)+24>>2]&63](d)|0;d=c[g>>2]|0;a[b+53|0]=(kc[c[(c[d>>2]|0)+28>>2]&63](d)|0)&1;if((c[h>>2]|0)>8){fj(3848)}else{i=e;return}}function Dd(a){a=a|0;var b=0,c=0;b=i;c=Gd(a,0)|0;i=b;return c|0}function Ed(a){a=a|0;var b=0,c=0;b=i;c=Gd(a,1)|0;i=b;return c|0}function Fd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;l=(a[k]|0)!=0;if((d|0)==-1){if(l){m=-1;i=e;return m|0}n=c[b+48>>2]|0;a[k]=(n|0)!=-1|0;m=n;i=e;return m|0}n=b+48|0;a:do{if(l){c[h>>2]=c[n>>2];o=c[b+36>>2]|0;p=f;q=pc[c[(c[o>>2]|0)+12>>2]&15](o,c[b+40>>2]|0,h,h+4|0,j,p,f+8|0,g)|0;if((q|0)==3){a[p]=c[n>>2];c[g>>2]=f+1}else if((q|0)==1|(q|0)==2){m=-1;i=e;return m|0}q=b+32|0;while(1){o=c[g>>2]|0;if(!(o>>>0>p>>>0)){break a}r=o+ -1|0;c[g>>2]=r;if((Qa(a[r]|0,c[q>>2]|0)|0)==-1){m=-1;break}}i=e;return m|0}}while(0);c[n>>2]=d;a[k]=1;m=d;i=e;return m|0}function Gd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;if((a[k]|0)!=0){l=b+48|0;m=c[l>>2]|0;if(!d){n=m;i=e;return n|0}c[l>>2]=-1;a[k]=0;n=m;i=e;return n|0}m=c[b+44>>2]|0;k=(m|0)>1?m:1;a:do{if((k|0)>0){m=b+32|0;l=0;while(1){o=Mb(c[m>>2]|0)|0;if((o|0)==-1){n=-1;break}a[f+l|0]=o;l=l+1|0;if((l|0)>=(k|0)){break a}}i=e;return n|0}}while(0);b:do{if((a[b+53|0]|0)==0){l=b+40|0;m=b+36|0;o=f;p=g+4|0;q=b+32|0;r=k;while(1){s=c[l>>2]|0;t=s;u=c[t>>2]|0;v=c[t+4>>2]|0;t=c[m>>2]|0;w=f+r|0;x=pc[c[(c[t>>2]|0)+16>>2]&15](t,s,o,w,h,g,p,j)|0;if((x|0)==2){n=-1;y=22;break}else if((x|0)==3){y=14;break}else if((x|0)!=1){z=r;break b}x=c[l>>2]|0;c[x>>2]=u;c[x+4>>2]=v;if((r|0)==8){n=-1;y=22;break}v=Mb(c[q>>2]|0)|0;if((v|0)==-1){n=-1;y=22;break}a[w]=v;r=r+1|0}if((y|0)==14){c[g>>2]=a[o]|0;z=r;break}else if((y|0)==22){i=e;return n|0}}else{c[g>>2]=a[f]|0;z=k}}while(0);if(d){d=c[g>>2]|0;c[b+48>>2]=d;n=d;i=e;return n|0}d=b+32|0;b=z;while(1){if((b|0)<=0){break}z=b+ -1|0;if((Qa(a[f+z|0]|0,c[d>>2]|0)|0)==-1){n=-1;y=22;break}else{b=z}}if((y|0)==22){i=e;return n|0}n=c[g>>2]|0;i=e;return n|0}function Hd(a){a=a|0;var b=0;b=i;c[a>>2]=4576;Wj(a+4|0);i=b;return}function Id(a){a=a|0;var b=0;b=i;c[a>>2]=4576;Wj(a+4|0);Om(a);i=b;return}function Jd(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;kc[c[(c[b>>2]|0)+24>>2]&63](b)|0;f=Xj(d,7368)|0;d=f;c[b+36>>2]=d;a[b+44|0]=(kc[c[(c[f>>2]|0)+28>>2]&63](d)|0)&1;i=e;return}function Kd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=b+8|0;f=a+36|0;g=a+40|0;h=d;j=d+8|0;k=d;d=a+32|0;while(1){a=c[f>>2]|0;l=uc[c[(c[a>>2]|0)+20>>2]&15](a,c[g>>2]|0,h,j,e)|0;a=(c[e>>2]|0)-k|0;if((Ub(h|0,1,a|0,c[d>>2]|0)|0)!=(a|0)){m=-1;n=5;break}if((l|0)==2){m=-1;n=5;break}else if((l|0)!=1){n=4;break}}if((n|0)==4){m=((Ya(c[d>>2]|0)|0)!=0)<<31>>31;i=b;return m|0}else if((n|0)==5){i=b;return m|0}return 0}function Ld(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;if((a[b+44|0]|0)!=0){h=Ub(e|0,1,f|0,c[b+32>>2]|0)|0;i=g;return h|0}j=b;if((f|0)>0){k=e;l=0}else{h=0;i=g;return h|0}while(1){if((tc[c[(c[j>>2]|0)+52>>2]&15](b,d[k]|0)|0)==-1){h=l;m=6;break}e=l+1|0;if((e|0)<(f|0)){k=k+1|0;l=e}else{h=e;m=6;break}}if((m|0)==6){i=g;return h|0}return 0}function Md(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=(d|0)==-1;a:do{if(!k){a[g]=d;if((a[b+44|0]|0)!=0){if((Ub(g|0,1,1,c[b+32>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}m=f;c[h>>2]=m;n=g+1|0;o=b+36|0;p=b+40|0;q=f+8|0;r=f;s=b+32|0;t=g;while(1){u=c[o>>2]|0;v=pc[c[(c[u>>2]|0)+12>>2]&15](u,c[p>>2]|0,t,n,j,m,q,h)|0;if((c[j>>2]|0)==(t|0)){l=-1;w=12;break}if((v|0)==3){w=7;break}u=(v|0)==1;if(!(v>>>0<2)){l=-1;w=12;break}v=(c[h>>2]|0)-r|0;if((Ub(m|0,1,v|0,c[s>>2]|0)|0)!=(v|0)){l=-1;w=12;break}if(u){t=u?c[j>>2]|0:t}else{break a}}if((w|0)==7){if((Ub(t|0,1,1,c[s>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}else if((w|0)==12){i=e;return l|0}}}while(0);l=k?0:d;i=e;return l|0}function Nd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f;h=b;c[h>>2]=4576;j=b+4|0;Uj(j);k=b+8|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[h>>2]=4008;c[b+32>>2]=d;c[b+40>>2]=e;c[b+48>>2]=-1;a[b+52|0]=0;Vj(g,j);j=Xj(g,7368)|0;e=j;d=b+36|0;c[d>>2]=e;h=b+44|0;c[h>>2]=kc[c[(c[j>>2]|0)+24>>2]&63](e)|0;e=c[d>>2]|0;a[b+53|0]=(kc[c[(c[e>>2]|0)+28>>2]&63](e)|0)&1;if((c[h>>2]|0)>8){fj(3848)}else{Wj(g);i=f;return}}function Od(a){a=a|0;var b=0;b=i;c[a>>2]=4576;Wj(a+4|0);i=b;return}function Pd(a){a=a|0;var b=0;b=i;c[a>>2]=4576;Wj(a+4|0);Om(a);i=b;return}function Qd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Xj(d,7368)|0;d=f;g=b+36|0;c[g>>2]=d;h=b+44|0;c[h>>2]=kc[c[(c[f>>2]|0)+24>>2]&63](d)|0;d=c[g>>2]|0;a[b+53|0]=(kc[c[(c[d>>2]|0)+28>>2]&63](d)|0)&1;if((c[h>>2]|0)>8){fj(3848)}else{i=e;return}}function Rd(a){a=a|0;var b=0,c=0;b=i;c=Ud(a,0)|0;i=b;return c|0}function Sd(a){a=a|0;var b=0,c=0;b=i;c=Ud(a,1)|0;i=b;return c|0}function Td(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;l=(a[k]|0)!=0;if((d|0)==-1){if(l){m=-1;i=e;return m|0}n=c[b+48>>2]|0;a[k]=(n|0)!=-1|0;m=n;i=e;return m|0}n=b+48|0;a:do{if(l){a[h]=c[n>>2];o=c[b+36>>2]|0;p=f;q=pc[c[(c[o>>2]|0)+12>>2]&15](o,c[b+40>>2]|0,h,h+1|0,j,p,f+8|0,g)|0;if((q|0)==3){a[p]=c[n>>2];c[g>>2]=f+1}else if((q|0)==1|(q|0)==2){m=-1;i=e;return m|0}q=b+32|0;while(1){o=c[g>>2]|0;if(!(o>>>0>p>>>0)){break a}r=o+ -1|0;c[g>>2]=r;if((Qa(a[r]|0,c[q>>2]|0)|0)==-1){m=-1;break}}i=e;return m|0}}while(0);c[n>>2]=d;a[k]=1;m=d;i=e;return m|0}function Ud(b,e){b=b|0;e=e|0;var f=0,g=0,h=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;f=i;i=i+32|0;g=f;h=f+8|0;j=f+16|0;k=f+24|0;l=b+52|0;if((a[l]|0)!=0){m=b+48|0;n=c[m>>2]|0;if(!e){o=n;i=f;return o|0}c[m>>2]=-1;a[l]=0;o=n;i=f;return o|0}n=c[b+44>>2]|0;l=(n|0)>1?n:1;a:do{if((l|0)>0){n=b+32|0;m=0;while(1){p=Mb(c[n>>2]|0)|0;if((p|0)==-1){o=-1;break}a[g+m|0]=p;m=m+1|0;if((m|0)>=(l|0)){break a}}i=f;return o|0}}while(0);b:do{if((a[b+53|0]|0)==0){m=b+40|0;n=b+36|0;p=g;q=h+1|0;r=b+32|0;s=l;while(1){t=c[m>>2]|0;u=t;v=c[u>>2]|0;w=c[u+4>>2]|0;u=c[n>>2]|0;x=g+s|0;y=pc[c[(c[u>>2]|0)+16>>2]&15](u,t,p,x,j,h,q,k)|0;if((y|0)==3){z=14;break}else if((y|0)==2){o=-1;z=23;break}else if((y|0)!=1){A=s;break b}y=c[m>>2]|0;c[y>>2]=v;c[y+4>>2]=w;if((s|0)==8){o=-1;z=23;break}w=Mb(c[r>>2]|0)|0;if((w|0)==-1){o=-1;z=23;break}a[x]=w;s=s+1|0}if((z|0)==14){a[h]=a[p]|0;A=s;break}else if((z|0)==23){i=f;return o|0}}else{a[h]=a[g]|0;A=l}}while(0);do{if(e){l=a[h]|0;c[b+48>>2]=l&255;B=l}else{l=b+32|0;k=A;while(1){if((k|0)<=0){z=21;break}j=k+ -1|0;if((Qa(d[g+j|0]|0,c[l>>2]|0)|0)==-1){o=-1;z=23;break}else{k=j}}if((z|0)==21){B=a[h]|0;break}else if((z|0)==23){i=f;return o|0}}}while(0);o=B&255;i=f;return o|0}function Vd(){var a=0;a=i;rd(0);Zb(112,3272,p|0)|0;i=a;return}function Wd(a){a=a|0;i=i;return}function Xd(a){a=a|0;var b=0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;i=i;return}function Yd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;c[d>>2]=e+ -1;if((e|0)!=0){f=0;i=b;return f|0}hc[c[(c[a>>2]|0)+8>>2]&127](a);f=1;i=b;return f|0}function Zd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a>>2]=4152;e=hn(b|0)|0;f=Nm(e+13|0)|0;c[f+4>>2]=e;c[f>>2]=e;g=f+12|0;c[a+4>>2]=g;c[f+8>>2]=0;fn(g|0,b|0,e+1|0)|0;i=d;return}function _d(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=4152;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Pm((c[d>>2]|0)+ -12|0)}Kb(a|0);Om(a);i=b;return}function $d(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=4152;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)>=0){g=a;Kb(g|0);i=b;return}Pm((c[d>>2]|0)+ -12|0);g=a;Kb(g|0);i=b;return}function ae(a){a=a|0;i=i;return c[a+4>>2]|0}function be(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;c[b>>2]=4176;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=hn(f|0)|0;g=Nm(d+13|0)|0;c[g+4>>2]=d;c[g>>2]=d;h=g+12|0;c[b+4>>2]=h;c[g+8>>2]=0;fn(h|0,f|0,d+1|0)|0;i=e;return}function ce(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a>>2]=4176;e=hn(b|0)|0;f=Nm(e+13|0)|0;c[f+4>>2]=e;c[f>>2]=e;g=f+12|0;c[a+4>>2]=g;c[f+8>>2]=0;fn(g|0,b|0,e+1|0)|0;i=d;return}function de(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=4176;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Pm((c[d>>2]|0)+ -12|0)}Kb(a|0);Om(a);i=b;return}function ee(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=4176;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)>=0){g=a;Kb(g|0);i=b;return}Pm((c[d>>2]|0)+ -12|0);g=a;Kb(g|0);i=b;return}function fe(a){a=a|0;i=i;return c[a+4>>2]|0}function ge(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=4152;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Pm((c[d>>2]|0)+ -12|0)}Kb(a|0);Om(a);i=b;return}function he(a){a=a|0;i=i;return}function ie(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=d;c[a+4>>2]=b;i=i;return}function je(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e;mc[c[(c[a>>2]|0)+12>>2]&3](f,a,b);if((c[f+4>>2]|0)!=(c[d+4>>2]|0)){g=0;i=e;return g|0}g=(c[f>>2]|0)==(c[d>>2]|0);i=e;return g|0}function ke(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((c[b+4>>2]|0)!=(a|0)){f=0;i=e;return f|0}f=(c[b>>2]|0)==(d|0);i=e;return f|0}function le(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;d=i;f=Xb(e|0)|0;e=hn(f|0)|0;if(e>>>0>4294967279){re(0)}if(e>>>0<11){a[b]=e<<1;g=b+1|0;fn(g|0,f|0,e|0)|0;h=g+e|0;a[h]=0;i=d;return}else{j=e+16&-16;k=Mm(j)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=e;g=k;fn(g|0,f|0,e|0)|0;h=g+e|0;a[h]=0;i=d;return}}function me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f;h=d;j=c[h>>2]|0;k=e;do{if((j|0)!=0){l=a[k]|0;if((l&1)==0){m=(l&255)>>>1}else{m=c[e+4>>2]|0}if((m|0)==0){n=j}else{Be(e,4328,2)|0;n=c[h>>2]|0}l=c[d+4>>2]|0;mc[c[(c[l>>2]|0)+24>>2]&3](g,l,n);l=g;o=a[l]|0;if((o&1)==0){p=g+1|0;q=(o&255)>>>1}else{p=c[g+8>>2]|0;q=c[g+4>>2]|0}Be(e,p,q)|0;if((a[l]&1)==0){break}Om(c[g+8>>2]|0)}}while(0);g=b;c[g+0>>2]=c[k+0>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;i=f;return}function ne(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+32|0;g=f;h=f+16|0;j=hn(e|0)|0;if(j>>>0>4294967279){re(0)}if(j>>>0<11){a[h]=j<<1;k=h+1|0}else{l=j+16&-16;m=Mm(l)|0;c[h+8>>2]=m;c[h>>2]=l|1;c[h+4>>2]=j;k=m}fn(k|0,e|0,j|0)|0;a[k+j|0]=0;me(g,d,h);be(b,g);if(!((a[g]&1)==0)){Om(c[g+8>>2]|0)}if(!((a[h]&1)==0)){Om(c[h+8>>2]|0)}c[b>>2]=4344;h=d;d=c[h+4>>2]|0;g=b+8|0;c[g>>2]=c[h>>2];c[g+4>>2]=d;i=f;return}function oe(a){a=a|0;var b=0;b=i;ee(a);Om(a);i=b;return}function pe(a){a=a|0;var b=0;b=i;ee(a);i=b;return}function qe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;cb(4480)|0;if((c[a>>2]|0)==1){do{Da(4504,4480)|0;}while((c[a>>2]|0)==1)}if((c[a>>2]|0)==0){c[a>>2]=1;zb(4480)|0;hc[d&127](b);cb(4480)|0;c[a>>2]=-1;zb(4480)|0;Qb(4504)|0;i=e;return}else{zb(4480)|0;i=e;return}}function re(a){a=a|0;a=Ta(8)|0;Zd(a,4552);c[a>>2]=4232;Vb(a|0,4272,9)}function se(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=d;if((a[f]&1)==0){g=b;c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];i=e;return}f=c[d+8>>2]|0;g=c[d+4>>2]|0;if(g>>>0>4294967279){re(0)}if(g>>>0<11){a[b]=g<<1;h=b+1|0}else{d=g+16&-16;j=Mm(d)|0;c[b+8>>2]=j;c[b>>2]=d|1;c[b+4>>2]=g;h=j}fn(h|0,f|0,g|0)|0;a[h+g|0]=0;i=e;return}function te(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(e>>>0>4294967279){re(0)}if(e>>>0<11){a[b]=e<<1;g=b+1|0}else{h=e+16&-16;j=Mm(h)|0;c[b+8>>2]=j;c[b>>2]=h|1;c[b+4>>2]=e;g=j}fn(g|0,d|0,e|0)|0;a[g+e|0]=0;i=f;return}function ue(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(d>>>0>4294967279){re(0)}if(d>>>0<11){a[b]=d<<1;g=b+1|0}else{h=d+16&-16;j=Mm(h)|0;c[b+8>>2]=j;c[b>>2]=h|1;c[b+4>>2]=d;g=j}cn(g|0,e|0,d|0)|0;a[g+d|0]=0;i=f;return}function ve(b){b=b|0;var d=0;d=i;if((a[b]&1)==0){i=d;return}Om(c[b+8>>2]|0);i=d;return}function we(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=hn(d|0)|0;g=b;h=a[g]|0;if((h&1)==0){j=h;k=10}else{h=c[b>>2]|0;j=h&255;k=(h&-2)+ -1|0}h=(j&1)==0;if(k>>>0<f>>>0){if(h){l=(j&255)>>>1}else{l=c[b+4>>2]|0}Ce(b,k,f-k|0,l,0,l,f,d);i=e;return b|0}if(h){m=b+1|0}else{m=c[b+8>>2]|0}gn(m|0,d|0,f|0)|0;a[m+f|0]=0;if((a[g]&1)==0){a[g]=f<<1;i=e;return b|0}else{c[b+4>>2]=f;i=e;return b|0}return 0}function xe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=b;h=a[g]|0;j=(h&1)==0;if(j){k=(h&255)>>>1}else{k=c[b+4>>2]|0}if(k>>>0<d>>>0){ye(b,d-k|0,e)|0;i=f;return}if(j){a[b+d+1|0]=0;a[g]=d<<1;i=f;return}else{a[(c[b+8>>2]|0)+d|0]=0;c[b+4>>2]=d;i=f;return}}function ye(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((d|0)==0){i=f;return b|0}g=b;h=a[g]|0;if((h&1)==0){j=h;k=10}else{h=c[b>>2]|0;j=h&255;k=(h&-2)+ -1|0}if((j&1)==0){l=(j&255)>>>1}else{l=c[b+4>>2]|0}if((k-l|0)>>>0<d>>>0){De(b,k,d-k+l|0,l,l,0,0);m=a[g]|0}else{m=j}if((m&1)==0){n=b+1|0}else{n=c[b+8>>2]|0}cn(n+l|0,e|0,d|0)|0;e=l+d|0;if((a[g]&1)==0){a[g]=e<<1}else{c[b+4>>2]=e}a[n+e|0]=0;i=f;return b|0}function ze(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if(d>>>0>4294967279){re(0)}f=b;g=a[f]|0;if((g&1)==0){h=g;j=10}else{g=c[b>>2]|0;h=g&255;j=(g&-2)+ -1|0}if((h&1)==0){k=(h&255)>>>1}else{k=c[b+4>>2]|0}g=k>>>0>d>>>0?k:d;if(g>>>0<11){l=10}else{l=(g+16&-16)+ -1|0}if((l|0)==(j|0)){i=e;return}do{if((l|0)==10){m=b+1|0;n=0;o=c[b+8>>2]|0;p=1}else{g=l+1|0;if(l>>>0>j>>>0){q=Mm(g)|0}else{q=Mm(g)|0}if((h&1)==0){m=q;n=1;o=b+1|0;p=0;break}else{m=q;n=1;o=c[b+8>>2]|0;p=1;break}}}while(0);if((h&1)==0){r=(h&255)>>>1}else{r=c[b+4>>2]|0}fn(m|0,o|0,r+1|0)|0;if(p){Om(o)}if(n){c[b>>2]=l+1|1;c[b+4>>2]=k;c[b+8>>2]=m;i=e;return}else{a[f]=k<<1;i=e;return}}function Ae(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b;g=a[f]|0;h=(g&1)!=0;if(h){j=(c[b>>2]&-2)+ -1|0;k=c[b+4>>2]|0}else{j=10;k=(g&255)>>>1}if((k|0)==(j|0)){De(b,j,1,j,j,0,0);if((a[f]&1)==0){l=7}else{l=8}}else{if(h){l=8}else{l=7}}if((l|0)==7){a[f]=(k<<1)+2;m=b+1|0;n=k+1|0;o=m+k|0;a[o]=d;p=m+n|0;a[p]=0;i=e;return}else if((l|0)==8){l=c[b+8>>2]|0;f=k+1|0;c[b+4>>2]=f;m=l;n=f;o=m+k|0;a[o]=d;p=m+n|0;a[p]=0;i=e;return}}function Be(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b;h=a[g]|0;if((h&1)==0){j=10;k=h}else{h=c[b>>2]|0;j=(h&-2)+ -1|0;k=h&255}if((k&1)==0){l=(k&255)>>>1}else{l=c[b+4>>2]|0}if((j-l|0)>>>0<e>>>0){Ce(b,j,e-j+l|0,l,l,0,e,d);i=f;return b|0}if((e|0)==0){i=f;return b|0}if((k&1)==0){m=b+1|0}else{m=c[b+8>>2]|0}fn(m+l|0,d|0,e|0)|0;d=l+e|0;if((a[g]&1)==0){a[g]=d<<1}else{c[b+4>>2]=d}a[m+d|0]=0;i=f;return b|0}function Ce(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((-18-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){m=b+1|0}else{m=c[b+8>>2]|0}do{if(d>>>0<2147483623){n=e+d|0;o=d<<1;p=n>>>0<o>>>0?o:n;if(p>>>0<11){q=11;break}q=p+16&-16}else{q=-17}}while(0);e=Mm(q)|0;if((g|0)!=0){fn(e|0,m|0,g|0)|0}if((j|0)!=0){fn(e+g|0,k|0,j|0)|0}k=f-h|0;if((k|0)!=(g|0)){fn(e+(j+g)|0,m+(h+g)|0,k-g|0)|0}if((d|0)==10){r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+u|0;a[w]=0;i=l;return}Om(m);r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+u|0;a[w]=0;i=l;return}function De(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=i;if((-17-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){l=b+1|0}else{l=c[b+8>>2]|0}do{if(d>>>0<2147483623){m=e+d|0;n=d<<1;o=m>>>0<n>>>0?n:m;if(o>>>0<11){p=11;break}p=o+16&-16}else{p=-17}}while(0);e=Mm(p)|0;if((g|0)!=0){fn(e|0,l|0,g|0)|0}o=f-h|0;if((o|0)!=(g|0)){fn(e+(j+g)|0,l+(h+g)|0,o-g|0)|0}if((d|0)==10){q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}Om(l);q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}function Ee(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(e>>>0>1073741807){re(0)}if(e>>>0<2){a[b]=e<<1;g=b+4|0;im(g,d,e)|0;h=g+(e<<2)|0;c[h>>2]=0;i=f;return}else{j=e+4&-4;k=Mm(j<<2)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=e;g=k;im(g,d,e)|0;h=g+(e<<2)|0;c[h>>2]=0;i=f;return}}function Fe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(d>>>0>1073741807){re(0)}if(d>>>0<2){a[b]=d<<1;g=b+4|0;km(g,e,d)|0;h=g+(d<<2)|0;c[h>>2]=0;i=f;return}else{j=d+4&-4;k=Mm(j<<2)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=d;g=k;km(g,e,d)|0;h=g+(d<<2)|0;c[h>>2]=0;i=f;return}}function Ge(b){b=b|0;var d=0;d=i;if((a[b]&1)==0){i=d;return}Om(c[b+8>>2]|0);i=d;return}function He(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=Ie(a,b,hm(b)|0)|0;i=c;return d|0}function Ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b;h=a[g]|0;if((h&1)==0){j=1;k=h}else{h=c[b>>2]|0;j=(h&-2)+ -1|0;k=h&255}h=(k&1)==0;if(j>>>0<e>>>0){if(h){l=(k&255)>>>1}else{l=c[b+4>>2]|0}Le(b,j,e-j|0,l,0,l,e,d);i=f;return b|0}if(h){m=b+4|0}else{m=c[b+8>>2]|0}jm(m,d,e)|0;c[m+(e<<2)>>2]=0;if((a[g]&1)==0){a[g]=e<<1;i=f;return b|0}else{c[b+4>>2]=e;i=f;return b|0}return 0}function Je(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if(d>>>0>1073741807){re(0)}f=b;g=a[f]|0;if((g&1)==0){h=g;j=1}else{g=c[b>>2]|0;h=g&255;j=(g&-2)+ -1|0}if((h&1)==0){k=(h&255)>>>1}else{k=c[b+4>>2]|0}g=k>>>0>d>>>0?k:d;if(g>>>0<2){l=1}else{l=(g+4&-4)+ -1|0}if((l|0)==(j|0)){i=e;return}do{if((l|0)==1){m=b+4|0;n=0;o=c[b+8>>2]|0;p=1}else{g=(l<<2)+4|0;if(l>>>0>j>>>0){q=Mm(g)|0}else{q=Mm(g)|0}g=q;if((h&1)==0){m=g;n=1;o=b+4|0;p=0;break}else{m=g;n=1;o=c[b+8>>2]|0;p=1;break}}}while(0);if((h&1)==0){r=(h&255)>>>1}else{r=c[b+4>>2]|0}im(m,o,r+1|0)|0;if(p){Om(o)}if(n){c[b>>2]=l+1|1;c[b+4>>2]=k;c[b+8>>2]=m;i=e;return}else{a[f]=k<<1;i=e;return}}function Ke(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b;g=a[f]|0;h=(g&1)!=0;if(h){j=(c[b>>2]&-2)+ -1|0;k=c[b+4>>2]|0}else{j=1;k=(g&255)>>>1}if((k|0)==(j|0)){Me(b,j,1,j,j,0,0);if((a[f]&1)==0){l=7}else{l=8}}else{if(h){l=8}else{l=7}}if((l|0)==7){a[f]=(k<<1)+2;m=b+4|0;n=k+1|0;o=m+(k<<2)|0;c[o>>2]=d;p=m+(n<<2)|0;c[p>>2]=0;i=e;return}else if((l|0)==8){l=c[b+8>>2]|0;f=k+1|0;c[b+4>>2]=f;m=l;n=f;o=m+(k<<2)|0;c[o>>2]=d;p=m+(n<<2)|0;c[p>>2]=0;i=e;return}}function Le(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((1073741806-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){m=b+4|0}else{m=c[b+8>>2]|0}do{if(d>>>0<536870887){n=e+d|0;o=d<<1;p=n>>>0<o>>>0?o:n;if(p>>>0<2){q=2;break}q=p+4&-4}else{q=1073741807}}while(0);e=Mm(q<<2)|0;if((g|0)!=0){im(e,m,g)|0}if((j|0)!=0){im(e+(g<<2)|0,k,j)|0}k=f-h|0;if((k|0)!=(g|0)){im(e+(j+g<<2)|0,m+(h+g<<2)|0,k-g|0)|0}if((d|0)==1){r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+(u<<2)|0;c[w>>2]=0;i=l;return}Om(m);r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+(u<<2)|0;c[w>>2]=0;i=l;return}function Me(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=i;if((1073741807-d|0)>>>0<e>>>0){re(0)}if((a[b]&1)==0){l=b+4|0}else{l=c[b+8>>2]|0}do{if(d>>>0<536870887){m=e+d|0;n=d<<1;o=m>>>0<n>>>0?n:m;if(o>>>0<2){p=2;break}p=o+4&-4}else{p=1073741807}}while(0);e=Mm(p<<2)|0;if((g|0)!=0){im(e,l,g)|0}o=f-h|0;if((o|0)!=(g|0)){im(e+(j+g<<2)|0,l+(h+g<<2)|0,o-g|0)|0}if((d|0)==1){q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}Om(l);q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}function Ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=e+8|0;h=(c[b+24>>2]|0)==0;if(h){c[b+16>>2]=d|1}else{c[b+16>>2]=d}if(((h&1|d)&c[b+20>>2]|0)==0){i=e;return}e=Ta(16)|0;do{if((a[4920]|0)==0){if((Ma(4920)|0)==0){break}c[1228]=5616;Zb(40,4912,p|0)|0;Za(4920)}}while(0);b=e;d=g;c[d>>2]=1;c[d+4>>2]=4912;d=f;h=g;c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];ne(b,f,4968);c[e>>2]=4936;Vb(e|0,5016,36)}function Oe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=4960;d=c[a+40>>2]|0;e=a+32|0;f=a+36|0;if((d|0)!=0){g=d;do{g=g+ -1|0;mc[c[(c[e>>2]|0)+(g<<2)>>2]&3](0,a,c[(c[f>>2]|0)+(g<<2)>>2]|0);}while((g|0)!=0)}Wj(a+28|0);Im(c[e>>2]|0);Im(c[f>>2]|0);Im(c[a+48>>2]|0);Im(c[a+60>>2]|0);i=b;return}function Pe(a,b){a=a|0;b=b|0;var c=0;c=i;Vj(a,b+28|0);i=c;return}function Qe(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a+24>>2]=b;c[a+16>>2]=(b|0)==0;c[a+20>>2]=0;c[a+4>>2]=4098;c[a+12>>2]=0;c[a+8>>2]=6;b=a+28|0;e=a+32|0;a=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(a|0));Uj(b);i=d;return}function Re(a){a=a|0;var b=0;b=i;c[a>>2]=4576;Wj(a+4|0);Om(a);i=b;return}function Se(a){a=a|0;var b=0;b=i;c[a>>2]=4576;Wj(a+4|0);i=b;return}function Te(a,b){a=a|0;b=b|0;i=i;return}function Ue(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return a|0}function Ve(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=a;c[g>>2]=0;c[g+4>>2]=0;g=a+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=i;return}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=a;c[e>>2]=0;c[e+4>>2]=0;e=a+8|0;c[e>>2]=-1;c[e+4>>2]=-1;i=i;return}function Xe(a){a=a|0;i=i;return 0}function Ye(a){a=a|0;i=i;return 0}function Ze(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b;if((e|0)<=0){h=0;i=f;return h|0}j=b+12|0;k=b+16|0;l=d;d=0;while(1){m=c[j>>2]|0;if(m>>>0<(c[k>>2]|0)>>>0){c[j>>2]=m+1;n=a[m]|0}else{m=kc[c[(c[g>>2]|0)+40>>2]&63](b)|0;if((m|0)==-1){h=d;o=8;break}n=m&255}a[l]=n;m=d+1|0;if((m|0)<(e|0)){l=l+1|0;d=m}else{h=m;o=8;break}}if((o|0)==8){i=f;return h|0}return 0}function _e(a){a=a|0;i=i;return-1}function $e(a){a=a|0;var b=0,e=0,f=0;b=i;if((kc[c[(c[a>>2]|0)+36>>2]&63](a)|0)==-1){e=-1;i=b;return e|0}f=a+12|0;a=c[f>>2]|0;c[f>>2]=a+1;e=d[a]|0;i=b;return e|0}function af(a,b){a=a|0;b=b|0;i=i;return-1}function bf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=b;if((f|0)<=0){j=0;i=g;return j|0}k=b+24|0;l=b+28|0;m=e;e=0;while(1){n=c[k>>2]|0;if(n>>>0<(c[l>>2]|0)>>>0){o=a[m]|0;c[k>>2]=n+1;a[n]=o}else{if((tc[c[(c[h>>2]|0)+52>>2]&15](b,d[m]|0)|0)==-1){j=e;p=7;break}}o=e+1|0;if((o|0)<(f|0)){m=m+1|0;e=o}else{j=o;p=7;break}}if((p|0)==7){i=g;return j|0}return 0}function cf(a,b){a=a|0;b=b|0;i=i;return-1}function df(a){a=a|0;var b=0;b=i;c[a>>2]=4640;Wj(a+4|0);Om(a);i=b;return}function ef(a){a=a|0;var b=0;b=i;c[a>>2]=4640;Wj(a+4|0);i=b;return}function ff(a,b){a=a|0;b=b|0;i=i;return}function gf(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return a|0}function hf(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=a;c[g>>2]=0;c[g+4>>2]=0;g=a+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=i;return}function jf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=a;c[e>>2]=0;c[e+4>>2]=0;e=a+8|0;c[e>>2]=-1;c[e+4>>2]=-1;i=i;return}function kf(a){a=a|0;i=i;return 0}function lf(a){a=a|0;i=i;return 0}function mf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a;if((d|0)<=0){g=0;i=e;return g|0}h=a+12|0;j=a+16|0;k=b;b=0;while(1){l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){c[h>>2]=l+4;m=c[l>>2]|0}else{l=kc[c[(c[f>>2]|0)+40>>2]&63](a)|0;if((l|0)==-1){g=b;n=8;break}else{m=l}}c[k>>2]=m;l=b+1|0;if((l|0)>=(d|0)){g=l;n=8;break}k=k+4|0;b=l}if((n|0)==8){i=e;return g|0}return 0}function nf(a){a=a|0;i=i;return-1}function of(a){a=a|0;var b=0,d=0,e=0;b=i;if((kc[c[(c[a>>2]|0)+36>>2]&63](a)|0)==-1){d=-1;i=b;return d|0}e=a+12|0;a=c[e>>2]|0;c[e>>2]=a+4;d=c[a>>2]|0;i=b;return d|0}function pf(a,b){a=a|0;b=b|0;i=i;return-1}function qf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a;if((d|0)<=0){g=0;i=e;return g|0}h=a+24|0;j=a+28|0;k=b;b=0;while(1){l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){m=c[k>>2]|0;c[h>>2]=l+4;c[l>>2]=m}else{if((tc[c[(c[f>>2]|0)+52>>2]&15](a,c[k>>2]|0)|0)==-1){g=b;n=8;break}}m=b+1|0;if((m|0)>=(d|0)){g=m;n=8;break}k=k+4|0;b=m}if((n|0)==8){i=e;return g|0}return 0}function rf(a,b){a=a|0;b=b|0;i=i;return-1}function sf(a){a=a|0;var b=0;b=i;Oe(a+8|0);Om(a);i=b;return}function tf(a){a=a|0;var b=0;b=i;Oe(a+8|0);i=b;return}function uf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Oe(d+(e+8)|0);Om(d+e|0);i=b;return}function vf(a){a=a|0;var b=0;b=i;Oe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+8)|0);i=b;return}function wf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d;f=b;g=c[(c[f>>2]|0)+ -12>>2]|0;h=b;if((c[h+(g+24)>>2]|0)==0){i=d;return b|0}j=e;a[j]=0;c[e+4>>2]=b;do{if((c[h+(g+16)>>2]|0)==0){k=c[h+(g+72)>>2]|0;if((k|0)==0){l=g}else{wf(k)|0;l=c[(c[f>>2]|0)+ -12>>2]|0}a[j]=1;k=c[h+(l+24)>>2]|0;if(!((kc[c[(c[k>>2]|0)+24>>2]&63](k)|0)==-1)){break}k=c[(c[f>>2]|0)+ -12>>2]|0;Ne(h+k|0,c[h+(k+16)>>2]|1)}}while(0);Gf(e);i=d;return b|0}function xf(a){a=a|0;var b=0;b=i;Oe(a+8|0);Om(a);i=b;return}function yf(a){a=a|0;var b=0;b=i;Oe(a+8|0);i=b;return}function zf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Oe(d+(e+8)|0);Om(d+e|0);i=b;return}function Af(a){a=a|0;var b=0;b=i;Oe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+8)|0);i=b;return}function Bf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d;f=b;g=c[(c[f>>2]|0)+ -12>>2]|0;h=b;if((c[h+(g+24)>>2]|0)==0){i=d;return b|0}j=e;a[j]=0;c[e+4>>2]=b;do{if((c[h+(g+16)>>2]|0)==0){k=c[h+(g+72)>>2]|0;if((k|0)==0){l=g}else{Bf(k)|0;l=c[(c[f>>2]|0)+ -12>>2]|0}a[j]=1;k=c[h+(l+24)>>2]|0;if(!((kc[c[(c[k>>2]|0)+24>>2]&63](k)|0)==-1)){break}k=c[(c[f>>2]|0)+ -12>>2]|0;Ne(h+k|0,c[h+(k+16)>>2]|1)}}while(0);Lf(e);i=d;return b|0}function Cf(a){a=a|0;var b=0;b=i;Oe(a+4|0);Om(a);i=b;return}function Df(a){a=a|0;var b=0;b=i;Oe(a+4|0);i=b;return}function Ef(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Oe(d+(e+4)|0);Om(d+e|0);i=b;return}function Ff(a){a=a|0;var b=0;b=i;Oe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+4)|0);i=b;return}function Gf(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;a=c[d>>2]|0;e=c[(c[a>>2]|0)+ -12>>2]|0;f=a;if((c[f+(e+24)>>2]|0)==0){i=b;return}if((c[f+(e+16)>>2]|0)!=0){i=b;return}if((c[f+(e+4)>>2]&8192|0)==0){i=b;return}if(Ua()|0){i=b;return}e=c[d>>2]|0;f=c[e+((c[(c[e>>2]|0)+ -12>>2]|0)+24)>>2]|0;if(!((kc[c[(c[f>>2]|0)+24>>2]&63](f)|0)==-1)){i=b;return}f=c[d>>2]|0;d=c[(c[f>>2]|0)+ -12>>2]|0;e=f;Ne(e+d|0,c[e+(d+16)>>2]|1);i=b;return}function Hf(a){a=a|0;var b=0;b=i;Oe(a+4|0);Om(a);i=b;return}function If(a){a=a|0;var b=0;b=i;Oe(a+4|0);i=b;return}function Jf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Oe(d+(e+4)|0);Om(d+e|0);i=b;return}function Kf(a){a=a|0;var b=0;b=i;Oe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+4)|0);i=b;return}function Lf(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;a=c[d>>2]|0;e=c[(c[a>>2]|0)+ -12>>2]|0;f=a;if((c[f+(e+24)>>2]|0)==0){i=b;return}if((c[f+(e+16)>>2]|0)!=0){i=b;return}if((c[f+(e+4)>>2]&8192|0)==0){i=b;return}if(Ua()|0){i=b;return}e=c[d>>2]|0;f=c[e+((c[(c[e>>2]|0)+ -12>>2]|0)+24)>>2]|0;if(!((kc[c[(c[f>>2]|0)+24>>2]&63](f)|0)==-1)){i=b;return}f=c[d>>2]|0;d=c[(c[f>>2]|0)+ -12>>2]|0;e=f;Ne(e+d|0,c[e+(d+16)>>2]|1);i=b;return}function Mf(a){a=a|0;i=i;return 4856}function Nf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;if((c|0)==1){te(a,4872,35);i=d;return}else{le(a,b,c);i=d;return}}function Of(a){a=a|0;i=i;return}function Pf(a){a=a|0;var b=0;b=i;pe(a);Om(a);i=b;return}function Qf(a){a=a|0;var b=0;b=i;pe(a);i=b;return}function Rf(a){a=a|0;var b=0;b=i;Oe(a);Om(a);i=b;return}function Sf(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Tf(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Uf(a){a=a|0;i=i;return}function Vf(a){a=a|0;i=i;return}function Wf(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,j=0,k=0,l=0,m=0,n=0;b=i;a:do{if((e|0)==(f|0)){g=c;h=6}else{j=e;k=c;while(1){if((k|0)==(d|0)){l=-1;break a}m=a[k]|0;n=a[j]|0;if(m<<24>>24<n<<24>>24){l=-1;break a}if(n<<24>>24<m<<24>>24){l=1;break a}m=k+1|0;n=j+1|0;if((n|0)==(f|0)){g=m;h=6;break}else{j=n;k=m}}}}while(0);if((h|0)==6){l=(g|0)!=(d|0)|0}i=b;return l|0}function Xf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;g=e;h=f-g|0;if(h>>>0>4294967279){re(b)}if(h>>>0<11){a[b]=h<<1;j=b+1|0}else{k=h+16&-16;l=Mm(k)|0;c[b+8>>2]=l;c[b>>2]=k|1;c[b+4>>2]=h;j=l}if((e|0)==(f|0)){m=j;a[m]=0;i=d;return}else{n=e;o=j}while(1){a[o]=a[n]|0;e=n+1|0;if((e|0)==(f|0)){break}else{o=o+1|0;n=e}}m=j+(f+(0-g))|0;a[m]=0;i=d;return}function Yf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;b=i;if((c|0)==(d|0)){e=0;i=b;return e|0}else{f=0;g=c}while(1){c=(a[g]|0)+(f<<4)|0;h=c&-268435456;j=(h>>>24|h)^c;c=g+1|0;if((c|0)==(d|0)){e=j;break}else{g=c;f=j}}i=b;return e|0}function Zf(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function _f(a){a=a|0;i=i;return}function $f(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,j=0,k=0,l=0,m=0,n=0;a=i;a:do{if((e|0)==(f|0)){g=b;h=6}else{j=e;k=b;while(1){if((k|0)==(d|0)){l=-1;break a}m=c[k>>2]|0;n=c[j>>2]|0;if((m|0)<(n|0)){l=-1;break a}if((n|0)<(m|0)){l=1;break a}m=k+4|0;n=j+4|0;if((n|0)==(f|0)){g=m;h=6;break}else{j=n;k=m}}}}while(0);if((h|0)==6){l=(g|0)!=(d|0)|0}i=a;return l|0}function ag(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;d=i;g=e;h=f-g|0;j=h>>2;if(j>>>0>1073741807){re(b)}if(j>>>0<2){a[b]=h>>>1;k=b+4|0}else{h=j+4&-4;l=Mm(h<<2)|0;c[b+8>>2]=l;c[b>>2]=h|1;c[b+4>>2]=j;k=l}if((e|0)==(f|0)){m=k;c[m>>2]=0;i=d;return}l=f+ -4+(0-g)|0;g=e;e=k;while(1){c[e>>2]=c[g>>2];j=g+4|0;if((j|0)==(f|0)){break}else{e=e+4|0;g=j}}m=k+((l>>>2)+1<<2)|0;c[m>>2]=0;i=d;return}function bg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;a=i;if((b|0)==(d|0)){e=0;i=a;return e|0}else{f=0;g=b}while(1){b=(c[g>>2]|0)+(f<<4)|0;h=b&-268435456;j=(h>>>24|h)^b;b=g+4|0;if((b|0)==(d|0)){e=j;break}else{g=b;f=j}}i=a;return e|0}function cg(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function dg(a){a=a|0;i=i;return}function eg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+136|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=k+40|0;q=k+56|0;r=k+64|0;s=k+72|0;t=k+80|0;u=k+88|0;v=k+96|0;w=k+104|0;x=k+128|0;if((c[g+4>>2]&1|0)==0){c[q>>2]=-1;y=c[(c[d>>2]|0)+16>>2]|0;z=e;c[s>>2]=c[z>>2];c[t>>2]=c[f>>2];A=n;B=s;c[A+0>>2]=c[B+0>>2];B=m;A=t;c[B+0>>2]=c[A+0>>2];fc[y&63](r,d,n,m,g,h,q);m=c[r>>2]|0;c[z>>2]=m;z=c[q>>2]|0;if((z|0)==0){a[j]=0}else if((z|0)==1){a[j]=1}else{a[j]=1;c[h>>2]=4}c[b>>2]=m;i=k;return}Pe(u,g);m=u;u=c[m>>2]|0;if(!((c[1826]|0)==-1)){c[p>>2]=7304;c[p+4>>2]=113;c[p+8>>2]=0;qe(7304,p,114)}p=(c[7308>>2]|0)+ -1|0;z=c[u+8>>2]|0;if(!((c[u+12>>2]|0)-z>>2>>>0>p>>>0)){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}u=c[z+(p<<2)>>2]|0;if((u|0)==0){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}C=u;Yd(c[m>>2]|0)|0;Pe(v,g);g=v;v=c[g>>2]|0;if(!((c[1862]|0)==-1)){c[o>>2]=7448;c[o+4>>2]=113;c[o+8>>2]=0;qe(7448,o,114)}o=(c[7452>>2]|0)+ -1|0;m=c[v+8>>2]|0;if(!((c[v+12>>2]|0)-m>>2>>>0>o>>>0)){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}v=c[m+(o<<2)>>2]|0;if((v|0)==0){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}E=v;Yd(c[g>>2]|0)|0;g=w;F=v;ic[c[(c[F>>2]|0)+24>>2]&63](g,E);ic[c[(c[F>>2]|0)+28>>2]&63](w+12|0,E);c[x>>2]=c[f>>2];f=w+24|0;E=l;F=x;c[E+0>>2]=c[F+0>>2];F=fg(e,l,g,f,C,h,1)|0;a[j]=(F|0)==(g|0)|0;c[b>>2]=c[e>>2];ve(w+12|0);ve(w);i=k;return}function fg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;l=i;i=i+104|0;m=(g-f|0)/12|0;n=l;do{if(m>>>0>100){o=Hm(m)|0;if((o|0)!=0){p=o;q=o;break}Tm()}else{p=0;q=n}}while(0);n=(f|0)==(g|0);if(n){r=0;s=m}else{o=f;t=0;u=m;m=q;while(1){v=a[o]|0;if((v&1)==0){w=(v&255)>>>1}else{w=c[o+4>>2]|0}if((w|0)==0){a[m]=2;x=t+1|0;y=u+ -1|0}else{a[m]=1;x=t;y=u}v=o+12|0;if((v|0)==(g|0)){r=x;s=y;break}else{o=v;t=x;u=y;m=m+1|0}}}m=b;b=e;e=h;y=0;u=r;r=s;a:while(1){s=c[m>>2]|0;do{if((s|0)==0){z=0}else{if((c[s+12>>2]|0)!=(c[s+16>>2]|0)){z=s;break}if((kc[c[(c[s>>2]|0)+36>>2]&63](s)|0)==-1){c[m>>2]=0;z=0;break}else{z=c[m>>2]|0;break}}}while(0);s=(z|0)==0;x=c[b>>2]|0;do{if((x|0)==0){A=0}else{if((c[x+12>>2]|0)!=(c[x+16>>2]|0)){A=x;break}if(!((kc[c[(c[x>>2]|0)+36>>2]&63](x)|0)==-1)){A=x;break}c[b>>2]=0;A=0}}while(0);B=(A|0)==0;C=c[m>>2]|0;if(!((s^B)&(r|0)!=0)){break}x=c[C+12>>2]|0;if((x|0)==(c[C+16>>2]|0)){D=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{D=d[x]|0}x=D&255;if(k){E=x}else{E=tc[c[(c[e>>2]|0)+12>>2]&15](h,x)|0}x=y+1|0;if(n){y=x;r=r;u=u;continue}b:do{if(k){t=0;o=f;w=u;v=r;F=q;while(1){do{if((a[F]|0)==1){G=a[o]|0;H=(G&1)==0;if(H){I=o+1|0}else{I=c[o+8>>2]|0}if(!(E<<24>>24==(a[I+y|0]|0))){a[F]=0;J=t;K=w;L=v+ -1|0;break}if(H){M=(G&255)>>>1}else{M=c[o+4>>2]|0}if((M|0)!=(x|0)){J=1;K=w;L=v;break}a[F]=2;J=1;K=w+1|0;L=v+ -1|0}else{J=t;K=w;L=v}}while(0);G=o+12|0;if((G|0)==(g|0)){N=J;O=K;P=L;break b}t=J;o=G;w=K;v=L;F=F+1|0}}else{F=0;v=f;w=u;o=r;t=q;while(1){do{if((a[t]|0)==1){G=v;if((a[G]&1)==0){Q=v+1|0}else{Q=c[v+8>>2]|0}if(!(E<<24>>24==(tc[c[(c[e>>2]|0)+12>>2]&15](h,a[Q+y|0]|0)|0)<<24>>24)){a[t]=0;R=F;S=w;T=o+ -1|0;break}H=a[G]|0;if((H&1)==0){U=(H&255)>>>1}else{U=c[v+4>>2]|0}if((U|0)!=(x|0)){R=1;S=w;T=o;break}a[t]=2;R=1;S=w+1|0;T=o+ -1|0}else{R=F;S=w;T=o}}while(0);H=v+12|0;if((H|0)==(g|0)){N=R;O=S;P=T;break b}F=R;v=H;w=S;o=T;t=t+1|0}}}while(0);if(!N){y=x;u=O;r=P;continue}s=c[m>>2]|0;t=s+12|0;o=c[t>>2]|0;if((o|0)==(c[s+16>>2]|0)){kc[c[(c[s>>2]|0)+40>>2]&63](s)|0}else{c[t>>2]=o+1}if((P+O|0)>>>0<2){y=x;u=O;r=P;continue}else{V=f;W=O;X=q}while(1){do{if((a[X]|0)==2){o=a[V]|0;if((o&1)==0){Y=(o&255)>>>1}else{Y=c[V+4>>2]|0}if((Y|0)==(x|0)){Z=W;break}a[X]=0;Z=W+ -1|0}else{Z=W}}while(0);o=V+12|0;if((o|0)==(g|0)){y=x;u=Z;r=P;continue a}else{V=o;W=Z;X=X+1|0}}}do{if((C|0)==0){_=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){_=C;break}if((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1){c[m>>2]=0;_=0;break}else{_=c[m>>2]|0;break}}}while(0);m=(_|0)==0;do{if(B){$=78}else{if((c[A+12>>2]|0)!=(c[A+16>>2]|0)){if(m){break}else{$=80;break}}if((kc[c[(c[A>>2]|0)+36>>2]&63](A)|0)==-1){c[b>>2]=0;$=78;break}else{if(m){break}else{$=80;break}}}}while(0);if(($|0)==78){if(m){$=80}}if(($|0)==80){c[j>>2]=c[j>>2]|2}c:do{if(n){$=85}else{if((a[q]|0)==2){aa=f;break}else{ba=f;ca=q}while(1){m=ba+12|0;b=ca+1|0;if((m|0)==(g|0)){$=85;break c}if((a[b]|0)==2){aa=m;break}else{ca=b;ba=m}}}}while(0);if(($|0)==85){c[j>>2]=c[j>>2]|4;aa=g}if((p|0)==0){i=l;return aa|0}Im(p);i=l;return aa|0}function gg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];hg(a,0,k,j,f,g,h);i=b;return}function hg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==8){u=16}else if((t|0)==0){u=0}else if((t|0)==64){u=8}else{u=10}t=l;Zg(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((kc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}xe(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}xe(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{Q=d[I]|0}if((zg(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){kc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Sl(H,c[p>>2]|0,j,u)|0;jj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}function ig(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];jg(a,0,k,j,f,g,h);i=b;return}function jg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;Zg(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((kc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;J=(D&1)==0;if(J){K=(D&255)>>>1}else{K=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(K|0)){if(J){L=(D&255)>>>1;M=(D&255)>>>1}else{D=c[z>>2]|0;L=D;M=D}xe(o,M<<1,0);if((a[h]&1)==0){N=10}else{N=(c[g>>2]&-2)+ -1|0}xe(o,N,0);if((a[h]&1)==0){O=v}else{O=c[w>>2]|0}c[p>>2]=O+L;P=O}else{P=B}D=C+12|0;J=c[D>>2]|0;Q=C+16|0;if((J|0)==(c[Q>>2]|0)){R=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{R=d[J]|0}if((zg(R&255,u,P,p,s,A,n,l,r,t)|0)!=0){G=F;H=P;break}J=c[D>>2]|0;if((J|0)==(c[Q>>2]|0)){kc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=P;continue}else{c[D>>2]=J+1;m=C;B=P;continue}}P=a[n]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[n+4>>2]|0}do{if((S|0)!=0){P=c[r>>2]|0;if((P-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=P+4;c[P>>2]=B}}while(0);s=Rl(H,c[p>>2]|0,j,u)|0;u=k;c[u>>2]=s;c[u+4>>2]=I;jj(n,l,c[r>>2]|0,j);do{if((C|0)==0){T=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){T=C;break}if(!((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){T=C;break}c[y>>2]=0;T=0}}while(0);y=(T|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}function kg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];lg(a,0,k,j,f,g,h);i=b;return}function lg(e,f,g,h,j,k,l){e=e|0;f=f|0;g=g|0;h=h|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,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;f=i;i=i+256|0;m=f;n=f+32|0;o=f+40|0;p=f+56|0;q=f+72|0;r=f+80|0;s=f+240|0;t=f+248|0;u=c[j+4>>2]&74;if((u|0)==64){v=8}else if((u|0)==8){v=16}else if((u|0)==0){v=0}else{v=10}u=m;Zg(o,j,u,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;xe(p,10,0);if((a[j]&1)==0){m=p+1|0;w=m;x=p+8|0;y=m}else{m=p+8|0;w=p+1|0;x=m;y=c[m>>2]|0}c[q>>2]=y;m=r;c[s>>2]=m;c[t>>2]=0;z=g;g=h;h=p;A=p+4|0;B=a[n]|0;n=c[z>>2]|0;C=y;a:while(1){do{if((n|0)==0){D=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){D=n;break}if(!((kc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){D=n;break}c[z>>2]=0;D=0}}while(0);y=(D|0)==0;E=c[g>>2]|0;do{if((E|0)==0){F=18}else{if((c[E+12>>2]|0)!=(c[E+16>>2]|0)){if(y){G=E;break}else{H=E;I=C;break a}}if((kc[c[(c[E>>2]|0)+36>>2]&63](E)|0)==-1){c[g>>2]=0;F=18;break}else{if(y){G=E;break}else{H=E;I=C;break a}}}}while(0);if((F|0)==18){F=0;if(y){H=0;I=C;break}else{G=0}}E=a[j]|0;J=(E&1)==0;if(J){K=(E&255)>>>1}else{K=c[A>>2]|0}if(((c[q>>2]|0)-C|0)==(K|0)){if(J){L=(E&255)>>>1;M=(E&255)>>>1}else{E=c[A>>2]|0;L=E;M=E}xe(p,M<<1,0);if((a[j]&1)==0){N=10}else{N=(c[h>>2]&-2)+ -1|0}xe(p,N,0);if((a[j]&1)==0){O=w}else{O=c[x>>2]|0}c[q>>2]=O+L;P=O}else{P=C}E=D+12|0;J=c[E>>2]|0;Q=D+16|0;if((J|0)==(c[Q>>2]|0)){R=kc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{R=d[J]|0}if((zg(R&255,v,P,q,t,B,o,m,s,u)|0)!=0){H=G;I=P;break}J=c[E>>2]|0;if((J|0)==(c[Q>>2]|0)){kc[c[(c[D>>2]|0)+40>>2]&63](D)|0;n=D;C=P;continue}else{c[E>>2]=J+1;n=D;C=P;continue}}P=a[o]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[o+4>>2]|0}do{if((S|0)!=0){P=c[s>>2]|0;if((P-r|0)>=160){break}C=c[t>>2]|0;c[s>>2]=P+4;c[P>>2]=C}}while(0);b[l>>1]=Ql(I,c[q>>2]|0,k,v)|0;jj(o,m,c[s>>2]|0,k);do{if((D|0)==0){T=0}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){T=D;break}if(!((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1)){T=D;break}c[z>>2]=0;T=0}}while(0);z=(T|0)==0;do{if((H|0)==0){F=54}else{if((c[H+12>>2]|0)!=(c[H+16>>2]|0)){if(!z){break}U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}if((kc[c[(c[H>>2]|0)+36>>2]&63](H)|0)==-1){c[g>>2]=0;F=54;break}if(!(z^(H|0)==0)){break}U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}}while(0);do{if((F|0)==54){if(z){break}U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}}while(0);c[k>>2]=c[k>>2]|2;U=e;c[U>>2]=T;ve(p);ve(o);i=f;return}function mg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];ng(a,0,k,j,f,g,h);i=b;return}function ng(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==8){u=16}else if((t|0)==64){u=8}else if((t|0)==0){u=0}else{u=10}t=l;Zg(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((kc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}xe(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}xe(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{Q=d[I]|0}if((zg(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){kc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Pl(H,c[p>>2]|0,j,u)|0;jj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}function og(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];pg(a,0,k,j,f,g,h);i=b;return}function pg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==8){u=16}else if((t|0)==0){u=0}else{u=10}t=l;Zg(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((kc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}xe(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}xe(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{Q=d[I]|0}if((zg(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){kc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Ol(H,c[p>>2]|0,j,u)|0;jj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;ve(o);ve(n);i=e;return}function qg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];rg(a,0,k,j,f,g,h);i=b;return}function rg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;Zg(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((kc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;J=(D&1)==0;if(J){K=(D&255)>>>1}else{K=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(K|0)){if(J){L=(D&255)>>>1;M=(D&255)>>>1}else{D=c[z>>2]|0;L=D;M=D}xe(o,M<<1,0);if((a[h]&1)==0){N=10}else{N=(c[g>>2]&-2)+ -1|0}xe(o,N,0);if((a[h]&1)==0){O=v}else{O=c[w>>2]|0}c[p>>2]=O+L;P=O}else{P=B}D=C+12|0;J=c[D>>2]|0;Q=C+16|0;if((J|0)==(c[Q>>2]|0)){R=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{R=d[J]|0}if((zg(R&255,u,P,p,s,A,n,l,r,t)|0)!=0){G=F;H=P;break}J=c[D>>2]|0;if((J|0)==(c[Q>>2]|0)){kc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=P;continue}else{c[D>>2]=J+1;m=C;B=P;continue}}P=a[n]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[n+4>>2]|0}do{if((S|0)!=0){P=c[r>>2]|0;if((P-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=P+4;c[P>>2]=B}}while(0);s=Nl(H,c[p>>2]|0,j,u)|0;u=k;c[u>>2]=s;c[u+4>>2]=I;jj(n,l,c[r>>2]|0,j);do{if((C|0)==0){T=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){T=C;break}if(!((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){T=C;break}c[y>>2]=0;T=0}}while(0);y=(T|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;U=b;c[U>>2]=T;ve(o);ve(n);i=e;return}function sg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];tg(a,0,k,j,f,g,h);i=b;return}function tg(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;_g(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;xe(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=h;h=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((kc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}xe(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[h>>2]&-2)+ -1|0}xe(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=kc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=d[L]|0}if(($g(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){kc[c[(c[F>>2]|0)+40>>2]&63](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);g[l>>2]=+Ml(K,c[q>>2]|0,k);jj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((kc[c[(c[F>>2]|0)+36>>2]&63](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}if((kc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}function ug(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];vg(a,0,k,j,f,g,h);i=b;return}function vg(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;_g(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;xe(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=g;g=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((kc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}xe(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[g>>2]&-2)+ -1|0}xe(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=kc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=d[L]|0}if(($g(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){kc[c[(c[F>>2]|0)+40>>2]&63](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);h[l>>3]=+Ll(K,c[q>>2]|0,k);jj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((kc[c[(c[F>>2]|0)+36>>2]&63](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}if((kc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}function wg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];xg(a,0,k,j,f,g,h);i=b;return}function xg(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;_g(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;xe(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=g;g=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((kc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((kc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}xe(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[g>>2]&-2)+ -1|0}xe(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=kc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=d[L]|0}if(($g(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){kc[c[(c[F>>2]|0)+40>>2]&63](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);h[l>>3]=+Kl(K,c[q>>2]|0,k);jj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((kc[c[(c[F>>2]|0)+36>>2]&63](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}if((kc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;ve(p);ve(o);i=e;return}function yg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;e=i;i=i+8|0;l=e;m=i;i=i+16|0;n=i;i=i+32|0;o=i;i=i+16|0;p=i;i=i+8|0;q=i;i=i+16|0;r=i;i=i+160|0;s=o;c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;Pe(p,h);h=p;p=c[h>>2]|0;if(!((c[1826]|0)==-1)){c[m>>2]=7304;c[m+4>>2]=113;c[m+8>>2]=0;qe(7304,m,114)}m=(c[7308>>2]|0)+ -1|0;t=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-t>>2>>>0>m>>>0)){u=Ta(4)|0;v=u;mm(v);Vb(u|0,15264,101)}p=c[t+(m<<2)>>2]|0;if((p|0)==0){u=Ta(4)|0;v=u;mm(v);Vb(u|0,15264,101)}u=n;qc[c[(c[p>>2]|0)+32>>2]&7](p,5848,5874|0,u)|0;Yd(c[h>>2]|0)|0;h=q;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(q,10,0);if((a[h]&1)==0){p=q+1|0;w=p;x=q+8|0;y=p}else{p=q+8|0;w=q+1|0;x=p;y=c[p>>2]|0}p=f;f=g;g=q;v=q+4|0;m=n+24|0;t=n+25|0;z=r;A=n+26|0;B=n;n=o+4|0;C=c[p>>2]|0;D=y;E=r;r=0;F=y;a:while(1){do{if((C|0)==0){G=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){G=C;break}if(!((kc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){G=C;break}c[p>>2]=0;G=0}}while(0);y=(G|0)==0;H=c[f>>2]|0;do{if((H|0)==0){I=19}else{if((c[H+12>>2]|0)!=(c[H+16>>2]|0)){if(y){break}else{J=F;break a}}if((kc[c[(c[H>>2]|0)+36>>2]&63](H)|0)==-1){c[f>>2]=0;I=19;break}else{if(y){break}else{J=F;break a}}}}while(0);if((I|0)==19){I=0;if(y){J=F;break}}H=a[h]|0;K=(H&1)==0;if(K){L=(H&255)>>>1}else{L=c[v>>2]|0}if((D-F|0)==(L|0)){if(K){M=(H&255)>>>1;N=(H&255)>>>1}else{H=c[v>>2]|0;M=H;N=H}xe(q,N<<1,0);if((a[h]&1)==0){O=10}else{O=(c[g>>2]&-2)+ -1|0}xe(q,O,0);if((a[h]&1)==0){P=w}else{P=c[x>>2]|0}Q=P+M|0;R=P}else{Q=D;R=F}H=c[G+12>>2]|0;if((H|0)==(c[G+16>>2]|0)){S=kc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{S=d[H]|0}H=S&255;K=(Q|0)==(R|0);do{if(K){T=(a[m]|0)==H<<24>>24;if(!T){if(!((a[t]|0)==H<<24>>24)){I=40;break}}a[Q]=T?43:45;U=Q+1|0;V=E;W=0}else{I=40}}while(0);do{if((I|0)==40){I=0;y=a[s]|0;if((y&1)==0){X=(y&255)>>>1}else{X=c[n>>2]|0}if((X|0)!=0&H<<24>>24==0){if((E-z|0)>=160){U=Q;V=E;W=r;break}c[E>>2]=r;U=Q;V=E+4|0;W=0;break}else{Y=u}while(1){y=Y+1|0;if((a[Y]|0)==H<<24>>24){Z=Y;break}if((y|0)==(A|0)){Z=A;break}else{Y=y}}y=Z-B|0;if((y|0)>23){J=R;break a}if((y|0)<22){a[Q]=a[5848+y|0]|0;U=Q+1|0;V=E;W=r+1|0;break}if(K){J=Q;break a}if((Q-R|0)>=3){J=R;break a}if((a[Q+ -1|0]|0)!=48){J=R;break a}a[Q]=a[5848+y|0]|0;U=Q+1|0;V=E;W=0}}while(0);K=c[p>>2]|0;H=K+12|0;y=c[H>>2]|0;if((y|0)==(c[K+16>>2]|0)){kc[c[(c[K>>2]|0)+40>>2]&63](K)|0;C=K;D=U;E=V;r=W;F=R;continue}else{c[H>>2]=y+1;C=K;D=U;E=V;r=W;F=R;continue}}a[J+3|0]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);R=c[1798]|0;c[l>>2]=k;if((Ag(J,R,5888,l)|0)!=1){c[j>>2]=4}l=c[p>>2]|0;do{if((l|0)==0){_=0}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){_=l;break}if(!((kc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1)){_=l;break}c[p>>2]=0;_=0}}while(0);p=(_|0)==0;l=c[f>>2]|0;do{if((l|0)==0){I=72}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){if(!p){break}$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}if((kc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1){c[f>>2]=0;I=72;break}if(!(p^(l|0)==0)){break}$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}}while(0);do{if((I|0)==72){if(p){break}$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;$=b;c[$>>2]=_;ve(q);ve(o);i=e;return}function zg(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;o=c[f>>2]|0;p=(o|0)==(e|0);do{if(p){q=(a[m+24|0]|0)==b<<24>>24;if(!q){if(!((a[m+25|0]|0)==b<<24>>24)){break}}c[f>>2]=e+1;a[e]=q?43:45;c[g>>2]=0;r=0;i=n;return r|0}}while(0);q=a[j]|0;if((q&1)==0){s=(q&255)>>>1}else{s=c[j+4>>2]|0}if((s|0)!=0&b<<24>>24==h<<24>>24){h=c[l>>2]|0;if((h-k|0)>=160){r=0;i=n;return r|0}k=c[g>>2]|0;c[l>>2]=h+4;c[h>>2]=k;c[g>>2]=0;r=0;i=n;return r|0}k=m+26|0;h=m;while(1){l=h+1|0;if((a[h]|0)==b<<24>>24){t=h;break}if((l|0)==(k|0)){t=k;break}else{h=l}}h=t-m|0;if((h|0)>23){r=-1;i=n;return r|0}do{if((d|0)==10|(d|0)==8){if((h|0)<(d|0)){break}else{r=-1}i=n;return r|0}else if((d|0)==16){if((h|0)<22){break}if(p){r=-1;i=n;return r|0}if((o-e|0)>=3){r=-1;i=n;return r|0}if((a[o+ -1|0]|0)!=48){r=-1;i=n;return r|0}c[g>>2]=0;m=a[5848+h|0]|0;c[f>>2]=o+1;a[o]=m;r=0;i=n;return r|0}}while(0);e=a[5848+h|0]|0;c[f>>2]=o+1;a[o]=e;c[g>>2]=(c[g>>2]|0)+1;r=0;i=n;return r|0}function Ag(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=fb(b|0)|0;b=Ia(a|0,d|0,g|0)|0;if((e|0)==0){i=f;return b|0}fb(e|0)|0;i=f;return b|0}function Bg(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Cg(a){a=a|0;i=i;return}function Dg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+136|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=k+40|0;q=k+56|0;r=k+64|0;s=k+72|0;t=k+80|0;u=k+88|0;v=k+96|0;w=k+104|0;x=k+128|0;if((c[g+4>>2]&1|0)==0){c[q>>2]=-1;y=c[(c[d>>2]|0)+16>>2]|0;z=e;c[s>>2]=c[z>>2];c[t>>2]=c[f>>2];A=n;B=s;c[A+0>>2]=c[B+0>>2];B=m;A=t;c[B+0>>2]=c[A+0>>2];fc[y&63](r,d,n,m,g,h,q);m=c[r>>2]|0;c[z>>2]=m;z=c[q>>2]|0;if((z|0)==1){a[j]=1}else if((z|0)==0){a[j]=0}else{a[j]=1;c[h>>2]=4}c[b>>2]=m;i=k;return}Pe(u,g);m=u;u=c[m>>2]|0;if(!((c[1824]|0)==-1)){c[p>>2]=7296;c[p+4>>2]=113;c[p+8>>2]=0;qe(7296,p,114)}p=(c[7300>>2]|0)+ -1|0;z=c[u+8>>2]|0;if(!((c[u+12>>2]|0)-z>>2>>>0>p>>>0)){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}u=c[z+(p<<2)>>2]|0;if((u|0)==0){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}C=u;Yd(c[m>>2]|0)|0;Pe(v,g);g=v;v=c[g>>2]|0;if(!((c[1864]|0)==-1)){c[o>>2]=7456;c[o+4>>2]=113;c[o+8>>2]=0;qe(7456,o,114)}o=(c[7460>>2]|0)+ -1|0;m=c[v+8>>2]|0;if(!((c[v+12>>2]|0)-m>>2>>>0>o>>>0)){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}v=c[m+(o<<2)>>2]|0;if((v|0)==0){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}E=v;Yd(c[g>>2]|0)|0;g=w;F=v;ic[c[(c[F>>2]|0)+24>>2]&63](g,E);ic[c[(c[F>>2]|0)+28>>2]&63](w+12|0,E);c[x>>2]=c[f>>2];f=w+24|0;E=l;F=x;c[E+0>>2]=c[F+0>>2];F=Eg(e,l,g,f,C,h,1)|0;a[j]=(F|0)==(g|0)|0;c[b>>2]=c[e>>2];Ge(w+12|0);Ge(w);i=k;return}\n\n\n\nfunction ej(e,f,g,h,j,k,l,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var 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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,ic=0,jc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0;q=i;i=i+408|0;r=q;s=q+400|0;t=s;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+8|0;D=r;c[s>>2]=0;E=w;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;F=x;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;G=y;c[G+0>>2]=0;c[G+4>>2]=0;c[G+8>>2]=0;H=z;c[H+0>>2]=0;c[H+4>>2]=0;c[H+8>>2]=0;I=A;c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;ij(g,h,t,u,v,w,x,y,z,B);t=n;c[o>>2]=c[t>>2];h=e;e=f;f=s;s=m+8|0;m=z+1|0;g=z+4|0;J=z+8|0;K=y+1|0;L=y+4|0;M=y+8|0;N=(j&512|0)!=0;j=x+1|0;O=x+8|0;P=x+4|0;Q=A;R=Q+1|0;S=A+8|0;T=A+4|0;U=f+3|0;V=n+4|0;n=w+4|0;W=r+400|0;r=D;X=D;D=p;p=0;Y=0;Z=115;a:while(1){_=c[h>>2]|0;do{if((_|0)==0){$=0}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){$=_;break}if((kc[c[(c[_>>2]|0)+36>>2]&63](_)|0)==-1){c[h>>2]=0;$=0;break}else{$=c[h>>2]|0;break}}}while(0);_=($|0)==0;aa=c[e>>2]|0;do{if((aa|0)==0){ba=12}else{if((c[aa+12>>2]|0)!=(c[aa+16>>2]|0)){if(_){ca=aa;break}else{da=X;ea=r;fa=Y;ga=Z;ba=269;break a}}if((kc[c[(c[aa>>2]|0)+36>>2]&63](aa)|0)==-1){c[e>>2]=0;ba=12;break}else{if(_){ca=aa;break}else{da=X;ea=r;fa=Y;ga=Z;ba=269;break a}}}}while(0);if((ba|0)==12){ba=0;if(_){da=X;ea=r;fa=Y;ga=Z;ba=269;break}else{ca=0}}b:do{switch(a[f+p|0]|0){case 4:{aa=D;ha=X;ia=r;ja=W;ka=0;la=Z;c:while(1){ma=c[h>>2]|0;do{if((ma|0)==0){na=0}else{if((c[ma+12>>2]|0)!=(c[ma+16>>2]|0)){na=ma;break}if((kc[c[(c[ma>>2]|0)+36>>2]&63](ma)|0)==-1){c[h>>2]=0;na=0;break}else{na=c[h>>2]|0;break}}}while(0);ma=(na|0)==0;oa=c[e>>2]|0;do{if((oa|0)==0){ba=173}else{if((c[oa+12>>2]|0)!=(c[oa+16>>2]|0)){if(ma){break}else{break c}}if((kc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0)==-1){c[e>>2]=0;ba=173;break}else{if(ma){break}else{break c}}}}while(0);if((ba|0)==173){ba=0;if(ma){break}}oa=c[h>>2]|0;pa=c[oa+12>>2]|0;if((pa|0)==(c[oa+16>>2]|0)){qa=kc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0}else{qa=d[pa]|0}pa=qa&255;do{if(pa<<24>>24>-1){if((b[(c[s>>2]|0)+(qa<<24>>24<<1)>>1]&2048)==0){ba=189;break}oa=c[o>>2]|0;if((oa|0)==(aa|0)){ra=(c[V>>2]|0)!=115;sa=c[t>>2]|0;ta=aa-sa|0;ua=ta>>>0<2147483647?ta<<1:-1;va=Jm(ra?sa:0,ua)|0;if((va|0)==0){ba=182;break a}do{if(ra){c[t>>2]=va;wa=va}else{sa=c[t>>2]|0;c[t>>2]=va;if((sa|0)==0){wa=va;break}hc[c[V>>2]&127](sa);wa=c[t>>2]|0}}while(0);c[V>>2]=116;va=wa+ta|0;c[o>>2]=va;xa=va;ya=(c[t>>2]|0)+ua|0}else{xa=oa;ya=aa}c[o>>2]=xa+1;a[xa]=pa;za=ya;Aa=ha;Ba=ia;Ca=ja;Da=ka+1|0;Ea=la}else{ba=189}}while(0);if((ba|0)==189){ba=0;ma=a[E]|0;if((ma&1)==0){Fa=(ma&255)>>>1}else{Fa=c[n>>2]|0}if((Fa|0)==0|(ka|0)==0){break}if(!(pa<<24>>24==(a[v]|0))){break}if((ia|0)==(ja|0)){ma=ia-ha|0;va=ma>>>0<2147483647?ma<<1:-1;if((la|0)==115){Ga=0}else{Ga=ha}ra=Jm(Ga,va)|0;sa=ra;if((ra|0)==0){ba=198;break a}Ha=sa;Ia=sa+(ma>>2<<2)|0;Ja=sa+(va>>>2<<2)|0;Ka=116}else{Ha=ha;Ia=ia;Ja=ja;Ka=la}c[Ia>>2]=ka;za=aa;Aa=Ha;Ba=Ia+4|0;Ca=Ja;Da=0;Ea=Ka}va=c[h>>2]|0;sa=va+12|0;ma=c[sa>>2]|0;if((ma|0)==(c[va+16>>2]|0)){kc[c[(c[va>>2]|0)+40>>2]&63](va)|0;aa=za;ha=Aa;ia=Ba;ja=Ca;ka=Da;la=Ea;continue}else{c[sa>>2]=ma+1;aa=za;ha=Aa;ia=Ba;ja=Ca;ka=Da;la=Ea;continue}}if((ha|0)==(ia|0)|(ka|0)==0){La=ha;Ma=ia;Na=ja;Oa=la}else{if((ia|0)==(ja|0)){ma=ia-ha|0;sa=ma>>>0<2147483647?ma<<1:-1;if((la|0)==115){Pa=0}else{Pa=ha}va=Jm(Pa,sa)|0;ra=va;if((va|0)==0){ba=209;break a}Qa=ra;Ra=ra+(ma>>2<<2)|0;Sa=ra+(sa>>>2<<2)|0;Ta=116}else{Qa=ha;Ra=ia;Sa=ja;Ta=la}c[Ra>>2]=ka;La=Qa;Ma=Ra+4|0;Na=Sa;Oa=Ta}sa=c[B>>2]|0;if((sa|0)>0){ra=c[h>>2]|0;do{if((ra|0)==0){Ua=0}else{if((c[ra+12>>2]|0)!=(c[ra+16>>2]|0)){Ua=ra;break}if((kc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0)==-1){c[h>>2]=0;Ua=0;break}else{Ua=c[h>>2]|0;break}}}while(0);ra=(Ua|0)==0;ka=c[e>>2]|0;do{if((ka|0)==0){ba=223}else{if((c[ka+12>>2]|0)!=(c[ka+16>>2]|0)){if(ra){Va=ka;break}else{ba=229;break a}}if((kc[c[(c[ka>>2]|0)+36>>2]&63](ka)|0)==-1){c[e>>2]=0;ba=223;break}else{if(ra){Va=ka;break}else{ba=229;break a}}}}while(0);if((ba|0)==223){ba=0;if(ra){ba=229;break a}else{Va=0}}ka=c[h>>2]|0;la=c[ka+12>>2]|0;if((la|0)==(c[ka+16>>2]|0)){Wa=kc[c[(c[ka>>2]|0)+36>>2]&63](ka)|0}else{Wa=d[la]|0}if(!((Wa&255)<<24>>24==(a[u]|0))){ba=229;break a}la=c[h>>2]|0;ka=la+12|0;ja=c[ka>>2]|0;if((ja|0)==(c[la+16>>2]|0)){kc[c[(c[la>>2]|0)+40>>2]&63](la)|0;Xa=Va;Ya=sa;Za=Va;_a=aa}else{c[ka>>2]=ja+1;Xa=Va;Ya=sa;Za=Va;_a=aa}while(1){ja=c[h>>2]|0;do{if((ja|0)==0){$a=0}else{if((c[ja+12>>2]|0)!=(c[ja+16>>2]|0)){$a=ja;break}if((kc[c[(c[ja>>2]|0)+36>>2]&63](ja)|0)==-1){c[h>>2]=0;$a=0;break}else{$a=c[h>>2]|0;break}}}while(0);ja=($a|0)==0;do{if((Za|0)==0){ab=Xa;ba=243}else{if((c[Za+12>>2]|0)!=(c[Za+16>>2]|0)){if(ja){bb=Xa;cb=Za;break}else{ba=250;break a}}if((kc[c[(c[Za>>2]|0)+36>>2]&63](Za)|0)==-1){c[e>>2]=0;ab=0;ba=243;break}else{if(ja^(Xa|0)==0){bb=Xa;cb=Xa;break}else{ba=250;break a}}}}while(0);if((ba|0)==243){ba=0;if(ja){ba=250;break a}else{bb=ab;cb=0}}pa=c[h>>2]|0;ka=c[pa+12>>2]|0;if((ka|0)==(c[pa+16>>2]|0)){db=kc[c[(c[pa>>2]|0)+36>>2]&63](pa)|0}else{db=d[ka]|0}if(!((db&255)<<24>>24>-1)){ba=250;break a}if((b[(c[s>>2]|0)+(db<<24>>24<<1)>>1]&2048)==0){ba=250;break a}ka=c[o>>2]|0;if((ka|0)==(_a|0)){pa=(c[V>>2]|0)!=115;la=c[t>>2]|0;ia=_a-la|0;ha=ia>>>0<2147483647?ia<<1:-1;ma=Jm(pa?la:0,ha)|0;if((ma|0)==0){ba=253;break a}do{if(pa){c[t>>2]=ma;eb=ma}else{la=c[t>>2]|0;c[t>>2]=ma;if((la|0)==0){eb=ma;break}hc[c[V>>2]&127](la);eb=c[t>>2]|0}}while(0);c[V>>2]=116;ma=eb+ia|0;c[o>>2]=ma;fb=ma;gb=(c[t>>2]|0)+ha|0}else{fb=ka;gb=_a}ma=c[h>>2]|0;pa=c[ma+12>>2]|0;if((pa|0)==(c[ma+16>>2]|0)){ja=kc[c[(c[ma>>2]|0)+36>>2]&63](ma)|0;hb=ja;ib=c[o>>2]|0}else{hb=d[pa]|0;ib=fb}c[o>>2]=ib+1;a[ib]=hb;pa=Ya+ -1|0;c[B>>2]=pa;ja=c[h>>2]|0;ma=ja+12|0;la=c[ma>>2]|0;if((la|0)==(c[ja+16>>2]|0)){kc[c[(c[ja>>2]|0)+40>>2]&63](ja)|0}else{c[ma>>2]=la+1}if((pa|0)>0){Xa=bb;Ya=pa;Za=cb;_a=gb}else{jb=gb;break}}}else{jb=aa}if((c[o>>2]|0)==(c[t>>2]|0)){ba=267;break a}else{kb=jb;lb=La;mb=Ma;nb=Na;ob=Y;pb=Oa}break};case 1:{if((p|0)==3){da=X;ea=r;fa=Y;ga=Z;ba=269;break a}sa=c[h>>2]|0;ra=c[sa+12>>2]|0;if((ra|0)==(c[sa+16>>2]|0)){qb=kc[c[(c[sa>>2]|0)+36>>2]&63](sa)|0}else{qb=d[ra]|0}if(!((qb&255)<<24>>24>-1)){ba=25;break a}if((b[(c[s>>2]|0)+(qb<<24>>24<<1)>>1]&8192)==0){ba=25;break a}ra=c[h>>2]|0;sa=ra+12|0;pa=c[sa>>2]|0;if((pa|0)==(c[ra+16>>2]|0)){rb=kc[c[(c[ra>>2]|0)+40>>2]&63](ra)|0}else{c[sa>>2]=pa+1;rb=d[pa]|0}Ae(A,rb&255);ba=26;break};case 3:{pa=a[G]|0;sa=(pa&1)==0;if(sa){sb=(pa&255)>>>1}else{sb=c[L>>2]|0}ra=a[H]|0;la=(ra&1)==0;if(la){tb=(ra&255)>>>1}else{tb=c[g>>2]|0}if((sb|0)==(0-tb|0)){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}if(sa){ub=(pa&255)>>>1}else{ub=c[L>>2]|0}do{if((ub|0)!=0){if(la){vb=(ra&255)>>>1}else{vb=c[g>>2]|0}if((vb|0)==0){break}ma=c[h>>2]|0;ja=c[ma+12>>2]|0;va=c[ma+16>>2]|0;if((ja|0)==(va|0)){wb=kc[c[(c[ma>>2]|0)+36>>2]&63](ma)|0;xb=c[h>>2]|0;yb=wb;zb=c[xb+16>>2]|0;Ab=c[xb+12>>2]|0;Bb=xb;Cb=a[G]|0}else{yb=d[ja]|0;zb=va;Ab=ja;Bb=ma;Cb=pa}ma=Bb+12|0;ja=(Ab|0)==(zb|0);if((yb&255)<<24>>24==(a[(Cb&1)==0?K:c[M>>2]|0]|0)){if(ja){kc[c[(c[Bb>>2]|0)+40>>2]&63](Bb)|0}else{c[ma>>2]=Ab+1}ma=a[G]|0;if((ma&1)==0){Db=(ma&255)>>>1}else{Db=c[L>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Db>>>0>1?y:Y;pb=Z;break b}if(ja){Eb=kc[c[(c[Bb>>2]|0)+36>>2]&63](Bb)|0}else{Eb=d[Ab]|0}if(!((Eb&255)<<24>>24==(a[(a[H]&1)==0?m:c[J>>2]|0]|0))){ba=112;break a}ja=c[h>>2]|0;ma=ja+12|0;va=c[ma>>2]|0;if((va|0)==(c[ja+16>>2]|0)){kc[c[(c[ja>>2]|0)+40>>2]&63](ja)|0}else{c[ma>>2]=va+1}a[l]=1;va=a[H]|0;if((va&1)==0){Fb=(va&255)>>>1}else{Fb=c[g>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Fb>>>0>1?z:Y;pb=Z;break b}}while(0);if(sa){Gb=(pa&255)>>>1}else{Gb=c[L>>2]|0}la=c[h>>2]|0;aa=c[la+12>>2]|0;va=(aa|0)==(c[la+16>>2]|0);if((Gb|0)==0){if(va){ma=kc[c[(c[la>>2]|0)+36>>2]&63](la)|0;Hb=ma;Ib=a[H]|0}else{Hb=d[aa]|0;Ib=ra}if(!((Hb&255)<<24>>24==(a[(Ib&1)==0?m:c[J>>2]|0]|0))){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}ma=c[h>>2]|0;ja=ma+12|0;xb=c[ja>>2]|0;if((xb|0)==(c[ma+16>>2]|0)){kc[c[(c[ma>>2]|0)+40>>2]&63](ma)|0}else{c[ja>>2]=xb+1}a[l]=1;xb=a[H]|0;if((xb&1)==0){Jb=(xb&255)>>>1}else{Jb=c[g>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Jb>>>0>1?z:Y;pb=Z;break b}if(va){va=kc[c[(c[la>>2]|0)+36>>2]&63](la)|0;Kb=va;Lb=a[G]|0}else{Kb=d[aa]|0;Lb=pa}if(!((Kb&255)<<24>>24==(a[(Lb&1)==0?K:c[M>>2]|0]|0))){a[l]=1;kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}aa=c[h>>2]|0;va=aa+12|0;la=c[va>>2]|0;if((la|0)==(c[aa+16>>2]|0)){kc[c[(c[aa>>2]|0)+40>>2]&63](aa)|0}else{c[va>>2]=la+1}la=a[G]|0;if((la&1)==0){Mb=(la&255)>>>1}else{Mb=c[L>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Mb>>>0>1?y:Y;pb=Z;break};case 2:{if(!((Y|0)!=0|p>>>0<2)){if((p|0)==2){Nb=(a[U]|0)!=0}else{Nb=0}if(!(N|Nb)){kb=D;lb=X;mb=r;nb=W;ob=0;pb=Z;break b}}la=a[F]|0;va=(la&1)==0;aa=va?j:c[O>>2]|0;d:do{if((p|0)==0){Ob=ca;Pb=ca;Qb=la;Rb=aa}else{if((d[f+(p+ -1)|0]|0)>=2){Ob=ca;Pb=ca;Qb=la;Rb=aa;break}xb=aa+(va?(la&255)>>>1:c[P>>2]|0)|0;ja=aa;while(1){if((ja|0)==(xb|0)){Sb=xb;break}ma=a[ja]|0;if(!(ma<<24>>24>-1)){Sb=ja;break}if((b[(c[s>>2]|0)+(ma<<24>>24<<1)>>1]&8192)==0){Sb=ja;break}else{ja=ja+1|0}}ja=Sb-aa|0;xb=a[I]|0;ka=(xb&1)==0;if(ka){Tb=(xb&255)>>>1}else{Tb=c[T>>2]|0}if(ja>>>0>Tb>>>0){Ob=ca;Pb=ca;Qb=la;Rb=aa;break}if(ka){ka=(xb&255)>>>1;Ub=Q+(ka-ja)+1|0;Vb=R;Wb=ka}else{ka=c[S>>2]|0;xb=c[T>>2]|0;Ub=ka+(xb-ja)|0;Vb=ka;Wb=xb}xb=Vb+Wb|0;if((Ub|0)==(xb|0)){Ob=ca;Pb=ca;Qb=la;Rb=Sb;break}else{Xb=aa;Yb=Ub}while(1){if((a[Yb]|0)!=(a[Xb]|0)){Ob=ca;Pb=ca;Qb=la;Rb=aa;break d}ka=Yb+1|0;if((ka|0)==(xb|0)){Ob=ca;Pb=ca;Qb=la;Rb=Sb;break}else{Xb=Xb+1|0;Yb=ka}}}}while(0);e:while(1){if((Qb&1)==0){Zb=j;_b=(Qb&255)>>>1}else{Zb=c[O>>2]|0;_b=c[P>>2]|0}if((Rb|0)==(Zb+_b|0)){break}la=c[h>>2]|0;do{if((la|0)==0){$b=0}else{if((c[la+12>>2]|0)!=(c[la+16>>2]|0)){$b=la;break}if((kc[c[(c[la>>2]|0)+36>>2]&63](la)|0)==-1){c[h>>2]=0;$b=0;break}else{$b=c[h>>2]|0;break}}}while(0);la=($b|0)==0;do{if((Pb|0)==0){ac=Ob;ba=147}else{if((c[Pb+12>>2]|0)!=(c[Pb+16>>2]|0)){if(la){bc=Ob;cc=Pb;break}else{break e}}if((kc[c[(c[Pb>>2]|0)+36>>2]&63](Pb)|0)==-1){c[e>>2]=0;ac=0;ba=147;break}else{if(la^(Ob|0)==0){bc=Ob;cc=Ob;break}else{break e}}}}while(0);if((ba|0)==147){ba=0;if(la){break}else{bc=ac;cc=0}}aa=c[h>>2]|0;va=c[aa+12>>2]|0;if((va|0)==(c[aa+16>>2]|0)){dc=kc[c[(c[aa>>2]|0)+36>>2]&63](aa)|0}else{dc=d[va]|0}if(!((dc&255)<<24>>24==(a[Rb]|0))){break}va=c[h>>2]|0;aa=va+12|0;pa=c[aa>>2]|0;if((pa|0)==(c[va+16>>2]|0)){kc[c[(c[va>>2]|0)+40>>2]&63](va)|0}else{c[aa>>2]=pa+1}Ob=bc;Pb=cc;Qb=a[F]|0;Rb=Rb+1|0}if(!N){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}pa=a[F]|0;if((pa&1)==0){ec=j;fc=(pa&255)>>>1}else{ec=c[O>>2]|0;fc=c[P>>2]|0}if((Rb|0)==(ec+fc|0)){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z}else{ba=162;break a}break};case 0:{ba=26;break};default:{kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z}}}while(0);f:do{if((ba|0)==26){ba=0;if((p|0)==3){da=X;ea=r;fa=Y;ga=Z;ba=269;break a}else{gc=ca;ic=ca}while(1){_=c[h>>2]|0;do{if((_|0)==0){jc=0}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){jc=_;break}if((kc[c[(c[_>>2]|0)+36>>2]&63](_)|0)==-1){c[h>>2]=0;jc=0;break}else{jc=c[h>>2]|0;break}}}while(0);_=(jc|0)==0;do{if((ic|0)==0){lc=gc;ba=37}else{if((c[ic+12>>2]|0)!=(c[ic+16>>2]|0)){if(_){mc=gc;nc=ic;break}else{kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}}if((kc[c[(c[ic>>2]|0)+36>>2]&63](ic)|0)==-1){c[e>>2]=0;lc=0;ba=37;break}else{if(_^(gc|0)==0){mc=gc;nc=gc;break}else{kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}}}}while(0);if((ba|0)==37){ba=0;if(_){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}else{mc=lc;nc=0}}la=c[h>>2]|0;pa=c[la+12>>2]|0;if((pa|0)==(c[la+16>>2]|0)){oc=kc[c[(c[la>>2]|0)+36>>2]&63](la)|0}else{oc=d[pa]|0}if(!((oc&255)<<24>>24>-1)){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}if((b[(c[s>>2]|0)+(oc<<24>>24<<1)>>1]&8192)==0){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}pa=c[h>>2]|0;la=pa+12|0;aa=c[la>>2]|0;if((aa|0)==(c[pa+16>>2]|0)){pc=kc[c[(c[pa>>2]|0)+40>>2]&63](pa)|0}else{c[la>>2]=aa+1;pc=d[aa]|0}Ae(A,pc&255);gc=mc;ic=nc}}}while(0);aa=p+1|0;if(aa>>>0<4){W=nb;r=mb;X=lb;D=kb;p=aa;Y=ob;Z=pb}else{da=lb;ea=mb;fa=ob;ga=pb;ba=269;break}}g:do{if((ba|0)==25){c[k>>2]=c[k>>2]|4;qc=0;rc=X;sc=Z}else if((ba|0)==112){c[k>>2]=c[k>>2]|4;qc=0;rc=X;sc=Z}else if((ba|0)==162){c[k>>2]=c[k>>2]|4;qc=0;rc=X;sc=Z}else if((ba|0)==182){Tm()}else if((ba|0)==198){Tm()}else if((ba|0)==209){Tm()}else if((ba|0)==229){c[k>>2]=c[k>>2]|4;qc=0;rc=La;sc=Oa}else if((ba|0)==250){c[k>>2]=c[k>>2]|4;qc=0;rc=La;sc=Oa}else if((ba|0)==253){Tm()}else if((ba|0)==267){c[k>>2]=c[k>>2]|4;qc=0;rc=La;sc=Oa}else if((ba|0)==269){h:do{if((fa|0)!=0){pb=fa;ob=fa+1|0;mb=fa+8|0;lb=fa+4|0;Y=1;i:while(1){p=a[pb]|0;if((p&1)==0){tc=(p&255)>>>1}else{tc=c[lb>>2]|0}if(!(Y>>>0<tc>>>0)){break h}p=c[h>>2]|0;do{if((p|0)==0){uc=0}else{if((c[p+12>>2]|0)!=(c[p+16>>2]|0)){uc=p;break}if((kc[c[(c[p>>2]|0)+36>>2]&63](p)|0)==-1){c[h>>2]=0;uc=0;break}else{uc=c[h>>2]|0;break}}}while(0);p=(uc|0)==0;_=c[e>>2]|0;do{if((_|0)==0){ba=285}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){if(p){break}else{break i}}if((kc[c[(c[_>>2]|0)+36>>2]&63](_)|0)==-1){c[e>>2]=0;ba=285;break}else{if(p){break}else{break i}}}}while(0);if((ba|0)==285){ba=0;if(p){break}}_=c[h>>2]|0;kb=c[_+12>>2]|0;if((kb|0)==(c[_+16>>2]|0)){vc=kc[c[(c[_>>2]|0)+36>>2]&63](_)|0}else{vc=d[kb]|0}if((a[pb]&1)==0){wc=ob}else{wc=c[mb>>2]|0}if(!((vc&255)<<24>>24==(a[wc+Y|0]|0))){break}kb=Y+1|0;_=c[h>>2]|0;D=_+12|0;r=c[D>>2]|0;if((r|0)==(c[_+16>>2]|0)){kc[c[(c[_>>2]|0)+40>>2]&63](_)|0;Y=kb;continue}else{c[D>>2]=r+1;Y=kb;continue}}c[k>>2]=c[k>>2]|4;qc=0;rc=da;sc=ga;break g}}while(0);if((da|0)==(ea|0)){qc=1;rc=ea;sc=ga;break}c[C>>2]=0;jj(w,da,ea,C);if((c[C>>2]|0)==0){qc=1;rc=da;sc=ga;break}c[k>>2]=c[k>>2]|4;qc=0;rc=da;sc=ga}}while(0);ve(A);ve(z);ve(y);ve(x);ve(w);if((rc|0)==0){i=q;return qc|0}hc[sc&127](rc);i=q;return qc|0}function fj(a){a=a|0;var b=0;b=Ta(8)|0;ce(b,a);Vb(b|0,4312,11)}function gj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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=i;i=i+168|0;l=d;m=d+8|0;n=d+24|0;o=d+128|0;p=d+136|0;q=d+144|0;r=d+152|0;s=d+160|0;t=o;c[t>>2]=n;u=o+4|0;c[u>>2]=115;v=n+100|0;Pe(q,h);n=q;w=c[n>>2]|0;if(!((c[1826]|0)==-1)){c[m>>2]=7304;c[m+4>>2]=113;c[m+8>>2]=0;qe(7304,m,114)}m=(c[7308>>2]|0)+ -1|0;x=c[w+8>>2]|0;if(!((c[w+12>>2]|0)-x>>2>>>0>m>>>0)){y=Ta(4)|0;z=y;mm(z);Vb(y|0,15264,101)}w=c[x+(m<<2)>>2]|0;if((w|0)==0){y=Ta(4)|0;z=y;mm(z);Vb(y|0,15264,101)}y=w;a[r]=0;z=f;f=c[z>>2]|0;c[s>>2]=f;m=c[h+4>>2]|0;h=l;x=s;c[h+0>>2]=c[x+0>>2];x=ej(e,l,g,q,m,j,r,y,o,p,v)|0;if(x){x=k;if((a[x]&1)==0){a[k+1|0]=0;a[x]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}x=w;if((a[r]|0)!=0){Ae(k,tc[c[(c[x>>2]|0)+28>>2]&15](y,45)|0)}r=tc[c[(c[x>>2]|0)+28>>2]&15](y,48)|0;y=c[t>>2]|0;x=c[p>>2]|0;p=x+ -1|0;a:do{if(y>>>0<p>>>0){w=y;while(1){v=w+1|0;if(!((a[w]|0)==r<<24>>24)){A=w;break a}if(v>>>0<p>>>0){w=v}else{A=v;break}}}else{A=y}}while(0);hj(k,A,x)|0}x=e;e=c[x>>2]|0;do{if((e|0)==0){B=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){B=e;break}if(!((kc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){B=e;break}c[x>>2]=0;B=0}}while(0);x=(B|0)==0;do{if((f|0)==0){C=25}else{if((c[f+12>>2]|0)!=(c[f+16>>2]|0)){if(x){break}else{C=27;break}}if((kc[c[(c[f>>2]|0)+36>>2]&63](f)|0)==-1){c[z>>2]=0;C=25;break}else{if(x^(f|0)==0){break}else{C=27;break}}}}while(0);if((C|0)==25){if(x){C=27}}if((C|0)==27){c[j>>2]=c[j>>2]|2}c[b>>2]=B;Yd(c[n>>2]|0)|0;n=c[t>>2]|0;c[t>>2]=0;if((n|0)==0){i=d;return}hc[c[u>>2]&127](n);i=d;return}function hj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b;h=d;j=a[g]|0;if((j&1)==0){k=(j&255)>>>1;l=j;m=10}else{j=c[b>>2]|0;k=c[b+4>>2]|0;l=j&255;m=(j&-2)+ -1|0}j=e-h|0;if((e|0)==(d|0)){i=f;return b|0}if((m-k|0)>>>0<j>>>0){De(b,m,k+j-m|0,k,k,0,0);n=a[g]|0}else{n=l}if((n&1)==0){o=b+1|0}else{o=c[b+8>>2]|0}n=e+(k-h)|0;h=d;d=o+k|0;while(1){a[d]=a[h]|0;l=h+1|0;if((l|0)==(e|0)){break}else{d=d+1|0;h=l}}a[o+n|0]=0;n=k+j|0;if((a[g]&1)==0){a[g]=n<<1;i=f;return b|0}else{c[b+4>>2]=n;i=f;return b|0}return 0}function ij(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;i=i+176|0;o=n;p=n+16|0;q=n+32|0;r=n+40|0;s=n+56|0;t=n+72|0;u=n+88|0;v=n+104|0;w=n+112|0;x=n+128|0;y=n+144|0;z=n+160|0;if(b){b=c[d>>2]|0;if(!((c[1686]|0)==-1)){c[p>>2]=6744;c[p+4>>2]=113;c[p+8>>2]=0;qe(6744,p,114)}p=(c[6748>>2]|0)+ -1|0;A=c[b+8>>2]|0;if(!((c[b+12>>2]|0)-A>>2>>>0>p>>>0)){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}b=c[A+(p<<2)>>2]|0;if((b|0)==0){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}B=b;ic[c[(c[b>>2]|0)+44>>2]&63](q,B);C=e;p=c[q>>2]|0;a[C]=p;a[C+1|0]=p>>8;a[C+2|0]=p>>16;a[C+3|0]=p>>24;p=b;ic[c[(c[p>>2]|0)+32>>2]&63](r,B);C=l;if((a[C]&1)==0){a[l+1|0]=0;a[C]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}ze(l,0);q=r;c[C+0>>2]=c[q+0>>2];c[C+4>>2]=c[q+4>>2];c[C+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(r);ic[c[(c[p>>2]|0)+28>>2]&63](s,B);r=k;if((a[r]&1)==0){a[k+1|0]=0;a[r]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}ze(k,0);q=s;c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(s);s=b;a[f]=kc[c[(c[s>>2]|0)+12>>2]&63](B)|0;a[g]=kc[c[(c[s>>2]|0)+16>>2]&63](B)|0;ic[c[(c[p>>2]|0)+20>>2]&63](t,B);s=h;if((a[s]&1)==0){a[h+1|0]=0;a[s]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}ze(h,0);q=t;c[s+0>>2]=c[q+0>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(t);ic[c[(c[p>>2]|0)+24>>2]&63](u,B);p=j;if((a[p]&1)==0){a[j+1|0]=0;a[p]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}ze(j,0);t=u;c[p+0>>2]=c[t+0>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;ve(u);D=kc[c[(c[b>>2]|0)+36>>2]&63](B)|0;c[m>>2]=D;i=n;return}else{B=c[d>>2]|0;if(!((c[1670]|0)==-1)){c[o>>2]=6680;c[o+4>>2]=113;c[o+8>>2]=0;qe(6680,o,114)}o=(c[6684>>2]|0)+ -1|0;d=c[B+8>>2]|0;if(!((c[B+12>>2]|0)-d>>2>>>0>o>>>0)){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}B=c[d+(o<<2)>>2]|0;if((B|0)==0){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}E=B;ic[c[(c[B>>2]|0)+44>>2]&63](v,E);F=e;e=c[v>>2]|0;a[F]=e;a[F+1|0]=e>>8;a[F+2|0]=e>>16;a[F+3|0]=e>>24;e=B;ic[c[(c[e>>2]|0)+32>>2]&63](w,E);F=l;if((a[F]&1)==0){a[l+1|0]=0;a[F]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}ze(l,0);l=w;c[F+0>>2]=c[l+0>>2];c[F+4>>2]=c[l+4>>2];c[F+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;ve(w);ic[c[(c[e>>2]|0)+28>>2]&63](x,E);w=k;if((a[w]&1)==0){a[k+1|0]=0;a[w]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}ze(k,0);k=x;c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;ve(x);x=B;a[f]=kc[c[(c[x>>2]|0)+12>>2]&63](E)|0;a[g]=kc[c[(c[x>>2]|0)+16>>2]&63](E)|0;ic[c[(c[e>>2]|0)+20>>2]&63](y,E);x=h;if((a[x]&1)==0){a[h+1|0]=0;a[x]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}ze(h,0);h=y;c[x+0>>2]=c[h+0>>2];c[x+4>>2]=c[h+4>>2];c[x+8>>2]=c[h+8>>2];c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ve(y);ic[c[(c[e>>2]|0)+24>>2]&63](z,E);e=j;if((a[e]&1)==0){a[j+1|0]=0;a[e]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}ze(j,0);j=z;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ve(z);D=kc[c[(c[B>>2]|0)+36>>2]&63](E)|0;c[m>>2]=D;i=n;return}}function jj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;g=i;h=b;j=a[h]|0;if((j&1)==0){k=(j&255)>>>1}else{k=c[b+4>>2]|0}if((k|0)==0){i=g;return}do{if((d|0)==(e|0)){l=j}else{k=e+ -4|0;if(k>>>0>d>>>0){m=d;n=k}else{l=j;break}do{k=c[m>>2]|0;c[m>>2]=c[n>>2];c[n>>2]=k;m=m+4|0;n=n+ -4|0;}while(m>>>0<n>>>0);l=a[h]|0}}while(0);if((l&1)==0){o=b+1|0;p=(l&255)>>>1}else{o=c[b+8>>2]|0;p=c[b+4>>2]|0}b=e+ -4|0;e=a[o]|0;l=e<<24>>24<1|e<<24>>24==127;a:do{if(b>>>0>d>>>0){h=o+p|0;n=e;m=o;j=d;k=l;while(1){if(!k){if((n<<24>>24|0)!=(c[j>>2]|0)){break}}q=(h-m|0)>1?m+1|0:m;r=j+4|0;s=a[q]|0;t=s<<24>>24<1|s<<24>>24==127;if(r>>>0<b>>>0){n=s;m=q;j=r;k=t}else{u=s;v=t;break a}}c[f>>2]=4;i=g;return}else{u=e;v=l}}while(0);if(v){i=g;return}v=c[b>>2]|0;if(!(u<<24>>24>>>0<v>>>0|(v|0)==0)){i=g;return}c[f>>2]=4;i=g;return}function kj(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function lj(a){a=a|0;i=i;return}function mj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+400|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=i;i=i+8|0;u=i;i=i+40|0;v=i;i=i+104|0;w=p;c[w>>2]=o;x=p+4|0;c[x>>2]=115;y=o+400|0;Pe(r,h);o=r;z=c[o>>2]|0;if(!((c[1824]|0)==-1)){c[n>>2]=7296;c[n+4>>2]=113;c[n+8>>2]=0;qe(7296,n,114)}n=(c[7300>>2]|0)+ -1|0;A=c[z+8>>2]|0;if(!((c[z+12>>2]|0)-A>>2>>>0>n>>>0)){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}z=c[A+(n<<2)>>2]|0;if((z|0)==0){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}B=z;a[s]=0;C=f;c[t>>2]=c[C>>2];f=c[h+4>>2]|0;h=l;n=t;c[h+0>>2]=c[n+0>>2];n=nj(e,l,g,r,f,j,s,B,p,q,y)|0;do{if(n){y=u;qc[c[(c[z>>2]|0)+48>>2]&7](B,7e3,7010|0,y)|0;p=v;f=c[q>>2]|0;r=c[w>>2]|0;g=f-r|0;do{if((g|0)>392){l=Hm((g>>2)+2|0)|0;if((l|0)!=0){D=l;E=l;break}Tm()}else{D=0;E=p}}while(0);if((a[s]|0)==0){F=E}else{a[E]=45;F=E+1|0}if(r>>>0<f>>>0){g=u+40|0;l=u;h=F;t=r;while(1){A=c[t>>2]|0;G=y;while(1){H=G+4|0;if((c[G>>2]|0)==(A|0)){I=G;break}if((H|0)==(g|0)){I=g;break}else{G=H}}a[h]=a[7e3+(I-l>>2)|0]|0;G=t+4|0;A=h+1|0;if(G>>>0<(c[q>>2]|0)>>>0){h=A;t=G}else{J=A;break}}}else{J=F}a[J]=0;c[m>>2]=k;if((db(p|0,6936,m|0)|0)!=1){t=Ta(8)|0;ce(t,6944);Vb(t|0,4312,11)}if((D|0)==0){break}Im(D)}}while(0);D=e;e=c[D>>2]|0;do{if((e|0)==0){K=1}else{m=c[e+12>>2]|0;if((m|0)==(c[e+16>>2]|0)){L=kc[c[(c[e>>2]|0)+36>>2]&63](e)|0}else{L=c[m>>2]|0}if((L|0)==-1){c[D>>2]=0;K=1;break}else{K=(c[D>>2]|0)==0;break}}}while(0);L=c[C>>2]|0;do{if((L|0)==0){M=35}else{e=c[L+12>>2]|0;if((e|0)==(c[L+16>>2]|0)){N=kc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{N=c[e>>2]|0}if((N|0)==-1){c[C>>2]=0;M=35;break}else{if(K){break}else{M=37;break}}}}while(0);if((M|0)==35){if(K){M=37}}if((M|0)==37){c[j>>2]=c[j>>2]|2}c[b>>2]=c[D>>2];Yd(c[o>>2]|0)|0;o=c[w>>2]|0;c[w>>2]=0;if((o|0)==0){i=d;return}hc[c[x>>2]&127](o);i=d;return}function nj(b,e,f,g,h,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var 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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,fc=0,gc=0,ic=0,jc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0;p=i;i=i+408|0;q=p;r=p+400|0;s=r;t=i;i=i+8|0;u=i;i=i+8|0;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+8|0;B=i;i=i+8|0;C=q;c[r>>2]=0;D=v;c[D+0>>2]=0;c[D+4>>2]=0;c[D+8>>2]=0;E=w;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;F=x;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;G=y;c[G+0>>2]=0;c[G+4>>2]=0;c[G+8>>2]=0;H=z;c[H+0>>2]=0;c[H+4>>2]=0;c[H+8>>2]=0;qj(f,g,s,t,u,v,w,x,y,A);s=m;c[n>>2]=c[s>>2];g=b;b=e;e=r;r=l;f=y+4|0;I=y+8|0;J=x+4|0;K=x+8|0;L=(h&512|0)!=0;h=w+4|0;M=w+8|0;N=z+4|0;O=z+8|0;P=e+3|0;Q=m+4|0;m=v+4|0;R=q+400|0;q=C;S=C;C=o;o=0;T=0;U=115;a:while(1){V=c[g>>2]|0;do{if((V|0)==0){W=1}else{X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){Y=kc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{Y=c[X>>2]|0}if((Y|0)==-1){c[g>>2]=0;W=1;break}else{W=(c[g>>2]|0)==0;break}}}while(0);V=c[b>>2]|0;do{if((V|0)==0){Z=15}else{X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){_=kc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{_=c[X>>2]|0}if((_|0)==-1){c[b>>2]=0;Z=15;break}else{if(W){$=V;break}else{aa=S;ba=q;ca=T;da=U;Z=292;break a}}}}while(0);if((Z|0)==15){Z=0;if(W){aa=S;ba=q;ca=T;da=U;Z=292;break}else{$=0}}b:do{switch(a[e+o|0]|0){case 0:{Z=28;break};case 4:{V=C;X=S;ea=q;fa=R;ga=0;ha=U;c:while(1){ia=c[g>>2]|0;do{if((ia|0)==0){ja=1}else{ka=c[ia+12>>2]|0;if((ka|0)==(c[ia+16>>2]|0)){la=kc[c[(c[ia>>2]|0)+36>>2]&63](ia)|0}else{la=c[ka>>2]|0}if((la|0)==-1){c[g>>2]=0;ja=1;break}else{ja=(c[g>>2]|0)==0;break}}}while(0);ia=c[b>>2]|0;do{if((ia|0)==0){Z=188}else{ka=c[ia+12>>2]|0;if((ka|0)==(c[ia+16>>2]|0)){ma=kc[c[(c[ia>>2]|0)+36>>2]&63](ia)|0}else{ma=c[ka>>2]|0}if((ma|0)==-1){c[b>>2]=0;Z=188;break}else{if(ja){break}else{break c}}}}while(0);if((Z|0)==188){Z=0;if(ja){break}}ia=c[g>>2]|0;ka=c[ia+12>>2]|0;if((ka|0)==(c[ia+16>>2]|0)){na=kc[c[(c[ia>>2]|0)+36>>2]&63](ia)|0}else{na=c[ka>>2]|0}if(ec[c[(c[r>>2]|0)+12>>2]&31](l,2048,na)|0){ka=c[n>>2]|0;if((ka|0)==(V|0)){ia=(c[Q>>2]|0)!=115;oa=c[s>>2]|0;pa=V-oa|0;qa=pa>>>0<2147483647?pa<<1:-1;ra=pa>>2;if(ia){sa=oa}else{sa=0}oa=Jm(sa,qa)|0;pa=oa;if((oa|0)==0){Z=198;break a}do{if(ia){c[s>>2]=pa;ta=pa}else{oa=c[s>>2]|0;c[s>>2]=pa;if((oa|0)==0){ta=pa;break}hc[c[Q>>2]&127](oa);ta=c[s>>2]|0}}while(0);c[Q>>2]=116;pa=ta+(ra<<2)|0;c[n>>2]=pa;ua=pa;va=(c[s>>2]|0)+(qa>>>2<<2)|0}else{ua=ka;va=V}c[n>>2]=ua+4;c[ua>>2]=na;wa=va;xa=X;ya=ea;za=fa;Aa=ga+1|0;Ba=ha}else{pa=a[D]|0;if((pa&1)==0){Ca=(pa&255)>>>1}else{Ca=c[m>>2]|0}if((Ca|0)==0|(ga|0)==0){break}if((na|0)!=(c[u>>2]|0)){break}if((ea|0)==(fa|0)){pa=ea-X|0;ia=pa>>>0<2147483647?pa<<1:-1;if((ha|0)!=115){Da=X}else{Da=0}oa=Jm(Da,ia)|0;Ea=oa;if((oa|0)==0){Z=214;break a}Fa=Ea;Ga=Ea+(pa>>2<<2)|0;Ha=Ea+(ia>>>2<<2)|0;Ia=116}else{Fa=X;Ga=ea;Ha=fa;Ia=ha}c[Ga>>2]=ga;wa=V;xa=Fa;ya=Ga+4|0;za=Ha;Aa=0;Ba=Ia}ia=c[g>>2]|0;Ea=ia+12|0;pa=c[Ea>>2]|0;if((pa|0)==(c[ia+16>>2]|0)){kc[c[(c[ia>>2]|0)+40>>2]&63](ia)|0;V=wa;X=xa;ea=ya;fa=za;ga=Aa;ha=Ba;continue}else{c[Ea>>2]=pa+4;V=wa;X=xa;ea=ya;fa=za;ga=Aa;ha=Ba;continue}}if((X|0)==(ea|0)|(ga|0)==0){Ja=X;Ka=ea;La=fa;Ma=ha}else{if((ea|0)==(fa|0)){pa=ea-X|0;Ea=pa>>>0<2147483647?pa<<1:-1;if((ha|0)!=115){Na=X}else{Na=0}ia=Jm(Na,Ea)|0;oa=ia;if((ia|0)==0){Z=225;break a}Oa=oa;Pa=oa+(pa>>2<<2)|0;Qa=oa+(Ea>>>2<<2)|0;Ra=116}else{Oa=X;Pa=ea;Qa=fa;Ra=ha}c[Pa>>2]=ga;Ja=Oa;Ka=Pa+4|0;La=Qa;Ma=Ra}Ea=c[A>>2]|0;if((Ea|0)>0){oa=c[g>>2]|0;do{if((oa|0)==0){Sa=1}else{pa=c[oa+12>>2]|0;if((pa|0)==(c[oa+16>>2]|0)){Ta=kc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0}else{Ta=c[pa>>2]|0}if((Ta|0)==-1){c[g>>2]=0;Sa=1;break}else{Sa=(c[g>>2]|0)==0;break}}}while(0);oa=c[b>>2]|0;do{if((oa|0)==0){Z=242}else{ga=c[oa+12>>2]|0;if((ga|0)==(c[oa+16>>2]|0)){Ua=kc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0}else{Ua=c[ga>>2]|0}if((Ua|0)==-1){c[b>>2]=0;Z=242;break}else{if(Sa){Va=oa;break}else{Z=248;break a}}}}while(0);if((Z|0)==242){Z=0;if(Sa){Z=248;break a}else{Va=0}}oa=c[g>>2]|0;ga=c[oa+12>>2]|0;if((ga|0)==(c[oa+16>>2]|0)){Wa=kc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0}else{Wa=c[ga>>2]|0}if((Wa|0)!=(c[t>>2]|0)){Z=248;break a}ga=c[g>>2]|0;oa=ga+12|0;ha=c[oa>>2]|0;if((ha|0)==(c[ga+16>>2]|0)){kc[c[(c[ga>>2]|0)+40>>2]&63](ga)|0;Xa=Va;Ya=Ea;Za=Va;_a=V}else{c[oa>>2]=ha+4;Xa=Va;Ya=Ea;Za=Va;_a=V}while(1){ha=c[g>>2]|0;do{if((ha|0)==0){$a=1}else{oa=c[ha+12>>2]|0;if((oa|0)==(c[ha+16>>2]|0)){ab=kc[c[(c[ha>>2]|0)+36>>2]&63](ha)|0}else{ab=c[oa>>2]|0}if((ab|0)==-1){c[g>>2]=0;$a=1;break}else{$a=(c[g>>2]|0)==0;break}}}while(0);do{if((Za|0)==0){bb=Xa;Z=265}else{ha=c[Za+12>>2]|0;if((ha|0)==(c[Za+16>>2]|0)){cb=kc[c[(c[Za>>2]|0)+36>>2]&63](Za)|0}else{cb=c[ha>>2]|0}if((cb|0)==-1){c[b>>2]=0;bb=0;Z=265;break}else{if($a^(Xa|0)==0){db=Xa;eb=Xa;break}else{Z=271;break a}}}}while(0);if((Z|0)==265){Z=0;if($a){Z=271;break a}else{db=bb;eb=0}}ha=c[g>>2]|0;ka=c[ha+12>>2]|0;if((ka|0)==(c[ha+16>>2]|0)){fb=kc[c[(c[ha>>2]|0)+36>>2]&63](ha)|0}else{fb=c[ka>>2]|0}if(!(ec[c[(c[r>>2]|0)+12>>2]&31](l,2048,fb)|0)){Z=271;break a}ka=c[n>>2]|0;if((ka|0)==(_a|0)){ha=(c[Q>>2]|0)!=115;qa=c[s>>2]|0;ra=_a-qa|0;oa=ra>>>0<2147483647?ra<<1:-1;ga=ra>>2;if(ha){gb=qa}else{gb=0}qa=Jm(gb,oa)|0;ra=qa;if((qa|0)==0){Z=276;break a}do{if(ha){c[s>>2]=ra;hb=ra}else{qa=c[s>>2]|0;c[s>>2]=ra;if((qa|0)==0){hb=ra;break}hc[c[Q>>2]&127](qa);hb=c[s>>2]|0}}while(0);c[Q>>2]=116;ra=hb+(ga<<2)|0;c[n>>2]=ra;ib=ra;jb=(c[s>>2]|0)+(oa>>>2<<2)|0}else{ib=ka;jb=_a}ra=c[g>>2]|0;ha=c[ra+12>>2]|0;if((ha|0)==(c[ra+16>>2]|0)){qa=kc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0;kb=qa;lb=c[n>>2]|0}else{kb=c[ha>>2]|0;lb=ib}c[n>>2]=lb+4;c[lb>>2]=kb;ha=Ya+ -1|0;c[A>>2]=ha;qa=c[g>>2]|0;ra=qa+12|0;fa=c[ra>>2]|0;if((fa|0)==(c[qa+16>>2]|0)){kc[c[(c[qa>>2]|0)+40>>2]&63](qa)|0}else{c[ra>>2]=fa+4}if((ha|0)>0){Xa=db;Ya=ha;Za=eb;_a=jb}else{mb=jb;break}}}else{mb=V}if((c[n>>2]|0)==(c[s>>2]|0)){Z=290;break a}else{nb=mb;ob=Ja;pb=Ka;qb=La;rb=T;sb=Ma}break};case 1:{if((o|0)==3){aa=S;ba=q;ca=T;da=U;Z=292;break a}Ea=c[g>>2]|0;ha=c[Ea+12>>2]|0;if((ha|0)==(c[Ea+16>>2]|0)){tb=kc[c[(c[Ea>>2]|0)+36>>2]&63](Ea)|0}else{tb=c[ha>>2]|0}if(!(ec[c[(c[r>>2]|0)+12>>2]&31](l,8192,tb)|0)){Z=27;break a}ha=c[g>>2]|0;Ea=ha+12|0;fa=c[Ea>>2]|0;if((fa|0)==(c[ha+16>>2]|0)){ub=kc[c[(c[ha>>2]|0)+40>>2]&63](ha)|0}else{c[Ea>>2]=fa+4;ub=c[fa>>2]|0}Ke(z,ub);Z=28;break};case 3:{fa=a[F]|0;Ea=(fa&1)==0;if(Ea){vb=(fa&255)>>>1}else{vb=c[J>>2]|0}ha=a[G]|0;ra=(ha&1)==0;if(ra){wb=(ha&255)>>>1}else{wb=c[f>>2]|0}if((vb|0)==(0-wb|0)){nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break b}if(Ea){xb=(fa&255)>>>1}else{xb=c[J>>2]|0}do{if((xb|0)!=0){if(ra){yb=(ha&255)>>>1}else{yb=c[f>>2]|0}if((yb|0)==0){break}qa=c[g>>2]|0;ea=c[qa+12>>2]|0;if((ea|0)==(c[qa+16>>2]|0)){X=kc[c[(c[qa>>2]|0)+36>>2]&63](qa)|0;zb=X;Ab=a[F]|0}else{zb=c[ea>>2]|0;Ab=fa}ea=c[g>>2]|0;X=ea+12|0;qa=c[X>>2]|0;pa=(qa|0)==(c[ea+16>>2]|0);if((zb|0)==(c[((Ab&1)==0?J:c[K>>2]|0)>>2]|0)){if(pa){kc[c[(c[ea>>2]|0)+40>>2]&63](ea)|0}else{c[X>>2]=qa+4}X=a[F]|0;if((X&1)==0){Bb=(X&255)>>>1}else{Bb=c[J>>2]|0}nb=C;ob=S;pb=q;qb=R;rb=Bb>>>0>1?x:T;sb=U;break b}if(pa){Cb=kc[c[(c[ea>>2]|0)+36>>2]&63](ea)|0}else{Cb=c[qa>>2]|0}if((Cb|0)!=(c[((a[G]&1)==0?f:c[I>>2]|0)>>2]|0)){Z=116;break a}qa=c[g>>2]|0;ea=qa+12|0;pa=c[ea>>2]|0;if((pa|0)==(c[qa+16>>2]|0)){kc[c[(c[qa>>2]|0)+40>>2]&63](qa)|0}else{c[ea>>2]=pa+4}a[k]=1;pa=a[G]|0;if((pa&1)==0){Db=(pa&255)>>>1}else{Db=c[f>>2]|0}nb=C;ob=S;pb=q;qb=R;rb=Db>>>0>1?y:T;sb=U;break b}}while(0);if(Ea){Eb=(fa&255)>>>1}else{Eb=c[J>>2]|0}ra=c[g>>2]|0;V=c[ra+12>>2]|0;pa=(V|0)==(c[ra+16>>2]|0);if((Eb|0)==0){if(pa){ea=kc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0;Fb=ea;Gb=a[G]|0}else{Fb=c[V>>2]|0;Gb=ha}if((Fb|0)!=(c[((Gb&1)==0?f:c[I>>2]|0)>>2]|0)){nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break b}ea=c[g>>2]|0;qa=ea+12|0;X=c[qa>>2]|0;if((X|0)==(c[ea+16>>2]|0)){kc[c[(c[ea>>2]|0)+40>>2]&63](ea)|0}else{c[qa>>2]=X+4}a[k]=1;X=a[G]|0;if((X&1)==0){Hb=(X&255)>>>1}else{Hb=c[f>>2]|0}nb=C;ob=S;pb=q;qb=R;rb=Hb>>>0>1?y:T;sb=U;break b}if(pa){pa=kc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0;Ib=pa;Jb=a[F]|0}else{Ib=c[V>>2]|0;Jb=fa}if((Ib|0)!=(c[((Jb&1)==0?J:c[K>>2]|0)>>2]|0)){a[k]=1;nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break b}V=c[g>>2]|0;pa=V+12|0;ra=c[pa>>2]|0;if((ra|0)==(c[V+16>>2]|0)){kc[c[(c[V>>2]|0)+40>>2]&63](V)|0}else{c[pa>>2]=ra+4}ra=a[F]|0;if((ra&1)==0){Kb=(ra&255)>>>1}else{Kb=c[J>>2]|0}nb=C;ob=S;pb=q;qb=R;rb=Kb>>>0>1?x:T;sb=U;break};case 2:{if(!((T|0)!=0|o>>>0<2)){if((o|0)==2){Lb=(a[P]|0)!=0}else{Lb=0}if(!(L|Lb)){nb=C;ob=S;pb=q;qb=R;rb=0;sb=U;break b}}ra=a[E]|0;pa=(ra&1)==0?h:c[M>>2]|0;d:do{if((o|0)==0){Mb=$;Nb=$;Ob=ra;Pb=pa}else{if((d[e+(o+ -1)|0]|0)<2){Qb=ra;Rb=pa}else{Mb=$;Nb=$;Ob=ra;Pb=pa;break}while(1){if((Qb&1)==0){Sb=h;Tb=(Qb&255)>>>1}else{Sb=c[M>>2]|0;Tb=c[h>>2]|0}if((Rb|0)==(Sb+(Tb<<2)|0)){Ub=Qb;break}if(!(ec[c[(c[r>>2]|0)+12>>2]&31](l,8192,c[Rb>>2]|0)|0)){Z=129;break}Qb=a[E]|0;Rb=Rb+4|0}if((Z|0)==129){Z=0;Ub=a[E]|0}ka=(Ub&1)==0;oa=Rb-(ka?h:c[M>>2]|0)>>2;ga=a[H]|0;V=(ga&1)==0;if(V){Vb=(ga&255)>>>1}else{Vb=c[N>>2]|0}e:do{if(!(oa>>>0>Vb>>>0)){if(V){Wb=N+(((ga&255)>>>1)-oa<<2)|0;Xb=N;Yb=(ga&255)>>>1}else{X=c[O>>2]|0;qa=c[N>>2]|0;Wb=X+(qa-oa<<2)|0;Xb=X;Yb=qa}qa=Xb+(Yb<<2)|0;if((Wb|0)==(qa|0)){Mb=$;Nb=$;Ob=Ub;Pb=Rb;break d}else{Zb=ka?h:c[M>>2]|0;_b=Wb}while(1){if((c[_b>>2]|0)!=(c[Zb>>2]|0)){break e}X=_b+4|0;if((X|0)==(qa|0)){Mb=$;Nb=$;Ob=Ub;Pb=Rb;break d}Zb=Zb+4|0;_b=X}}}while(0);Mb=$;Nb=$;Ob=Ub;Pb=ka?h:c[M>>2]|0}}while(0);f:while(1){if((Ob&1)==0){$b=h;ac=(Ob&255)>>>1}else{$b=c[M>>2]|0;ac=c[h>>2]|0}if((Pb|0)==($b+(ac<<2)|0)){break}pa=c[g>>2]|0;do{if((pa|0)==0){bc=1}else{ra=c[pa+12>>2]|0;if((ra|0)==(c[pa+16>>2]|0)){cc=kc[c[(c[pa>>2]|0)+36>>2]&63](pa)|0}else{cc=c[ra>>2]|0}if((cc|0)==-1){c[g>>2]=0;bc=1;break}else{bc=(c[g>>2]|0)==0;break}}}while(0);do{if((Nb|0)==0){dc=Mb;Z=159}else{pa=c[Nb+12>>2]|0;if((pa|0)==(c[Nb+16>>2]|0)){fc=kc[c[(c[Nb>>2]|0)+36>>2]&63](Nb)|0}else{fc=c[pa>>2]|0}if((fc|0)==-1){c[b>>2]=0;dc=0;Z=159;break}else{if(bc^(Mb|0)==0){gc=Mb;ic=Mb;break}else{break f}}}}while(0);if((Z|0)==159){Z=0;if(bc){break}else{gc=dc;ic=0}}pa=c[g>>2]|0;ka=c[pa+12>>2]|0;if((ka|0)==(c[pa+16>>2]|0)){jc=kc[c[(c[pa>>2]|0)+36>>2]&63](pa)|0}else{jc=c[ka>>2]|0}if((jc|0)!=(c[Pb>>2]|0)){break}ka=c[g>>2]|0;pa=ka+12|0;ra=c[pa>>2]|0;if((ra|0)==(c[ka+16>>2]|0)){kc[c[(c[ka>>2]|0)+40>>2]&63](ka)|0}else{c[pa>>2]=ra+4}Mb=gc;Nb=ic;Ob=a[E]|0;Pb=Pb+4|0}if(!L){nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break b}ra=a[E]|0;if((ra&1)==0){lc=h;mc=(ra&255)>>>1}else{lc=c[M>>2]|0;mc=c[h>>2]|0}if((Pb|0)==(lc+(mc<<2)|0)){nb=C;ob=S;pb=q;qb=R;rb=T;sb=U}else{Z=174;break a}break};default:{nb=C;ob=S;pb=q;qb=R;rb=T;sb=U}}}while(0);g:do{if((Z|0)==28){Z=0;if((o|0)==3){aa=S;ba=q;ca=T;da=U;Z=292;break a}else{nc=$;oc=$}while(1){ra=c[g>>2]|0;do{if((ra|0)==0){pc=1}else{pa=c[ra+12>>2]|0;if((pa|0)==(c[ra+16>>2]|0)){qc=kc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0}else{qc=c[pa>>2]|0}if((qc|0)==-1){c[g>>2]=0;pc=1;break}else{pc=(c[g>>2]|0)==0;break}}}while(0);do{if((oc|0)==0){rc=nc;Z=42}else{ra=c[oc+12>>2]|0;if((ra|0)==(c[oc+16>>2]|0)){sc=kc[c[(c[oc>>2]|0)+36>>2]&63](oc)|0}else{sc=c[ra>>2]|0}if((sc|0)==-1){c[b>>2]=0;rc=0;Z=42;break}else{if(pc^(nc|0)==0){tc=nc;uc=nc;break}else{nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break g}}}}while(0);if((Z|0)==42){Z=0;if(pc){nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break g}else{tc=rc;uc=0}}ra=c[g>>2]|0;pa=c[ra+12>>2]|0;if((pa|0)==(c[ra+16>>2]|0)){vc=kc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0}else{vc=c[pa>>2]|0}if(!(ec[c[(c[r>>2]|0)+12>>2]&31](l,8192,vc)|0)){nb=C;ob=S;pb=q;qb=R;rb=T;sb=U;break g}pa=c[g>>2]|0;ra=pa+12|0;ka=c[ra>>2]|0;if((ka|0)==(c[pa+16>>2]|0)){wc=kc[c[(c[pa>>2]|0)+40>>2]&63](pa)|0}else{c[ra>>2]=ka+4;wc=c[ka>>2]|0}Ke(z,wc);nc=tc;oc=uc}}}while(0);ka=o+1|0;if(ka>>>0<4){R=qb;q=pb;S=ob;C=nb;o=ka;T=rb;U=sb}else{aa=ob;ba=pb;ca=rb;da=sb;Z=292;break}}h:do{if((Z|0)==27){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==116){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==174){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==198){Tm()}else if((Z|0)==214){Tm()}else if((Z|0)==225){Tm()}else if((Z|0)==248){c[j>>2]=c[j>>2]|4;xc=0;yc=Ja;zc=Ma}else if((Z|0)==271){c[j>>2]=c[j>>2]|4;xc=0;yc=Ja;zc=Ma}else if((Z|0)==276){Tm()}else if((Z|0)==290){c[j>>2]=c[j>>2]|4;xc=0;yc=Ja;zc=Ma}else if((Z|0)==292){i:do{if((ca|0)!=0){sb=ca;rb=ca+4|0;pb=ca+8|0;ob=1;j:while(1){T=a[sb]|0;if((T&1)==0){Ac=(T&255)>>>1}else{Ac=c[rb>>2]|0}if(!(ob>>>0<Ac>>>0)){break i}T=c[g>>2]|0;do{if((T|0)==0){Bc=1}else{o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Cc=kc[c[(c[T>>2]|0)+36>>2]&63](T)|0}else{Cc=c[o>>2]|0}if((Cc|0)==-1){c[g>>2]=0;Bc=1;break}else{Bc=(c[g>>2]|0)==0;break}}}while(0);T=c[b>>2]|0;do{if((T|0)==0){Z=311}else{o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Dc=kc[c[(c[T>>2]|0)+36>>2]&63](T)|0}else{Dc=c[o>>2]|0}if((Dc|0)==-1){c[b>>2]=0;Z=311;break}else{if(Bc){break}else{break j}}}}while(0);if((Z|0)==311){Z=0;if(Bc){break}}T=c[g>>2]|0;o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Ec=kc[c[(c[T>>2]|0)+36>>2]&63](T)|0}else{Ec=c[o>>2]|0}if((a[sb]&1)==0){Fc=rb}else{Fc=c[pb>>2]|0}if((Ec|0)!=(c[Fc+(ob<<2)>>2]|0)){break}o=ob+1|0;T=c[g>>2]|0;nb=T+12|0;C=c[nb>>2]|0;if((C|0)==(c[T+16>>2]|0)){kc[c[(c[T>>2]|0)+40>>2]&63](T)|0;ob=o;continue}else{c[nb>>2]=C+4;ob=o;continue}}c[j>>2]=c[j>>2]|4;xc=0;yc=aa;zc=da;break h}}while(0);if((aa|0)==(ba|0)){xc=1;yc=ba;zc=da;break}c[B>>2]=0;jj(v,aa,ba,B);if((c[B>>2]|0)==0){xc=1;yc=aa;zc=da;break}c[j>>2]=c[j>>2]|4;xc=0;yc=aa;zc=da}}while(0);Ge(z);Ge(y);Ge(x);Ge(w);ve(v);if((yc|0)==0){i=p;return xc|0}hc[zc&127](yc);i=p;return xc|0}function oj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;d=i;i=i+464|0;l=d;m=d+8|0;n=d+24|0;o=d+424|0;p=d+432|0;q=d+440|0;r=d+448|0;s=d+456|0;t=o;c[t>>2]=n;u=o+4|0;c[u>>2]=115;v=n+400|0;Pe(q,h);n=q;w=c[n>>2]|0;if(!((c[1824]|0)==-1)){c[m>>2]=7296;c[m+4>>2]=113;c[m+8>>2]=0;qe(7296,m,114)}m=(c[7300>>2]|0)+ -1|0;x=c[w+8>>2]|0;if(!((c[w+12>>2]|0)-x>>2>>>0>m>>>0)){y=Ta(4)|0;z=y;mm(z);Vb(y|0,15264,101)}w=c[x+(m<<2)>>2]|0;if((w|0)==0){y=Ta(4)|0;z=y;mm(z);Vb(y|0,15264,101)}y=w;a[r]=0;z=f;f=c[z>>2]|0;c[s>>2]=f;m=c[h+4>>2]|0;h=l;x=s;c[h+0>>2]=c[x+0>>2];x=nj(e,l,g,q,m,j,r,y,o,p,v)|0;if(x){x=k;if((a[x]&1)==0){c[k+4>>2]=0;a[x]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}x=w;if((a[r]|0)!=0){Ke(k,tc[c[(c[x>>2]|0)+44>>2]&15](y,45)|0)}r=tc[c[(c[x>>2]|0)+44>>2]&15](y,48)|0;y=c[t>>2]|0;x=c[p>>2]|0;p=x+ -4|0;a:do{if(y>>>0<p>>>0){w=y;while(1){v=w+4|0;if((c[w>>2]|0)!=(r|0)){A=w;break a}if(v>>>0<p>>>0){w=v}else{A=v;break}}}else{A=y}}while(0);pj(k,A,x)|0}x=e;e=c[x>>2]|0;do{if((e|0)==0){B=1}else{A=c[e+12>>2]|0;if((A|0)==(c[e+16>>2]|0)){C=kc[c[(c[e>>2]|0)+36>>2]&63](e)|0}else{C=c[A>>2]|0}if((C|0)==-1){c[x>>2]=0;B=1;break}else{B=(c[x>>2]|0)==0;break}}}while(0);do{if((f|0)==0){D=29}else{C=c[f+12>>2]|0;if((C|0)==(c[f+16>>2]|0)){E=kc[c[(c[f>>2]|0)+36>>2]&63](f)|0}else{E=c[C>>2]|0}if((E|0)==-1){c[z>>2]=0;D=29;break}else{if(B){break}else{D=31;break}}}}while(0);if((D|0)==29){if(B){D=31}}if((D|0)==31){c[j>>2]=c[j>>2]|2}c[b>>2]=c[x>>2];Yd(c[n>>2]|0)|0;n=c[t>>2]|0;c[t>>2]=0;if((n|0)==0){i=d;return}hc[c[u>>2]&127](n);i=d;return}function pj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;g=b;h=d;j=a[g]|0;if((j&1)==0){k=(j&255)>>>1;l=j;m=1}else{j=c[b>>2]|0;k=c[b+4>>2]|0;l=j&255;m=(j&-2)+ -1|0}j=e-h>>2;if((j|0)==0){i=f;return b|0}if((m-k|0)>>>0<j>>>0){Me(b,m,k+j-m|0,k,k,0,0);n=a[g]|0}else{n=l}if((n&1)==0){o=b+4|0}else{o=c[b+8>>2]|0}n=o+(k<<2)|0;if((d|0)==(e|0)){p=n}else{l=k+((e+ -4+(0-h)|0)>>>2)+1|0;h=d;d=n;while(1){c[d>>2]=c[h>>2];n=h+4|0;if((n|0)==(e|0)){break}else{d=d+4|0;h=n}}p=o+(l<<2)|0}c[p>>2]=0;p=k+j|0;if((a[g]&1)==0){a[g]=p<<1;i=f;return b|0}else{c[b+4>>2]=p;i=f;return b|0}return 0}function qj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;i=i+176|0;o=n;p=n+16|0;q=n+32|0;r=n+40|0;s=n+56|0;t=n+72|0;u=n+88|0;v=n+104|0;w=n+112|0;x=n+128|0;y=n+144|0;z=n+160|0;if(b){b=c[d>>2]|0;if(!((c[1718]|0)==-1)){c[p>>2]=6872;c[p+4>>2]=113;c[p+8>>2]=0;qe(6872,p,114)}p=(c[6876>>2]|0)+ -1|0;A=c[b+8>>2]|0;if(!((c[b+12>>2]|0)-A>>2>>>0>p>>>0)){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}b=c[A+(p<<2)>>2]|0;if((b|0)==0){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}B=b;ic[c[(c[b>>2]|0)+44>>2]&63](q,B);C=e;p=c[q>>2]|0;a[C]=p;a[C+1|0]=p>>8;a[C+2|0]=p>>16;a[C+3|0]=p>>24;p=b;ic[c[(c[p>>2]|0)+32>>2]&63](r,B);C=l;if((a[C]&1)==0){c[l+4>>2]=0;a[C]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Je(l,0);q=r;c[C+0>>2]=c[q+0>>2];c[C+4>>2]=c[q+4>>2];c[C+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;Ge(r);ic[c[(c[p>>2]|0)+28>>2]&63](s,B);r=k;if((a[r]&1)==0){c[k+4>>2]=0;a[r]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Je(k,0);q=s;c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;Ge(s);s=b;c[f>>2]=kc[c[(c[s>>2]|0)+12>>2]&63](B)|0;c[g>>2]=kc[c[(c[s>>2]|0)+16>>2]&63](B)|0;ic[c[(c[b>>2]|0)+20>>2]&63](t,B);b=h;if((a[b]&1)==0){a[h+1|0]=0;a[b]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}ze(h,0);q=t;c[b+0>>2]=c[q+0>>2];c[b+4>>2]=c[q+4>>2];c[b+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;ve(t);ic[c[(c[p>>2]|0)+24>>2]&63](u,B);p=j;if((a[p]&1)==0){c[j+4>>2]=0;a[p]=0}else{c[c[j+8>>2]>>2]=0;c[j+4>>2]=0}Je(j,0);t=u;c[p+0>>2]=c[t+0>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;Ge(u);D=kc[c[(c[s>>2]|0)+36>>2]&63](B)|0;c[m>>2]=D;i=n;return}else{B=c[d>>2]|0;if(!((c[1702]|0)==-1)){c[o>>2]=6808;c[o+4>>2]=113;c[o+8>>2]=0;qe(6808,o,114)}o=(c[6812>>2]|0)+ -1|0;d=c[B+8>>2]|0;if(!((c[B+12>>2]|0)-d>>2>>>0>o>>>0)){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}B=c[d+(o<<2)>>2]|0;if((B|0)==0){E=Ta(4)|0;F=E;mm(F);Vb(E|0,15264,101)}E=B;ic[c[(c[B>>2]|0)+44>>2]&63](v,E);F=e;e=c[v>>2]|0;a[F]=e;a[F+1|0]=e>>8;a[F+2|0]=e>>16;a[F+3|0]=e>>24;e=B;ic[c[(c[e>>2]|0)+32>>2]&63](w,E);F=l;if((a[F]&1)==0){c[l+4>>2]=0;a[F]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Je(l,0);l=w;c[F+0>>2]=c[l+0>>2];c[F+4>>2]=c[l+4>>2];c[F+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;Ge(w);ic[c[(c[e>>2]|0)+28>>2]&63](x,E);w=k;if((a[w]&1)==0){c[k+4>>2]=0;a[w]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Je(k,0);k=x;c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;Ge(x);x=B;c[f>>2]=kc[c[(c[x>>2]|0)+12>>2]&63](E)|0;c[g>>2]=kc[c[(c[x>>2]|0)+16>>2]&63](E)|0;ic[c[(c[B>>2]|0)+20>>2]&63](y,E);B=h;if((a[B]&1)==0){a[h+1|0]=0;a[B]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}ze(h,0);h=y;c[B+0>>2]=c[h+0>>2];c[B+4>>2]=c[h+4>>2];c[B+8>>2]=c[h+8>>2];c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;ve(y);ic[c[(c[e>>2]|0)+24>>2]&63](z,E);e=j;if((a[e]&1)==0){c[j+4>>2]=0;a[e]=0}else{c[c[j+8>>2]>>2]=0;c[j+4>>2]=0}Je(j,0);j=z;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;Ge(z);D=kc[c[(c[x>>2]|0)+36>>2]&63](E)|0;c[m>>2]=D;i=n;return}}function rj(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function sj(a){a=a|0;i=i;return}function tj(b,d,e,f,g,j,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;l=+l;var 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;d=i;i=i+16|0;m=d;n=d+8|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+104|0;r=i;i=i+8|0;s=i;i=i+104|0;t=i;i=i+8|0;u=i;i=i+8|0;v=u;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+104|0;D=i;i=i+8|0;E=i;i=i+8|0;F=i;i=i+8|0;G=q;c[r>>2]=G;q=s;s=o;h[k>>3]=l;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];s=ib(G|0,100,7056,o|0)|0;do{if(s>>>0>99){do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);o=c[1798]|0;G=n;h[k>>3]=l;c[G>>2]=c[k>>2];c[G+4>>2]=c[k+4>>2];G=oh(r,o,7056,n)|0;o=c[r>>2]|0;if((o|0)==0){Tm()}H=Hm(G)|0;if((H|0)!=0){I=o;J=H;K=H;L=G;break}Tm()}else{I=0;J=0;K=q;L=s}}while(0);Pe(t,g);s=t;q=c[s>>2]|0;if(!((c[1826]|0)==-1)){c[p>>2]=7304;c[p+4>>2]=113;c[p+8>>2]=0;qe(7304,p,114)}p=(c[7308>>2]|0)+ -1|0;n=c[q+8>>2]|0;if(!((c[q+12>>2]|0)-n>>2>>>0>p>>>0)){M=Ta(4)|0;N=M;mm(N);Vb(M|0,15264,101)}q=c[n+(p<<2)>>2]|0;if((q|0)==0){M=Ta(4)|0;N=M;mm(N);Vb(M|0,15264,101)}M=q;N=c[r>>2]|0;qc[c[(c[q>>2]|0)+32>>2]&7](M,N,N+L|0,K)|0;if((L|0)==0){O=0}else{O=(a[c[r>>2]|0]|0)==45}c[u>>2]=0;u=y;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;u=z;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;r=A;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;uj(f,O,t,v,w,x,y,z,A,B);t=C;C=c[B>>2]|0;if((L|0)>(C|0)){B=a[r]|0;if((B&1)==0){P=(B&255)>>>1}else{P=c[A+4>>2]|0}B=a[u]|0;if((B&1)==0){Q=(B&255)>>>1}else{Q=c[z+4>>2]|0}R=P+(L-C<<1|1)+Q|0}else{Q=a[r]|0;if((Q&1)==0){S=(Q&255)>>>1}else{S=c[A+4>>2]|0}Q=a[u]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[z+4>>2]|0}R=S+2+T|0}T=R+C|0;do{if(T>>>0>100){R=Hm(T)|0;if((R|0)!=0){U=R;V=R;break}Tm()}else{U=0;V=t}}while(0);vj(V,D,E,c[g+4>>2]|0,K,K+L|0,M,O,v,a[w]|0,a[x]|0,y,z,A,C);c[F>>2]=c[e>>2];e=c[D>>2]|0;D=c[E>>2]|0;E=m;C=F;c[E+0>>2]=c[C+0>>2];jh(b,m,V,e,D,g,j);if((U|0)!=0){Im(U)}ve(A);ve(z);ve(y);Yd(c[s>>2]|0)|0;if((J|0)!=0){Im(J)}if((I|0)==0){i=d;return}Im(I);i=d;return}function uj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,K=0,L=0;n=i;i=i+40|0;o=n;p=n+16|0;q=n+32|0;r=q;s=i;i=i+16|0;t=i;i=i+8|0;u=t;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+8|0;z=y;A=i;i=i+16|0;B=i;i=i+8|0;C=B;D=i;i=i+16|0;E=i;i=i+16|0;F=i;i=i+16|0;G=c[e>>2]|0;if(b){if(!((c[1686]|0)==-1)){c[p>>2]=6744;c[p+4>>2]=113;c[p+8>>2]=0;qe(6744,p,114)}p=(c[6748>>2]|0)+ -1|0;b=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-b>>2>>>0>p>>>0)){H=Ta(4)|0;I=H;mm(I);Vb(H|0,15264,101)}e=c[b+(p<<2)>>2]|0;if((e|0)==0){H=Ta(4)|0;I=H;mm(I);Vb(H|0,15264,101)}H=e;I=c[e>>2]|0;if(d){ic[c[I+44>>2]&63](r,H);r=f;p=c[q>>2]|0;a[r]=p;a[r+1|0]=p>>8;a[r+2|0]=p>>16;a[r+3|0]=p>>24;ic[c[(c[e>>2]|0)+32>>2]&63](s,H);p=l;if((a[p]&1)==0){a[l+1|0]=0;a[p]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}ze(l,0);r=s;c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;ve(s)}else{ic[c[I+40>>2]&63](u,H);u=f;I=c[t>>2]|0;a[u]=I;a[u+1|0]=I>>8;a[u+2|0]=I>>16;a[u+3|0]=I>>24;ic[c[(c[e>>2]|0)+28>>2]&63](v,H);I=l;if((a[I]&1)==0){a[l+1|0]=0;a[I]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}ze(l,0);u=v;c[I+0>>2]=c[u+0>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;ve(v)}v=e;a[g]=kc[c[(c[v>>2]|0)+12>>2]&63](H)|0;a[h]=kc[c[(c[v>>2]|0)+16>>2]&63](H)|0;v=e;ic[c[(c[v>>2]|0)+20>>2]&63](w,H);u=j;if((a[u]&1)==0){a[j+1|0]=0;a[u]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}ze(j,0);I=w;c[u+0>>2]=c[I+0>>2];c[u+4>>2]=c[I+4>>2];c[u+8>>2]=c[I+8>>2];c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;ve(w);ic[c[(c[v>>2]|0)+24>>2]&63](x,H);v=k;if((a[v]&1)==0){a[k+1|0]=0;a[v]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}ze(k,0);w=x;c[v+0>>2]=c[w+0>>2];c[v+4>>2]=c[w+4>>2];c[v+8>>2]=c[w+8>>2];c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;ve(x);J=kc[c[(c[e>>2]|0)+36>>2]&63](H)|0;c[m>>2]=J;i=n;return}else{if(!((c[1670]|0)==-1)){c[o>>2]=6680;c[o+4>>2]=113;c[o+8>>2]=0;qe(6680,o,114)}o=(c[6684>>2]|0)+ -1|0;H=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-H>>2>>>0>o>>>0)){K=Ta(4)|0;L=K;mm(L);Vb(K|0,15264,101)}G=c[H+(o<<2)>>2]|0;if((G|0)==0){K=Ta(4)|0;L=K;mm(L);Vb(K|0,15264,101)}K=G;L=c[G>>2]|0;if(d){ic[c[L+44>>2]&63](z,K);z=f;d=c[y>>2]|0;a[z]=d;a[z+1|0]=d>>8;a[z+2|0]=d>>16;a[z+3|0]=d>>24;ic[c[(c[G>>2]|0)+32>>2]&63](A,K);d=l;if((a[d]&1)==0){a[l+1|0]=0;a[d]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}ze(l,0);z=A;c[d+0>>2]=c[z+0>>2];c[d+4>>2]=c[z+4>>2];c[d+8>>2]=c[z+8>>2];c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;ve(A)}else{ic[c[L+40>>2]&63](C,K);C=f;f=c[B>>2]|0;a[C]=f;a[C+1|0]=f>>8;a[C+2|0]=f>>16;a[C+3|0]=f>>24;ic[c[(c[G>>2]|0)+28>>2]&63](D,K);f=l;if((a[f]&1)==0){a[l+1|0]=0;a[f]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}ze(l,0);l=D;c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;ve(D)}D=G;a[g]=kc[c[(c[D>>2]|0)+12>>2]&63](K)|0;a[h]=kc[c[(c[D>>2]|0)+16>>2]&63](K)|0;D=G;ic[c[(c[D>>2]|0)+20>>2]&63](E,K);h=j;if((a[h]&1)==0){a[j+1|0]=0;a[h]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}ze(j,0);j=E;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ve(E);ic[c[(c[D>>2]|0)+24>>2]&63](F,K);D=k;if((a[D]&1)==0){a[k+1|0]=0;a[D]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}ze(k,0);k=F;c[D+0>>2]=c[k+0>>2];c[D+4>>2]=c[k+4>>2];c[D+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;ve(F);J=kc[c[(c[G>>2]|0)+36>>2]&63](K)|0;c[m>>2]=J;i=n;return}}function vj(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s){d=d|0;e=e|0;f=f|0;g=g|0;h=h|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;r=r|0;s=s|0;var 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;t=i;c[f>>2]=d;u=k;v=r;w=r+1|0;x=r+8|0;y=r+4|0;r=q;z=(g&512|0)==0;A=q+1|0;B=q+8|0;C=q+4|0;q=(s|0)>0;D=p;E=p+1|0;F=p+8|0;G=p+4|0;p=k+8|0;H=0-s|0;I=h;h=0;while(1){a:do{switch(a[m+h|0]|0){case 0:{c[e>>2]=c[f>>2];J=I;break};case 4:{K=c[f>>2]|0;L=l?I+1|0:I;b:do{if(L>>>0<j>>>0){M=L;while(1){N=a[M]|0;if(!(N<<24>>24>-1)){O=M;break b}P=M+1|0;if((b[(c[p>>2]|0)+(N<<24>>24<<1)>>1]&2048)==0){O=M;break b}if(P>>>0<j>>>0){M=P}else{O=P;break}}}else{O=L}}while(0);M=O;if(q){if(O>>>0>L>>>0){P=L+(0-M)|0;M=P>>>0<H>>>0?H:P;P=M+s|0;N=K;Q=O;R=s;while(1){S=Q+ -1|0;T=a[S]|0;c[f>>2]=N+1;a[N]=T;T=R+ -1|0;U=(T|0)>0;if(!(S>>>0>L>>>0&U)){break}N=c[f>>2]|0;R=T;Q=S}Q=O+M|0;if(U){V=Q;W=P;X=32}else{Y=0;Z=Q;_=P}}else{V=O;W=s;X=32}if((X|0)==32){X=0;Y=tc[c[(c[u>>2]|0)+28>>2]&15](k,48)|0;Z=V;_=W}Q=c[f>>2]|0;c[f>>2]=Q+1;if((_|0)>0){R=Q;N=_;while(1){a[R]=Y;S=N+ -1|0;T=c[f>>2]|0;c[f>>2]=T+1;if((S|0)>0){N=S;R=T}else{$=T;break}}}else{$=Q}a[$]=n;aa=Z}else{aa=O}if((aa|0)==(L|0)){R=tc[c[(c[u>>2]|0)+28>>2]&15](k,48)|0;N=c[f>>2]|0;c[f>>2]=N+1;a[N]=R}else{R=a[D]|0;N=(R&1)==0;if(N){ba=(R&255)>>>1}else{ba=c[G>>2]|0}if((ba|0)==0){ca=aa;da=-1;ea=0;fa=0}else{if(N){ga=E}else{ga=c[F>>2]|0}ca=aa;da=a[ga]|0;ea=0;fa=0}while(1){do{if((fa|0)==(da|0)){N=c[f>>2]|0;c[f>>2]=N+1;a[N]=o;N=ea+1|0;R=a[D]|0;P=(R&1)==0;if(P){ha=(R&255)>>>1}else{ha=c[G>>2]|0}if(!(N>>>0<ha>>>0)){ia=da;ja=N;ka=0;break}if(P){la=E}else{la=c[F>>2]|0}if((a[la+N|0]|0)==127){ia=-1;ja=N;ka=0;break}if(P){ma=E}else{ma=c[F>>2]|0}ia=a[ma+N|0]|0;ja=N;ka=0}else{ia=da;ja=ea;ka=fa}}while(0);N=ca+ -1|0;P=a[N]|0;R=c[f>>2]|0;c[f>>2]=R+1;a[R]=P;if((N|0)==(L|0)){break}else{ca=N;da=ia;ea=ja;fa=ka+1|0}}}Q=c[f>>2]|0;if((K|0)==(Q|0)){J=L;break a}N=Q+ -1|0;if(N>>>0>K>>>0){na=K;oa=N}else{J=L;break a}while(1){N=a[na]|0;a[na]=a[oa]|0;a[oa]=N;N=na+1|0;Q=oa+ -1|0;if(N>>>0<Q>>>0){oa=Q;na=N}else{J=L;break}}break};case 2:{L=a[r]|0;K=(L&1)==0;if(K){pa=(L&255)>>>1}else{pa=c[C>>2]|0}if((pa|0)==0|z){J=I;break a}if(K){qa=A;ra=(L&255)>>>1}else{qa=c[B>>2]|0;ra=c[C>>2]|0}L=qa+ra|0;K=c[f>>2]|0;if((qa|0)==(L|0)){sa=K}else{N=K;K=qa;while(1){a[N]=a[K]|0;Q=K+1|0;P=N+1|0;if((Q|0)==(L|0)){sa=P;break}else{K=Q;N=P}}}c[f>>2]=sa;J=I;break};case 3:{N=a[v]|0;K=(N&1)==0;if(K){ta=(N&255)>>>1}else{ta=c[y>>2]|0}if((ta|0)==0){J=I;break a}if(K){ua=w}else{ua=c[x>>2]|0}K=a[ua]|0;N=c[f>>2]|0;c[f>>2]=N+1;a[N]=K;J=I;break};case 1:{c[e>>2]=c[f>>2];K=tc[c[(c[u>>2]|0)+28>>2]&15](k,32)|0;N=c[f>>2]|0;c[f>>2]=N+1;a[N]=K;J=I;break};default:{J=I}}}while(0);K=h+1|0;if((K|0)==4){break}else{I=J;h=K}}h=a[v]|0;v=(h&1)==0;if(v){va=(h&255)>>>1}else{va=c[y>>2]|0}if(va>>>0>1){if(v){wa=w;xa=(h&255)>>>1}else{wa=c[x>>2]|0;xa=c[y>>2]|0}y=wa+1|0;x=wa+xa|0;xa=c[f>>2]|0;if((y|0)==(x|0)){ya=xa}else{wa=xa;xa=y;while(1){a[wa]=a[xa]|0;y=xa+1|0;h=wa+1|0;if((y|0)==(x|0)){ya=h;break}else{xa=y;wa=h}}}c[f>>2]=ya}ya=g&176;if((ya|0)==32){c[e>>2]=c[f>>2];i=t;return}else if((ya|0)==16){i=t;return}else{c[e>>2]=d;i=t;return}}function wj(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+40|0;k=d;l=d+8|0;m=d+24|0;n=d+32|0;o=n;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+16|0;s=i;i=i+16|0;t=i;i=i+16|0;u=i;i=i+8|0;v=i;i=i+104|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;Pe(m,g);z=m;A=c[z>>2]|0;if(!((c[1826]|0)==-1)){c[l>>2]=7304;c[l+4>>2]=113;c[l+8>>2]=0;qe(7304,l,114)}l=(c[7308>>2]|0)+ -1|0;B=c[A+8>>2]|0;if(!((c[A+12>>2]|0)-B>>2>>>0>l>>>0)){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}A=c[B+(l<<2)>>2]|0;if((A|0)==0){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}C=A;D=j;l=a[D]|0;B=(l&1)==0;if(B){E=(l&255)>>>1}else{E=c[j+4>>2]|0}if((E|0)==0){F=0}else{if(B){G=j+1|0}else{G=c[j+8>>2]|0}B=a[G]|0;F=B<<24>>24==(tc[c[(c[A>>2]|0)+28>>2]&15](C,45)|0)<<24>>24}c[n>>2]=0;n=r;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;n=s;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;A=t;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;uj(f,F,m,o,p,q,r,s,t,u);m=v;v=a[D]|0;D=(v&1)==0;if(D){H=(v&255)>>>1}else{H=c[j+4>>2]|0}f=c[u>>2]|0;if((H|0)>(f|0)){if(D){I=(v&255)>>>1}else{I=c[j+4>>2]|0}D=a[A]|0;if((D&1)==0){J=(D&255)>>>1}else{J=c[t+4>>2]|0}D=a[n]|0;if((D&1)==0){K=(D&255)>>>1}else{K=c[s+4>>2]|0}L=J+(I-f<<1|1)+K|0}else{K=a[A]|0;if((K&1)==0){M=(K&255)>>>1}else{M=c[t+4>>2]|0}K=a[n]|0;if((K&1)==0){N=(K&255)>>>1}else{N=c[s+4>>2]|0}L=M+2+N|0}N=L+f|0;do{if(N>>>0>100){L=Hm(N)|0;if((L|0)!=0){O=L;P=L;break}Tm()}else{O=0;P=m}}while(0);if((v&1)==0){Q=j+1|0;R=(v&255)>>>1}else{Q=c[j+8>>2]|0;R=c[j+4>>2]|0}vj(P,w,x,c[g+4>>2]|0,Q,Q+R|0,C,F,o,a[p]|0,a[q]|0,r,s,t,f);c[y>>2]=c[e>>2];e=c[w>>2]|0;w=c[x>>2]|0;x=k;f=y;c[x+0>>2]=c[f+0>>2];jh(b,k,P,e,w,g,h);if((O|0)==0){ve(t);ve(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}Im(O);ve(t);ve(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}function xj(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function yj(a){a=a|0;i=i;return}function zj(b,d,e,f,g,j,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;l=+l;var 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;d=i;i=i+16|0;m=d;n=d+8|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+104|0;r=i;i=i+8|0;s=i;i=i+400|0;t=i;i=i+8|0;u=i;i=i+8|0;v=u;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+400|0;D=i;i=i+8|0;E=i;i=i+8|0;F=i;i=i+8|0;G=q;c[r>>2]=G;q=s;s=o;h[k>>3]=l;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];s=ib(G|0,100,7056,o|0)|0;do{if(s>>>0>99){do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);o=c[1798]|0;G=n;h[k>>3]=l;c[G>>2]=c[k>>2];c[G+4>>2]=c[k+4>>2];G=oh(r,o,7056,n)|0;o=c[r>>2]|0;if((o|0)==0){Tm()}H=Hm(G<<2)|0;I=H;if((H|0)!=0){J=o;K=I;L=I;M=G;break}Tm()}else{J=0;K=0;L=q;M=s}}while(0);Pe(t,g);s=t;q=c[s>>2]|0;if(!((c[1824]|0)==-1)){c[p>>2]=7296;c[p+4>>2]=113;c[p+8>>2]=0;qe(7296,p,114)}p=(c[7300>>2]|0)+ -1|0;n=c[q+8>>2]|0;if(!((c[q+12>>2]|0)-n>>2>>>0>p>>>0)){N=Ta(4)|0;O=N;mm(O);Vb(N|0,15264,101)}q=c[n+(p<<2)>>2]|0;if((q|0)==0){N=Ta(4)|0;O=N;mm(O);Vb(N|0,15264,101)}N=q;O=c[r>>2]|0;qc[c[(c[q>>2]|0)+48>>2]&7](N,O,O+M|0,L)|0;if((M|0)==0){P=0}else{P=(a[c[r>>2]|0]|0)==45}c[u>>2]=0;u=y;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;u=z;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;r=A;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;Aj(f,P,t,v,w,x,y,z,A,B);t=C;C=c[B>>2]|0;if((M|0)>(C|0)){B=a[r]|0;if((B&1)==0){Q=(B&255)>>>1}else{Q=c[A+4>>2]|0}B=a[u]|0;if((B&1)==0){R=(B&255)>>>1}else{R=c[z+4>>2]|0}S=Q+(M-C<<1|1)+R|0}else{R=a[r]|0;if((R&1)==0){T=(R&255)>>>1}else{T=c[A+4>>2]|0}R=a[u]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[z+4>>2]|0}S=T+2+U|0}U=S+C|0;do{if(U>>>0>100){S=Hm(U<<2)|0;T=S;if((S|0)!=0){V=T;W=T;break}Tm()}else{V=0;W=t}}while(0);Bj(W,D,E,c[g+4>>2]|0,L,L+(M<<2)|0,N,P,v,c[w>>2]|0,c[x>>2]|0,y,z,A,C);c[F>>2]=c[e>>2];e=c[D>>2]|0;D=c[E>>2]|0;E=m;C=F;c[E+0>>2]=c[C+0>>2];xh(b,m,W,e,D,g,j);if((V|0)!=0){Im(V)}Ge(A);Ge(z);ve(y);Yd(c[s>>2]|0)|0;if((K|0)!=0){Im(K)}if((J|0)==0){i=d;return}Im(J);i=d;return}function Aj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,K=0,L=0;n=i;i=i+40|0;o=n;p=n+16|0;q=n+32|0;r=q;s=i;i=i+16|0;t=i;i=i+8|0;u=t;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+8|0;z=y;A=i;i=i+16|0;B=i;i=i+8|0;C=B;D=i;i=i+16|0;E=i;i=i+16|0;F=i;i=i+16|0;G=c[e>>2]|0;if(b){if(!((c[1718]|0)==-1)){c[p>>2]=6872;c[p+4>>2]=113;c[p+8>>2]=0;qe(6872,p,114)}p=(c[6876>>2]|0)+ -1|0;b=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-b>>2>>>0>p>>>0)){H=Ta(4)|0;I=H;mm(I);Vb(H|0,15264,101)}e=c[b+(p<<2)>>2]|0;if((e|0)==0){H=Ta(4)|0;I=H;mm(I);Vb(H|0,15264,101)}H=e;I=c[e>>2]|0;if(d){ic[c[I+44>>2]&63](r,H);r=f;p=c[q>>2]|0;a[r]=p;a[r+1|0]=p>>8;a[r+2|0]=p>>16;a[r+3|0]=p>>24;ic[c[(c[e>>2]|0)+32>>2]&63](s,H);p=l;if((a[p]&1)==0){c[l+4>>2]=0;a[p]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Je(l,0);r=s;c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;Ge(s)}else{ic[c[I+40>>2]&63](u,H);u=f;I=c[t>>2]|0;a[u]=I;a[u+1|0]=I>>8;a[u+2|0]=I>>16;a[u+3|0]=I>>24;ic[c[(c[e>>2]|0)+28>>2]&63](v,H);I=l;if((a[I]&1)==0){c[l+4>>2]=0;a[I]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Je(l,0);u=v;c[I+0>>2]=c[u+0>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;Ge(v)}v=e;c[g>>2]=kc[c[(c[v>>2]|0)+12>>2]&63](H)|0;c[h>>2]=kc[c[(c[v>>2]|0)+16>>2]&63](H)|0;ic[c[(c[e>>2]|0)+20>>2]&63](w,H);u=j;if((a[u]&1)==0){a[j+1|0]=0;a[u]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}ze(j,0);I=w;c[u+0>>2]=c[I+0>>2];c[u+4>>2]=c[I+4>>2];c[u+8>>2]=c[I+8>>2];c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;ve(w);ic[c[(c[e>>2]|0)+24>>2]&63](x,H);e=k;if((a[e]&1)==0){c[k+4>>2]=0;a[e]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Je(k,0);w=x;c[e+0>>2]=c[w+0>>2];c[e+4>>2]=c[w+4>>2];c[e+8>>2]=c[w+8>>2];c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;Ge(x);J=kc[c[(c[v>>2]|0)+36>>2]&63](H)|0;c[m>>2]=J;i=n;return}else{if(!((c[1702]|0)==-1)){c[o>>2]=6808;c[o+4>>2]=113;c[o+8>>2]=0;qe(6808,o,114)}o=(c[6812>>2]|0)+ -1|0;H=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-H>>2>>>0>o>>>0)){K=Ta(4)|0;L=K;mm(L);Vb(K|0,15264,101)}G=c[H+(o<<2)>>2]|0;if((G|0)==0){K=Ta(4)|0;L=K;mm(L);Vb(K|0,15264,101)}K=G;L=c[G>>2]|0;if(d){ic[c[L+44>>2]&63](z,K);z=f;d=c[y>>2]|0;a[z]=d;a[z+1|0]=d>>8;a[z+2|0]=d>>16;a[z+3|0]=d>>24;ic[c[(c[G>>2]|0)+32>>2]&63](A,K);d=l;if((a[d]&1)==0){c[l+4>>2]=0;a[d]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Je(l,0);z=A;c[d+0>>2]=c[z+0>>2];c[d+4>>2]=c[z+4>>2];c[d+8>>2]=c[z+8>>2];c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;Ge(A)}else{ic[c[L+40>>2]&63](C,K);C=f;f=c[B>>2]|0;a[C]=f;a[C+1|0]=f>>8;a[C+2|0]=f>>16;a[C+3|0]=f>>24;ic[c[(c[G>>2]|0)+28>>2]&63](D,K);f=l;if((a[f]&1)==0){c[l+4>>2]=0;a[f]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Je(l,0);l=D;c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;Ge(D)}D=G;c[g>>2]=kc[c[(c[D>>2]|0)+12>>2]&63](K)|0;c[h>>2]=kc[c[(c[D>>2]|0)+16>>2]&63](K)|0;ic[c[(c[G>>2]|0)+20>>2]&63](E,K);h=j;if((a[h]&1)==0){a[j+1|0]=0;a[h]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}ze(j,0);j=E;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;ve(E);ic[c[(c[G>>2]|0)+24>>2]&63](F,K);G=k;if((a[G]&1)==0){c[k+4>>2]=0;a[G]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Je(k,0);k=F;c[G+0>>2]=c[k+0>>2];c[G+4>>2]=c[k+4>>2];c[G+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;Ge(F);J=kc[c[(c[D>>2]|0)+36>>2]&63](K)|0;c[m>>2]=J;i=n;return}}function Bj(b,d,e,f,g,h,j,k,l,m,n,o,p,q,r){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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;r=r|0;var 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;s=i;c[e>>2]=b;t=j;u=q;v=q+4|0;w=q+8|0;q=p;x=(f&512|0)==0;y=p+4|0;z=p+8|0;p=(r|0)>0;A=o;B=o+1|0;C=o+8|0;D=o+4|0;o=j;E=g;g=0;while(1){a:do{switch(a[l+g|0]|0){case 1:{c[d>>2]=c[e>>2];F=tc[c[(c[t>>2]|0)+44>>2]&15](j,32)|0;G=c[e>>2]|0;c[e>>2]=G+4;c[G>>2]=F;H=E;break};case 4:{F=c[e>>2]|0;G=k?E+4|0:E;b:do{if(G>>>0<h>>>0){I=G;while(1){J=I+4|0;if(!(ec[c[(c[o>>2]|0)+12>>2]&31](j,2048,c[I>>2]|0)|0)){K=I;break b}if(J>>>0<h>>>0){I=J}else{K=J;break}}}else{K=G}}while(0);if(p){do{if(K>>>0>G>>>0){I=c[e>>2]|0;J=K;L=r;while(1){M=J+ -4|0;N=I+4|0;c[I>>2]=c[M>>2];O=L+ -1|0;P=(O|0)>0;if(M>>>0>G>>>0&P){L=O;J=M;I=N}else{break}}c[e>>2]=N;if(P){Q=M;R=O;S=34;break}I=c[e>>2]|0;c[e>>2]=I+4;T=I;U=M}else{Q=K;R=r;S=34}}while(0);do{if((S|0)==34){S=0;I=tc[c[(c[t>>2]|0)+44>>2]&15](j,48)|0;J=c[e>>2]|0;L=J+4|0;c[e>>2]=L;if((R|0)>0){V=L;W=J;X=R}else{T=J;U=Q;break}while(1){c[W>>2]=I;L=X+ -1|0;if((L|0)>0){X=L;W=V;V=V+4|0}else{break}}c[e>>2]=J+(R+1<<2);T=J+(R<<2)|0;U=Q}}while(0);c[T>>2]=m;Y=U}else{Y=K}if((Y|0)==(G|0)){I=tc[c[(c[t>>2]|0)+44>>2]&15](j,48)|0;L=c[e>>2]|0;Z=L+4|0;c[e>>2]=Z;c[L>>2]=I;_=Z}else{Z=a[A]|0;I=(Z&1)==0;if(I){$=(Z&255)>>>1}else{$=c[D>>2]|0}if(($|0)==0){aa=Y;ba=-1;ca=0;da=0}else{if(I){ea=B}else{ea=c[C>>2]|0}aa=Y;ba=a[ea]|0;ca=0;da=0}while(1){I=c[e>>2]|0;do{if((da|0)==(ba|0)){Z=I+4|0;c[e>>2]=Z;c[I>>2]=n;L=ca+1|0;fa=a[A]|0;ga=(fa&1)==0;if(ga){ha=(fa&255)>>>1}else{ha=c[D>>2]|0}if(!(L>>>0<ha>>>0)){ia=Z;ja=ba;ka=L;la=0;break}if(ga){ma=B}else{ma=c[C>>2]|0}if((a[ma+L|0]|0)==127){ia=Z;ja=-1;ka=L;la=0;break}if(ga){na=B}else{na=c[C>>2]|0}ia=Z;ja=a[na+L|0]|0;ka=L;la=0}else{ia=I;ja=ba;ka=ca;la=da}}while(0);I=aa+ -4|0;J=c[I>>2]|0;L=ia+4|0;c[e>>2]=L;c[ia>>2]=J;if((I|0)==(G|0)){_=L;break}else{aa=I;ba=ja;ca=ka;da=la+1|0}}}if((F|0)==(_|0)){H=G;break a}I=_+ -4|0;if(I>>>0>F>>>0){oa=F;pa=I}else{H=G;break a}while(1){I=c[oa>>2]|0;c[oa>>2]=c[pa>>2];c[pa>>2]=I;I=oa+4|0;L=pa+ -4|0;if(I>>>0<L>>>0){pa=L;oa=I}else{H=G;break}}break};case 2:{G=a[q]|0;F=(G&1)==0;if(F){qa=(G&255)>>>1}else{qa=c[y>>2]|0}if((qa|0)==0|x){H=E;break a}if(F){ra=y;sa=(G&255)>>>1}else{ra=c[z>>2]|0;sa=c[y>>2]|0}G=ra+(sa<<2)|0;F=c[e>>2]|0;if((ra|0)==(G|0)){ta=F}else{I=(ra+(sa+ -1<<2)+(0-ra)|0)>>>2;L=F;J=ra;while(1){c[L>>2]=c[J>>2];Z=J+4|0;if((Z|0)==(G|0)){break}L=L+4|0;J=Z}ta=F+(I+1<<2)|0}c[e>>2]=ta;H=E;break};case 3:{J=a[u]|0;L=(J&1)==0;if(L){ua=(J&255)>>>1}else{ua=c[v>>2]|0}if((ua|0)==0){H=E;break a}if(L){va=v}else{va=c[w>>2]|0}L=c[va>>2]|0;J=c[e>>2]|0;c[e>>2]=J+4;c[J>>2]=L;H=E;break};case 0:{c[d>>2]=c[e>>2];H=E;break};default:{H=E}}}while(0);L=g+1|0;if((L|0)==4){break}else{E=H;g=L}}g=a[u]|0;u=(g&1)==0;if(u){wa=(g&255)>>>1}else{wa=c[v>>2]|0}if(wa>>>0>1){if(u){xa=v;ya=(g&255)>>>1}else{xa=c[w>>2]|0;ya=c[v>>2]|0}v=xa+4|0;w=xa+(ya<<2)|0;g=c[e>>2]|0;if((v|0)==(w|0)){za=g}else{u=(xa+(ya+ -1<<2)+(0-v)|0)>>>2;ya=g;xa=v;while(1){c[ya>>2]=c[xa>>2];v=xa+4|0;if((v|0)==(w|0)){break}else{xa=v;ya=ya+4|0}}za=g+(u+1<<2)|0}c[e>>2]=za}za=f&176;if((za|0)==32){c[d>>2]=c[e>>2];i=s;return}else if((za|0)==16){i=s;return}else{c[d>>2]=b;i=s;return}}function Cj(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+40|0;k=d;l=d+8|0;m=d+24|0;n=d+32|0;o=n;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+16|0;s=i;i=i+16|0;t=i;i=i+16|0;u=i;i=i+8|0;v=i;i=i+400|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;Pe(m,g);z=m;A=c[z>>2]|0;if(!((c[1824]|0)==-1)){c[l>>2]=7296;c[l+4>>2]=113;c[l+8>>2]=0;qe(7296,l,114)}l=(c[7300>>2]|0)+ -1|0;B=c[A+8>>2]|0;if(!((c[A+12>>2]|0)-B>>2>>>0>l>>>0)){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}A=c[B+(l<<2)>>2]|0;if((A|0)==0){C=Ta(4)|0;D=C;mm(D);Vb(C|0,15264,101)}C=A;D=j;l=a[D]|0;B=(l&1)==0;if(B){E=(l&255)>>>1}else{E=c[j+4>>2]|0}if((E|0)==0){F=0}else{if(B){G=j+4|0}else{G=c[j+8>>2]|0}B=c[G>>2]|0;F=(B|0)==(tc[c[(c[A>>2]|0)+44>>2]&15](C,45)|0)}c[n>>2]=0;n=r;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;n=s;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;A=t;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;Aj(f,F,m,o,p,q,r,s,t,u);m=v;v=a[D]|0;D=(v&1)==0;if(D){H=(v&255)>>>1}else{H=c[j+4>>2]|0}f=c[u>>2]|0;if((H|0)>(f|0)){if(D){I=(v&255)>>>1}else{I=c[j+4>>2]|0}D=a[A]|0;if((D&1)==0){J=(D&255)>>>1}else{J=c[t+4>>2]|0}D=a[n]|0;if((D&1)==0){K=(D&255)>>>1}else{K=c[s+4>>2]|0}L=J+(I-f<<1|1)+K|0}else{K=a[A]|0;if((K&1)==0){M=(K&255)>>>1}else{M=c[t+4>>2]|0}K=a[n]|0;if((K&1)==0){N=(K&255)>>>1}else{N=c[s+4>>2]|0}L=M+2+N|0}N=L+f|0;do{if(N>>>0>100){L=Hm(N<<2)|0;M=L;if((L|0)!=0){O=M;P=M;break}Tm()}else{O=0;P=m}}while(0);if((v&1)==0){Q=j+4|0;R=(v&255)>>>1}else{Q=c[j+8>>2]|0;R=c[j+4>>2]|0}Bj(P,w,x,c[g+4>>2]|0,Q,Q+(R<<2)|0,C,F,o,c[p>>2]|0,c[q>>2]|0,r,s,t,f);c[y>>2]=c[e>>2];e=c[w>>2]|0;w=c[x>>2]|0;x=k;f=y;c[x+0>>2]=c[f+0>>2];xh(b,k,P,e,w,g,h);if((O|0)==0){Ge(t);Ge(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}Im(O);Ge(t);Ge(s);ve(r);S=c[z>>2]|0;T=S;Yd(T)|0;i=d;return}function Dj(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Ej(a){a=a|0;i=i;return}function Fj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=_b(f|0,1)|0;i=e;return d>>>((d|0)!=(-1|0)|0)|0}function Gj(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+16|0;j=d;k=j;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;l=a[h]|0;if((l&1)==0){m=h+1|0;n=h+1|0;o=(l&255)>>>1}else{l=c[h+8>>2]|0;m=l;n=l;o=c[h+4>>2]|0}h=m+o|0;do{if(n>>>0<h>>>0){o=n;do{Ae(j,a[o]|0);o=o+1|0;}while((o|0)!=(h|0));o=(e|0)==-1?-1:e<<1;if((a[k]&1)==0){p=o;q=9;break}r=o;s=c[j+8>>2]|0}else{p=(e|0)==-1?-1:e<<1;q=9}}while(0);if((q|0)==9){r=p;s=j+1|0}p=gb(r|0,f|0,g|0,s|0)|0;s=b;c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;s=hn(p|0)|0;g=p+s|0;if((s|0)>0){t=p}else{ve(j);i=d;return}do{Ae(b,a[t]|0);t=t+1|0;}while((t|0)!=(g|0));ve(j);i=d;return}function Hj(a,b){a=a|0;b=b|0;a=i;Tb(((b|0)==-1?-1:b<<1)|0)|0;i=a;return}function Ij(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Jj(a){a=a|0;i=i;return}function Kj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=_b(f|0,1)|0;i=e;return d>>>((d|0)!=(-1|0)|0)|0}function Lj(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 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;d=i;i=i+240|0;j=d;k=d+8|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+192|0;q=d+200|0;r=d+208|0;s=d+224|0;t=d+232|0;u=r;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[s+4>>2]=0;c[s>>2]=8960;v=a[h]|0;if((v&1)==0){w=h+4|0;x=h+4|0;y=(v&255)>>>1}else{v=c[h+8>>2]|0;w=v;x=v;y=c[h+4>>2]|0}h=w+(y<<2)|0;y=k;w=j;v=j;c[v>>2]=0;c[v+4>>2]=0;a:do{if(x>>>0<h>>>0){v=s;j=s;z=k+32|0;A=x;B=8960|0;while(1){c[m>>2]=A;C=(pc[c[B+12>>2]&15](v,w,A,h,m,y,z,l)|0)==2;D=c[m>>2]|0;if(C|(D|0)==(A|0)){break}if(y>>>0<(c[l>>2]|0)>>>0){C=y;do{Ae(r,a[C]|0);C=C+1|0;}while(C>>>0<(c[l>>2]|0)>>>0);E=c[m>>2]|0}else{E=D}if(!(E>>>0<h>>>0)){break a}A=E;B=c[j>>2]|0}fj(8184)}}while(0);if((a[u]&1)==0){F=r+1|0}else{F=c[r+8>>2]|0}u=gb(((e|0)==-1?-1:e<<1)|0,f|0,g|0,F|0)|0;F=b;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[t+4>>2]=0;c[t>>2]=9064;F=hn(u|0)|0;g=u+F|0;f=n;e=n;c[e>>2]=0;c[e+4>>2]=0;if((F|0)<=0){ve(r);i=d;return}F=t;e=t;t=g;n=o;E=o+128|0;o=u;u=9064|0;while(1){c[q>>2]=o;h=(pc[c[u+16>>2]&15](F,f,o,(t-o|0)>32?o+32|0:g,q,n,E,p)|0)==2;m=c[q>>2]|0;if(h|(m|0)==(o|0)){G=20;break}if(n>>>0<(c[p>>2]|0)>>>0){h=n;do{Ke(b,c[h>>2]|0);h=h+4|0;}while(h>>>0<(c[p>>2]|0)>>>0);H=c[q>>2]|0}else{H=m}if(!(H>>>0<g>>>0)){G=25;break}o=H;u=c[e>>2]|0}if((G|0)==20){fj(8184)}else if((G|0)==25){ve(r);i=d;return}}function Mj(a,b){a=a|0;b=b|0;a=i;Tb(((b|0)==-1?-1:b<<1)|0)|0;i=a;return}function Nj(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=7392;e=b+8|0;b=c[e>>2]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);if((b|0)==(c[1798]|0)){i=d;return}tb(c[e>>2]|0);i=d;return}function Oj(a){a=a|0;a=Ta(8)|0;Zd(a,7184);c[a>>2]=4232;Vb(a|0,4272,9)}function Pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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,N=0,O=0;e=i;i=i+448|0;f=e;g=e+16|0;h=e+32|0;j=e+48|0;k=e+64|0;l=e+80|0;m=e+96|0;n=e+112|0;o=e+128|0;p=e+144|0;q=e+160|0;r=e+176|0;s=e+192|0;t=e+208|0;u=e+224|0;v=e+240|0;w=e+256|0;x=e+272|0;y=e+288|0;z=e+304|0;A=e+320|0;B=e+336|0;C=e+352|0;D=e+368|0;E=e+384|0;F=e+400|0;G=e+416|0;H=e+432|0;c[b+4>>2]=d+ -1;c[b>>2]=7224;d=b+8|0;I=b+12|0;J=b+136|0;a[J]=1;K=b+24|0;c[I>>2]=K;c[d>>2]=K;c[b+16>>2]=J;J=28;L=K;do{if((L|0)==0){M=0}else{c[L>>2]=0;M=c[I>>2]|0}L=M+4|0;c[I>>2]=L;J=J+ -1|0;}while((J|0)!=0);te(b+144|0,7208,1);J=c[d>>2]|0;d=c[I>>2]|0;if((d|0)!=(J|0)){c[I>>2]=d+(~((d+ -4+(0-J)|0)>>>2)<<2)}c[12116>>2]=0;c[3028]=5704;if(!((c[1432]|0)==-1)){c[G>>2]=5728;c[G+4>>2]=113;c[G+8>>2]=0;qe(5728,G,114)}Qj(b,12112,(c[5732>>2]|0)+ -1|0);c[12108>>2]=0;c[3026]=5744;if(!((c[1442]|0)==-1)){c[F>>2]=5768;c[F+4>>2]=113;c[F+8>>2]=0;qe(5768,F,114)}Qj(b,12104,(c[5772>>2]|0)+ -1|0);c[12092>>2]=0;c[3022]=7320;c[12096>>2]=0;a[12100|0]=0;c[12096>>2]=c[(Ja()|0)>>2];if(!((c[1826]|0)==-1)){c[E>>2]=7304;c[E+4>>2]=113;c[E+8>>2]=0;qe(7304,E,114)}Qj(b,12088,(c[7308>>2]|0)+ -1|0);c[12084>>2]=0;c[3020]=8280;if(!((c[1824]|0)==-1)){c[D>>2]=7296;c[D+4>>2]=113;c[D+8>>2]=0;qe(7296,D,114)}Qj(b,12080,(c[7300>>2]|0)+ -1|0);c[12076>>2]=0;c[3018]=8496;if(!((c[1842]|0)==-1)){c[C>>2]=7368;c[C+4>>2]=113;c[C+8>>2]=0;qe(7368,C,114)}Qj(b,12072,(c[7372>>2]|0)+ -1|0);c[12060>>2]=0;c[3014]=7392;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);c[12064>>2]=c[1798];if(!((c[1844]|0)==-1)){c[B>>2]=7376;c[B+4>>2]=113;c[B+8>>2]=0;qe(7376,B,114)}Qj(b,12056,(c[7380>>2]|0)+ -1|0);c[12052>>2]=0;c[3012]=8720;if(!((c[1858]|0)==-1)){c[A>>2]=7432;c[A+4>>2]=113;c[A+8>>2]=0;qe(7432,A,114)}Qj(b,12048,(c[7436>>2]|0)+ -1|0);c[12044>>2]=0;c[3010]=8840;if(!((c[1860]|0)==-1)){c[z>>2]=7440;c[z+4>>2]=113;c[z+8>>2]=0;qe(7440,z,114)}Qj(b,12040,(c[7444>>2]|0)+ -1|0);c[12020>>2]=0;c[3004]=7472;a[12024|0]=46;a[12025|0]=44;c[12028>>2]=0;c[12032>>2]=0;c[12036>>2]=0;if(!((c[1862]|0)==-1)){c[y>>2]=7448;c[y+4>>2]=113;c[y+8>>2]=0;qe(7448,y,114)}Qj(b,12016,(c[7452>>2]|0)+ -1|0);c[11988>>2]=0;c[2996]=7512;c[11992>>2]=46;c[11996>>2]=44;c[12e3>>2]=0;c[12004>>2]=0;c[12008>>2]=0;if(!((c[1864]|0)==-1)){c[x>>2]=7456;c[x+4>>2]=113;c[x+8>>2]=0;qe(7456,x,114)}Qj(b,11984,(c[7460>>2]|0)+ -1|0);c[11980>>2]=0;c[2994]=5784;if(!((c[1460]|0)==-1)){c[w>>2]=5840;c[w+4>>2]=113;c[w+8>>2]=0;qe(5840,w,114)}Qj(b,11976,(c[5844>>2]|0)+ -1|0);c[11972>>2]=0;c[2992]=5904;if(!((c[1490]|0)==-1)){c[v>>2]=5960;c[v+4>>2]=113;c[v+8>>2]=0;qe(5960,v,114)}Qj(b,11968,(c[5964>>2]|0)+ -1|0);c[11964>>2]=0;c[2990]=5976;if(!((c[1506]|0)==-1)){c[u>>2]=6024;c[u+4>>2]=113;c[u+8>>2]=0;qe(6024,u,114)}Qj(b,11960,(c[6028>>2]|0)+ -1|0);c[11956>>2]=0;c[2988]=6040;if(!((c[1522]|0)==-1)){c[t>>2]=6088;c[t+4>>2]=113;c[t+8>>2]=0;qe(6088,t,114)}Qj(b,11952,(c[6092>>2]|0)+ -1|0);c[11948>>2]=0;c[2986]=6632;if(!((c[1670]|0)==-1)){c[s>>2]=6680;c[s+4>>2]=113;c[s+8>>2]=0;qe(6680,s,114)}Qj(b,11944,(c[6684>>2]|0)+ -1|0);c[11940>>2]=0;c[2984]=6696;if(!((c[1686]|0)==-1)){c[r>>2]=6744;c[r+4>>2]=113;c[r+8>>2]=0;qe(6744,r,114)}Qj(b,11936,(c[6748>>2]|0)+ -1|0);c[11932>>2]=0;c[2982]=6760;if(!((c[1702]|0)==-1)){c[q>>2]=6808;c[q+4>>2]=113;c[q+8>>2]=0;qe(6808,q,114)}Qj(b,11928,(c[6812>>2]|0)+ -1|0);c[11924>>2]=0;c[2980]=6824;if(!((c[1718]|0)==-1)){c[p>>2]=6872;c[p+4>>2]=113;c[p+8>>2]=0;qe(6872,p,114)}Qj(b,11920,(c[6876>>2]|0)+ -1|0);c[11916>>2]=0;c[2978]=6888;if(!((c[1728]|0)==-1)){c[o>>2]=6912;c[o+4>>2]=113;c[o+8>>2]=0;qe(6912,o,114)}Qj(b,11912,(c[6916>>2]|0)+ -1|0);c[11908>>2]=0;c[2976]=6968;if(!((c[1748]|0)==-1)){c[n>>2]=6992;c[n+4>>2]=113;c[n+8>>2]=0;qe(6992,n,114)}Qj(b,11904,(c[6996>>2]|0)+ -1|0);c[11900>>2]=0;c[2974]=7024;if(!((c[1762]|0)==-1)){c[m>>2]=7048;c[m+4>>2]=113;c[m+8>>2]=0;qe(7048,m,114)}Qj(b,11896,(c[7052>>2]|0)+ -1|0);c[11892>>2]=0;c[2972]=7072;if(!((c[1774]|0)==-1)){c[l>>2]=7096;c[l+4>>2]=113;c[l+8>>2]=0;qe(7096,l,114)}Qj(b,11888,(c[7100>>2]|0)+ -1|0);c[11876>>2]=0;c[2968]=6120;c[11880>>2]=6168;if(!((c[1550]|0)==-1)){c[k>>2]=6200;c[k+4>>2]=113;c[k+8>>2]=0;qe(6200,k,114)}Qj(b,11872,(c[6204>>2]|0)+ -1|0);c[11860>>2]=0;c[2964]=6272;c[11864>>2]=6320;if(!((c[1588]|0)==-1)){c[j>>2]=6352;c[j+4>>2]=113;c[j+8>>2]=0;qe(6352,j,114)}Qj(b,11856,(c[6356>>2]|0)+ -1|0);c[11844>>2]=0;c[2960]=8216;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);c[11848>>2]=c[1798];c[2960]=6568;if(!((c[1646]|0)==-1)){c[h>>2]=6584;c[h+4>>2]=113;c[h+8>>2]=0;qe(6584,h,114)}Qj(b,11840,(c[6588>>2]|0)+ -1|0);c[11828>>2]=0;c[2956]=8216;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);c[11832>>2]=c[1798];c[2956]=6600;if(!((c[1654]|0)==-1)){c[g>>2]=6616;c[g+4>>2]=113;c[g+8>>2]=0;qe(6616,g,114)}Qj(b,11824,(c[6620>>2]|0)+ -1|0);c[11820>>2]=0;c[2954]=7112;if(!((c[1784]|0)==-1)){c[f>>2]=7136;c[f+4>>2]=113;c[f+8>>2]=0;qe(7136,f,114)}Qj(b,11816,(c[7140>>2]|0)+ -1|0);c[11812>>2]=0;c[2952]=7152;if((c[1794]|0)==-1){N=c[7180>>2]|0;O=N+ -1|0;Qj(b,11808,O);i=e;return}c[H>>2]=7176;c[H+4>>2]=113;c[H+8>>2]=0;qe(7176,H,114);N=c[7180>>2]|0;O=N+ -1|0;Qj(b,11808,O);i=e;return}function Qj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;Xd(b);f=a+8|0;g=a+12|0;a=c[g>>2]|0;h=f;j=c[h>>2]|0;k=a-j>>2;do{if(k>>>0>d>>>0){l=j}else{m=d+1|0;if(k>>>0<m>>>0){Ul(f,m-k|0);l=c[h>>2]|0;break}if(!(k>>>0>m>>>0)){l=j;break}n=j+(m<<2)|0;if((a|0)==(n|0)){l=j;break}c[g>>2]=a+(~((a+ -4+(0-n)|0)>>>2)<<2);l=j}}while(0);j=c[l+(d<<2)>>2]|0;if((j|0)==0){o=l;p=o+(d<<2)|0;c[p>>2]=b;i=e;return}Yd(j)|0;o=c[h>>2]|0;p=o+(d<<2)|0;c[p>>2]=b;i=e;return}function Rj(a){a=a|0;var b=0;b=i;Sj(a);Om(a);i=b;return}function Sj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;c[b>>2]=7224;e=b+12|0;f=c[e>>2]|0;g=b+8|0;h=c[g>>2]|0;if((f|0)!=(h|0)){j=f;f=h;h=0;while(1){k=c[f+(h<<2)>>2]|0;if((k|0)==0){l=f;m=j}else{Yd(k)|0;l=c[g>>2]|0;m=c[e>>2]|0}k=h+1|0;if(k>>>0<m-l>>2>>>0){j=m;f=l;h=k}else{break}}}ve(b+144|0);h=c[g>>2]|0;if((h|0)==0){i=d;return}g=c[e>>2]|0;if((g|0)!=(h|0)){c[e>>2]=g+(~((g+ -4+(0-h)|0)>>>2)<<2)}if((b+24|0)==(h|0)){a[b+136|0]=0;i=d;return}else{Om(h);i=d;return}}function Tj(){var b=0,d=0,e=0;b=i;if((a[7280]|0)!=0){d=c[1818]|0;i=b;return d|0}if((Ma(7280)|0)==0){d=c[1818]|0;i=b;return d|0}do{if((a[7256]|0)==0){if((Ma(7256)|0)==0){break}Pj(11648,1);c[1810]=11648;c[1812]=7240;Za(7256)}}while(0);e=c[c[1812]>>2]|0;c[1816]=e;Xd(e);c[1818]=7264;Za(7280);d=c[1818]|0;i=b;return d|0}function Uj(a){a=a|0;var b=0,d=0;b=i;d=c[(Tj()|0)>>2]|0;c[a>>2]=d;Xd(d);i=b;return}function Vj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;c[a>>2]=e;Xd(e);i=d;return}function Wj(a){a=a|0;var b=0;b=i;Yd(c[a>>2]|0)|0;i=b;return}function Xj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=c[a>>2]|0;a=b;if(!((c[a>>2]|0)==-1)){c[e>>2]=b;c[e+4>>2]=113;c[e+8>>2]=0;qe(a,e,114)}e=(c[b+4>>2]|0)+ -1|0;b=c[f+8>>2]|0;if(!((c[f+12>>2]|0)-b>>2>>>0>e>>>0)){g=Ta(4)|0;h=g;mm(h);Vb(g|0,15264,101)}f=c[b+(e<<2)>>2]|0;if((f|0)==0){g=Ta(4)|0;h=g;mm(h);Vb(g|0,15264,101)}else{i=d;return f|0}return 0}function Yj(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Zj(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}hc[c[(c[a>>2]|0)+4>>2]&127](a);i=b;return}function _j(a){a=a|0;var b=0;b=c[1822]|0;c[1822]=b+1;c[a+4>>2]=b+1;i=i;return}function $j(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function ak(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;a=i;if(!(e>>>0<128)){f=0;i=a;return f|0}f=(b[(c[(Ja()|0)>>2]|0)+(e<<1)>>1]&d)<<16>>16!=0;i=a;return f|0}function bk(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;if((d|0)==(e|0)){g=d;i=a;return g|0}else{h=d;j=f}while(1){f=c[h>>2]|0;if(f>>>0<128){k=b[(c[(Ja()|0)>>2]|0)+(f<<1)>>1]|0}else{k=0}b[j>>1]=k;f=h+4|0;if((f|0)==(e|0)){g=e;break}else{h=f;j=j+2|0}}i=a;return g|0}function ck(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;a=i;a:do{if((e|0)==(f|0)){g=e}else{h=e;while(1){j=c[h>>2]|0;if(j>>>0<128){if(!((b[(c[(Ja()|0)>>2]|0)+(j<<1)>>1]&d)<<16>>16==0)){g=h;break a}}j=h+4|0;if((j|0)==(f|0)){g=f;break}else{h=j}}}}while(0);i=a;return g|0}function dk(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;a:do{if((e|0)==(f|0)){g=e}else{h=e;while(1){j=c[h>>2]|0;if(!(j>>>0<128)){g=h;break a}k=h+4|0;if((b[(c[(Ja()|0)>>2]|0)+(j<<1)>>1]&d)<<16>>16==0){g=h;break a}if((k|0)==(f|0)){g=f;break}else{h=k}}}}while(0);i=a;return g|0}function ek(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b>>>0<128)){d=b;i=a;return d|0}d=c[(c[(Cb()|0)>>2]|0)+(b<<2)>>2]|0;i=a;return d|0}function fk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;a=i;if((b|0)==(d|0)){e=b;i=a;return e|0}else{f=b}while(1){b=c[f>>2]|0;if(b>>>0<128){g=c[(c[(Cb()|0)>>2]|0)+(b<<2)>>2]|0}else{g=b}c[f>>2]=g;b=f+4|0;if((b|0)==(d|0)){e=d;break}else{f=b}}i=a;return e|0}function gk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b>>>0<128)){d=b;i=a;return d|0}d=c[(c[(wb()|0)>>2]|0)+(b<<2)>>2]|0;i=a;return d|0}function hk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;a=i;if((b|0)==(d|0)){e=b;i=a;return e|0}else{f=b}while(1){b=c[f>>2]|0;if(b>>>0<128){g=c[(c[(wb()|0)>>2]|0)+(b<<2)>>2]|0}else{g=b}c[f>>2]=g;b=f+4|0;if((b|0)==(d|0)){e=d;break}else{f=b}}i=a;return e|0}function ik(a,b){a=a|0;b=b|0;i=i;return b<<24>>24|0}function jk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;b=i;if((d|0)==(e|0)){g=d;i=b;return g|0}else{h=d;j=f}while(1){c[j>>2]=a[h]|0;f=h+1|0;if((f|0)==(e|0)){g=e;break}else{j=j+4|0;h=f}}i=b;return g|0}function kk(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return(b>>>0<128?b&255:c)|0}function lk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;b=i;if((d|0)==(e|0)){h=d;i=b;return h|0}j=((e+ -4+(0-d)|0)>>>2)+1|0;k=d;l=g;while(1){g=c[k>>2]|0;a[l]=g>>>0<128?g&255:f;g=k+4|0;if((g|0)==(e|0)){break}else{l=l+1|0;k=g}}h=d+(j<<2)|0;i=b;return h|0}function mk(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=7320;e=c[b+8>>2]|0;do{if((e|0)!=0){if((a[b+12|0]|0)==0){break}Pm(e)}}while(0);Om(b);i=d;return}function nk(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=7320;e=c[b+8>>2]|0;if((e|0)==0){i=d;return}if((a[b+12|0]|0)==0){i=d;return}Pm(e);i=d;return}function ok(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b<<24>>24>-1)){d=b;i=a;return d|0}d=c[(c[(Cb()|0)>>2]|0)+((b&255)<<2)>>2]&255;i=a;return d|0}function pk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;if((d|0)==(e|0)){f=d;i=b;return f|0}else{g=d}while(1){d=a[g]|0;if(d<<24>>24>-1){h=c[(c[(Cb()|0)>>2]|0)+(d<<24>>24<<2)>>2]&255}else{h=d}a[g]=h;d=g+1|0;if((d|0)==(e|0)){f=e;break}else{g=d}}i=b;return f|0}function qk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b<<24>>24>-1)){d=b;i=a;return d|0}d=c[(c[(wb()|0)>>2]|0)+(b<<24>>24<<2)>>2]&255;i=a;return d|0}function rk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;if((d|0)==(e|0)){f=d;i=b;return f|0}else{g=d}while(1){d=a[g]|0;if(d<<24>>24>-1){h=c[(c[(wb()|0)>>2]|0)+(d<<24>>24<<2)>>2]&255}else{h=d}a[g]=h;d=g+1|0;if((d|0)==(e|0)){f=e;break}else{g=d}}i=b;return f|0}function sk(a,b){a=a|0;b=b|0;i=i;return b|0}function tk(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=i;if((c|0)==(d|0)){f=c}else{g=c;c=e;while(1){a[c]=a[g]|0;e=g+1|0;if((e|0)==(d|0)){f=d;break}else{c=c+1|0;g=e}}}i=b;return f|0}function uk(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return(b<<24>>24>-1?b:c)|0}function vk(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,j=0;b=i;if((c|0)==(d|0)){g=c;i=b;return g|0}else{h=c;j=f}while(1){f=a[h]|0;a[j]=f<<24>>24>-1?f:e;f=h+1|0;if((f|0)==(d|0)){g=d;break}else{j=j+1|0;h=f}}i=b;return g|0}function wk(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function xk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;c[f>>2]=d;c[j>>2]=g;i=i;return 3}function yk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;c[f>>2]=d;c[j>>2]=g;i=i;return 3}function zk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function Ak(a){a=a|0;i=i;return 1}function Bk(a){a=a|0;i=i;return 1}function Ck(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=d-c|0;i=i;return(b>>>0<e>>>0?b:e)|0}function Dk(a){a=a|0;i=i;return 1}function Ek(a){a=a|0;var b=0;b=i;Nj(a);Om(a);i=b;return}function Fk(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;l=i;i=i+8|0;m=l;n=m;o=i;i=i+8|0;p=(e|0)==(f|0);a:do{if(p){c[k>>2]=h;c[g>>2]=e;q=e}else{r=e;while(1){s=r+4|0;if((c[r>>2]|0)==0){t=r;break}if((s|0)==(f|0)){t=f;break}else{r=s}}c[k>>2]=h;c[g>>2]=e;if(p|(h|0)==(j|0)){q=e;break}r=d;s=j;u=b+8|0;v=o;w=e;x=h;y=t;while(1){z=r;A=c[z+4>>2]|0;B=m;c[B>>2]=c[z>>2];c[B+4>>2]=A;A=fb(c[u>>2]|0)|0;B=fm(x,g,y-w>>2,s-x|0,d)|0;if((A|0)!=0){fb(A|0)|0}if((B|0)==-1){C=10;break}else if((B|0)==0){D=1;C=33;break}A=(c[k>>2]|0)+B|0;c[k>>2]=A;if((A|0)==(j|0)){C=31;break}if((y|0)==(f|0)){E=c[g>>2]|0;F=A;G=f}else{A=fb(c[u>>2]|0)|0;B=em(v,0,d)|0;if((A|0)!=0){fb(A|0)|0}if((B|0)==-1){D=2;C=33;break}A=c[k>>2]|0;if(B>>>0>(s-A|0)>>>0){D=1;C=33;break}b:do{if((B|0)!=0){z=A;H=B;I=v;while(1){J=a[I]|0;c[k>>2]=z+1;a[z]=J;J=H+ -1|0;if((J|0)==0){break b}z=c[k>>2]|0;I=I+1|0;H=J}}}while(0);B=(c[g>>2]|0)+4|0;c[g>>2]=B;c:do{if((B|0)==(f|0)){K=f}else{A=B;while(1){H=A+4|0;if((c[A>>2]|0)==0){K=A;break c}if((H|0)==(f|0)){K=f;break}else{A=H}}}}while(0);E=B;F=c[k>>2]|0;G=K}if((E|0)==(f|0)|(F|0)==(j|0)){q=E;break a}else{w=E;x=F;y=G}}if((C|0)==10){c[k>>2]=x;d:do{if((w|0)==(c[g>>2]|0)){L=w}else{y=w;v=x;while(1){s=c[y>>2]|0;r=fb(c[u>>2]|0)|0;A=em(v,s,n)|0;if((r|0)!=0){fb(r|0)|0}if((A|0)==-1){L=y;break d}r=(c[k>>2]|0)+A|0;c[k>>2]=r;A=y+4|0;if((A|0)==(c[g>>2]|0)){L=A;break}else{y=A;v=r}}}}while(0);c[g>>2]=L;D=2;i=l;return D|0}else if((C|0)==31){q=c[g>>2]|0;break}else if((C|0)==33){i=l;return D|0}}}while(0);D=(q|0)!=(f|0)|0;i=l;return D|0}function Gk(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;l=i;i=i+8|0;m=l;n=m;o=(e|0)==(f|0);a:do{if(o){c[k>>2]=h;c[g>>2]=e;p=e}else{q=e;while(1){r=q+1|0;if((a[q]|0)==0){s=q;break}if((r|0)==(f|0)){s=f;break}else{q=r}}c[k>>2]=h;c[g>>2]=e;if(o|(h|0)==(j|0)){p=e;break}q=d;r=j;t=b+8|0;u=e;v=h;w=s;while(1){x=q;y=c[x+4>>2]|0;z=m;c[z>>2]=c[x>>2];c[z+4>>2]=y;A=w;y=fb(c[t>>2]|0)|0;z=bm(v,g,A-u|0,r-v>>2,d)|0;if((y|0)!=0){fb(y|0)|0}if((z|0)==0){B=2;C=32;break}else if((z|0)==-1){C=10;break}y=(c[k>>2]|0)+(z<<2)|0;c[k>>2]=y;if((y|0)==(j|0)){C=30;break}z=c[g>>2]|0;if((w|0)==(f|0)){D=z;E=y;F=f}else{x=fb(c[t>>2]|0)|0;G=am(y,z,1,d)|0;if((x|0)!=0){fb(x|0)|0}if((G|0)!=0){B=2;C=32;break}c[k>>2]=(c[k>>2]|0)+4;G=(c[g>>2]|0)+1|0;c[g>>2]=G;b:do{if((G|0)==(f|0)){H=f}else{x=G;while(1){z=x+1|0;if((a[x]|0)==0){H=x;break b}if((z|0)==(f|0)){H=f;break}else{x=z}}}}while(0);D=G;E=c[k>>2]|0;F=H}if((D|0)==(f|0)|(E|0)==(j|0)){p=D;break a}else{u=D;v=E;w=F}}if((C|0)==10){c[k>>2]=v;c:do{if((u|0)==(c[g>>2]|0)){I=u}else{w=u;r=v;while(1){q=fb(c[t>>2]|0)|0;x=am(r,w,A-w|0,n)|0;if((q|0)!=0){fb(q|0)|0}if((x|0)==0){J=w+1|0}else if((x|0)==-1){C=15;break}else if((x|0)==-2){C=16;break}else{J=w+x|0}x=(c[k>>2]|0)+4|0;c[k>>2]=x;if((J|0)==(c[g>>2]|0)){I=J;break c}else{w=J;r=x}}if((C|0)==15){c[g>>2]=w;B=2;i=l;return B|0}else if((C|0)==16){c[g>>2]=w;B=1;i=l;return B|0}}}while(0);c[g>>2]=I;B=(I|0)!=(f|0)|0;i=l;return B|0}else if((C|0)==30){p=c[g>>2]|0;break}else if((C|0)==32){i=l;return B|0}}}while(0);B=(p|0)!=(f|0)|0;i=l;return B|0}function Hk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+8|0;c[g>>2]=e;e=h;j=fb(c[b+8>>2]|0)|0;b=em(e,0,d)|0;if((j|0)!=0){fb(j|0)|0}if((b|0)==0|(b|0)==-1){k=2;i=h;return k|0}j=b+ -1|0;b=c[g>>2]|0;if(j>>>0>(f-b|0)>>>0){k=1;i=h;return k|0}if((j|0)==0){k=0;i=h;return k|0}else{l=b;m=j;n=e}while(1){e=a[n]|0;c[g>>2]=l+1;a[l]=e;e=m+ -1|0;if((e|0)==0){k=0;break}l=c[g>>2]|0;n=n+1|0;m=e}i=h;return k|0}function Ik(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+8|0;a=fb(c[d>>2]|0)|0;e=dm(0,0,4)|0;if((a|0)!=0){fb(a|0)|0}do{if((e|0)==0){a=c[d>>2]|0;if((a|0)==0){f=1;break}g=fb(a|0)|0;if((g|0)==0){f=0;break}fb(g|0)|0;f=0}else{f=-1}}while(0);i=b;return f|0}function Jk(a){a=a|0;i=i;return 0}function Kk(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;if((f|0)==0|(d|0)==(e|0)){h=0;i=g;return h|0}j=e;k=a+8|0;a=d;d=0;l=0;while(1){m=fb(c[k>>2]|0)|0;n=$l(a,j-a|0,b)|0;if((m|0)!=0){fb(m|0)|0}if((n|0)==0){o=a+1|0;p=1}else if((n|0)==-2|(n|0)==-1){h=d;q=9;break}else{o=a+n|0;p=n}n=p+d|0;m=l+1|0;if(m>>>0>=f>>>0|(o|0)==(e|0)){h=n;q=9;break}else{a=o;d=n;l=m}}if((q|0)==9){i=g;return h|0}return 0}function Lk(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+8>>2]|0;do{if((d|0)==0){e=1}else{a=fb(d|0)|0;if((a|0)==0){e=4;break}fb(a|0)|0;e=4}}while(0);i=b;return e|0}function Mk(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Nk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Ok(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d>>1<<1);c[j>>2]=g+((c[k>>2]|0)-g);i=b;return l|0}function Ok(d,f,g,h,j,k,l,m){d=d|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;c[g>>2]=d;c[k>>2]=h;do{if((m&2|0)!=0){if((j-h|0)<3){o=1;i=n;return o|0}else{c[k>>2]=h+1;a[h]=-17;d=c[k>>2]|0;c[k>>2]=d+1;a[d]=-69;d=c[k>>2]|0;c[k>>2]=d+1;a[d]=-65;break}}}while(0);h=f;m=c[g>>2]|0;if(!(m>>>0<f>>>0)){o=0;i=n;return o|0}d=j;j=m;a:while(1){m=b[j>>1]|0;p=m&65535;if(p>>>0>l>>>0){o=2;q=26;break}do{if((m&65535)<128){r=c[k>>2]|0;if((d-r|0)<1){o=1;q=26;break a}c[k>>2]=r+1;a[r]=m}else{if((m&65535)<2048){r=c[k>>2]|0;if((d-r|0)<2){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>6|192;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if((m&65535)<55296){r=c[k>>2]|0;if((d-r|0)<3){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>12|224;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p>>>6&63|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if(!((m&65535)<56320)){if((m&65535)<57344){o=2;q=26;break a}r=c[k>>2]|0;if((d-r|0)<3){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>12|224;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p>>>6&63|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if((h-j|0)<4){o=1;q=26;break a}r=j+2|0;s=e[r>>1]|0;if((s&64512|0)!=56320){o=2;q=26;break a}if((d-(c[k>>2]|0)|0)<4){o=1;q=26;break a}t=p&960;if(((t<<10)+65536|p<<10&64512|s&1023)>>>0>l>>>0){o=2;q=26;break a}c[g>>2]=r;r=(t>>>6)+1|0;t=c[k>>2]|0;c[k>>2]=t+1;a[t]=r>>>2|240;t=c[k>>2]|0;c[k>>2]=t+1;a[t]=p>>>2&15|r<<4&48|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p<<4&48|s>>>6&15|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=s&63|128}}while(0);p=(c[g>>2]|0)+2|0;c[g>>2]=p;if(p>>>0<f>>>0){j=p}else{o=0;q=26;break}}if((q|0)==26){i=n;return o|0}return 0}function Pk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Qk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d);c[j>>2]=g+((c[k>>2]|0)-g>>1<<1);i=b;return l|0}function Qk(e,f,g,h,j,k,l,m){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;c[g>>2]=e;c[k>>2]=h;h=c[g>>2]|0;do{if((m&4|0)==0){o=h}else{if((f-h|0)<=2){o=h;break}if(!((a[h]|0)==-17)){o=h;break}if(!((a[h+1|0]|0)==-69)){o=h;break}if(!((a[h+2|0]|0)==-65)){o=h;break}e=h+3|0;c[g>>2]=e;o=e}}while(0);a:do{if(o>>>0<f>>>0){h=f;m=j;e=o;p=c[k>>2]|0;b:while(1){if(!(p>>>0<j>>>0)){q=e;break a}r=a[e]|0;s=r&255;if(s>>>0>l>>>0){t=2;u=41;break}do{if(r<<24>>24>-1){b[p>>1]=r&255;c[g>>2]=e+1}else{if((r&255)<194){t=2;u=41;break b}if((r&255)<224){if((h-e|0)<2){t=1;u=41;break b}v=d[e+1|0]|0;if((v&192|0)!=128){t=2;u=41;break b}w=v&63|s<<6&1984;if(w>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=w;c[g>>2]=e+2;break}if((r&255)<240){if((h-e|0)<3){t=1;u=41;break b}w=a[e+1|0]|0;v=a[e+2|0]|0;if((s|0)==224){if(!((w&-32)<<24>>24==-96)){t=2;u=41;break b}}else if((s|0)==237){if(!((w&-32)<<24>>24==-128)){t=2;u=41;break b}}else{if(!((w&-64)<<24>>24==-128)){t=2;u=41;break b}}x=v&255;if((x&192|0)!=128){t=2;u=41;break b}v=(w&255)<<6&4032|s<<12|x&63;if((v&65535)>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=v;c[g>>2]=e+3;break}if(!((r&255)<245)){t=2;u=41;break b}if((h-e|0)<4){t=1;u=41;break b}v=a[e+1|0]|0;x=a[e+2|0]|0;w=a[e+3|0]|0;if((s|0)==244){if(!((v&-16)<<24>>24==-128)){t=2;u=41;break b}}else if((s|0)==240){if(!((v+112<<24>>24&255)<48)){t=2;u=41;break b}}else{if(!((v&-64)<<24>>24==-128)){t=2;u=41;break b}}y=x&255;if((y&192|0)!=128){t=2;u=41;break b}x=w&255;if((x&192|0)!=128){t=2;u=41;break b}if((m-p|0)<4){t=1;u=41;break b}w=s&7;z=v&255;v=y<<6;A=x&63;if((z<<12&258048|w<<18|v&4032|A)>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=z<<2&60|y>>>4&3|((z>>>4&3|w<<2)<<6)+16320|55296;w=p+2|0;c[k>>2]=w;b[w>>1]=A|v&960|56320;c[g>>2]=(c[g>>2]|0)+4}}while(0);s=(c[k>>2]|0)+2|0;c[k>>2]=s;r=c[g>>2]|0;if(r>>>0<f>>>0){e=r;p=s}else{q=r;break a}}if((u|0)==41){i=n;return t|0}}else{q=o}}while(0);t=q>>>0<f>>>0|0;i=n;return t|0}function Rk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function Sk(a){a=a|0;i=i;return 0}function Tk(a){a=a|0;i=i;return 0}function Uk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=i;a=Vk(c,d,e,1114111,0)|0;i=b;return a|0}function Vk(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;do{if((g&4|0)==0){j=b}else{if((c-b|0)<=2){j=b;break}if(!((a[b]|0)==-17)){j=b;break}if(!((a[b+1|0]|0)==-69)){j=b;break}j=(a[b+2|0]|0)==-65?b+3|0:b}}while(0);a:do{if(j>>>0<c>>>0&(e|0)!=0){g=c;k=j;l=0;b:while(1){m=a[k]|0;n=m&255;if(n>>>0>f>>>0){o=k;break a}do{if(m<<24>>24>-1){p=k+1|0;q=l}else{if((m&255)<194){o=k;break a}if((m&255)<224){if((g-k|0)<2){o=k;break a}r=d[k+1|0]|0;if((r&192|0)!=128){o=k;break a}if((r&63|n<<6&1984)>>>0>f>>>0){o=k;break a}p=k+2|0;q=l;break}if((m&255)<240){s=k;if((g-s|0)<3){o=k;break a}r=a[k+1|0]|0;t=a[k+2|0]|0;if((n|0)==237){if(!((r&-32)<<24>>24==-128)){u=23;break b}}else if((n|0)==224){if(!((r&-32)<<24>>24==-96)){u=21;break b}}else{if(!((r&-64)<<24>>24==-128)){u=25;break b}}v=t&255;if((v&192|0)!=128){o=k;break a}if(((r&255)<<6&4032|n<<12&61440|v&63)>>>0>f>>>0){o=k;break a}p=k+3|0;q=l;break}if(!((m&255)<245)){o=k;break a}w=k;if((g-w|0)<4){o=k;break a}if((e-l|0)>>>0<2){o=k;break a}v=a[k+1|0]|0;r=a[k+2|0]|0;t=a[k+3|0]|0;if((n|0)==244){if(!((v&-16)<<24>>24==-128)){u=36;break b}}else if((n|0)==240){if(!((v+112<<24>>24&255)<48)){u=34;break b}}else{if(!((v&-64)<<24>>24==-128)){u=38;break b}}x=r&255;if((x&192|0)!=128){o=k;break a}r=t&255;if((r&192|0)!=128){o=k;break a}if(((v&255)<<12&258048|n<<18&1835008|x<<6&4032|r&63)>>>0>f>>>0){o=k;break a}p=k+4|0;q=l+1|0}}while(0);n=q+1|0;if(p>>>0<c>>>0&n>>>0<e>>>0){k=p;l=n}else{o=p;break a}}if((u|0)==21){y=s-b|0;i=h;return y|0}else if((u|0)==23){y=s-b|0;i=h;return y|0}else if((u|0)==25){y=s-b|0;i=h;return y|0}else if((u|0)==34){y=w-b|0;i=h;return y|0}else if((u|0)==36){y=w-b|0;i=h;return y|0}else if((u|0)==38){y=w-b|0;i=h;return y|0}}else{o=j}}while(0);y=o-b|0;i=h;return y|0}function Wk(a){a=a|0;i=i;return 4}function Xk(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Yk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Zk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d>>2<<2);c[j>>2]=g+((c[k>>2]|0)-g);i=b;return l|0}function Zk(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;l=i;c[e>>2]=b;c[h>>2]=f;do{if((k&2|0)!=0){if((g-f|0)<3){m=1;i=l;return m|0}else{c[h>>2]=f+1;a[f]=-17;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=-69;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=-65;break}}}while(0);f=c[e>>2]|0;if(!(f>>>0<d>>>0)){m=0;i=l;return m|0}k=g;g=f;a:while(1){f=c[g>>2]|0;if((f&-2048|0)==55296|f>>>0>j>>>0){m=2;n=19;break}do{if(f>>>0<128){b=c[h>>2]|0;if((k-b|0)<1){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f}else{if(f>>>0<2048){b=c[h>>2]|0;if((k-b|0)<2){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>6|192;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f&63|128;break}b=c[h>>2]|0;o=k-b|0;if(f>>>0<65536){if((o|0)<3){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>12|224;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=f>>>6&63|128;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=f&63|128;break}else{if((o|0)<4){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>18|240;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f>>>12&63|128;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f>>>6&63|128;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f&63|128;break}}}while(0);f=(c[e>>2]|0)+4|0;c[e>>2]=f;if(f>>>0<d>>>0){g=f}else{m=0;n=19;break}}if((n|0)==19){i=l;return m|0}return 0}function _k(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=$k(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d);c[j>>2]=g+((c[k>>2]|0)-g>>2<<2);i=b;return l|0}function $k(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|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,u=0,v=0,w=0;m=i;c[f>>2]=b;c[j>>2]=g;g=c[f>>2]|0;do{if((l&4|0)==0){n=g}else{if((e-g|0)<=2){n=g;break}if(!((a[g]|0)==-17)){n=g;break}if(!((a[g+1|0]|0)==-69)){n=g;break}if(!((a[g+2|0]|0)==-65)){n=g;break}b=g+3|0;c[f>>2]=b;n=b}}while(0);a:do{if(n>>>0<e>>>0){g=e;l=n;b=c[j>>2]|0;while(1){if(!(b>>>0<h>>>0)){o=l;p=39;break a}q=a[l]|0;r=q&255;do{if(q<<24>>24>-1){if(r>>>0>k>>>0){s=2;break a}c[b>>2]=r;c[f>>2]=l+1}else{if((q&255)<194){s=2;break a}if((q&255)<224){if((g-l|0)<2){s=1;break a}t=d[l+1|0]|0;if((t&192|0)!=128){s=2;break a}u=t&63|r<<6&1984;if(u>>>0>k>>>0){s=2;break a}c[b>>2]=u;c[f>>2]=l+2;break}if((q&255)<240){if((g-l|0)<3){s=1;break a}u=a[l+1|0]|0;t=a[l+2|0]|0;if((r|0)==237){if(!((u&-32)<<24>>24==-128)){s=2;break a}}else if((r|0)==224){if(!((u&-32)<<24>>24==-96)){s=2;break a}}else{if(!((u&-64)<<24>>24==-128)){s=2;break a}}v=t&255;if((v&192|0)!=128){s=2;break a}t=(u&255)<<6&4032|r<<12&61440|v&63;if(t>>>0>k>>>0){s=2;break a}c[b>>2]=t;c[f>>2]=l+3;break}if(!((q&255)<245)){s=2;break a}if((g-l|0)<4){s=1;break a}t=a[l+1|0]|0;v=a[l+2|0]|0;u=a[l+3|0]|0;if((r|0)==240){if(!((t+112<<24>>24&255)<48)){s=2;break a}}else if((r|0)==244){if(!((t&-16)<<24>>24==-128)){s=2;break a}}else{if(!((t&-64)<<24>>24==-128)){s=2;break a}}w=v&255;if((w&192|0)!=128){s=2;break a}v=u&255;if((v&192|0)!=128){s=2;break a}u=(t&255)<<12&258048|r<<18&1835008|w<<6&4032|v&63;if(u>>>0>k>>>0){s=2;break a}c[b>>2]=u;c[f>>2]=l+4}}while(0);r=(c[j>>2]|0)+4|0;c[j>>2]=r;q=c[f>>2]|0;if(q>>>0<e>>>0){l=q;b=r}else{o=q;p=39;break}}}else{o=n;p=39}}while(0);if((p|0)==39){s=o>>>0<e>>>0|0}i=m;return s|0}function al(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function bl(a){a=a|0;i=i;return 0}function cl(a){a=a|0;i=i;return 0}function dl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=i;a=el(c,d,e,1114111,0)|0;i=b;return a|0}function el(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;do{if((g&4|0)==0){j=b}else{if((c-b|0)<=2){j=b;break}if(!((a[b]|0)==-17)){j=b;break}if(!((a[b+1|0]|0)==-69)){j=b;break}j=(a[b+2|0]|0)==-65?b+3|0:b}}while(0);a:do{if(j>>>0<c>>>0&(e|0)!=0){g=c;k=j;l=1;b:while(1){m=a[k]|0;n=m&255;do{if(m<<24>>24>-1){if(n>>>0>f>>>0){o=k;break a}p=k+1|0}else{if((m&255)<194){o=k;break a}if((m&255)<224){if((g-k|0)<2){o=k;break a}q=d[k+1|0]|0;if((q&192|0)!=128){o=k;break a}if((q&63|n<<6&1984)>>>0>f>>>0){o=k;break a}p=k+2|0;break}if((m&255)<240){r=k;if((g-r|0)<3){o=k;break a}q=a[k+1|0]|0;s=a[k+2|0]|0;if((n|0)==224){if(!((q&-32)<<24>>24==-96)){t=21;break b}}else if((n|0)==237){if(!((q&-32)<<24>>24==-128)){t=23;break b}}else{if(!((q&-64)<<24>>24==-128)){t=25;break b}}u=s&255;if((u&192|0)!=128){o=k;break a}if(((q&255)<<6&4032|n<<12&61440|u&63)>>>0>f>>>0){o=k;break a}p=k+3|0;break}if(!((m&255)<245)){o=k;break a}v=k;if((g-v|0)<4){o=k;break a}u=a[k+1|0]|0;q=a[k+2|0]|0;s=a[k+3|0]|0;if((n|0)==244){if(!((u&-16)<<24>>24==-128)){t=35;break b}}else if((n|0)==240){if(!((u+112<<24>>24&255)<48)){t=33;break b}}else{if(!((u&-64)<<24>>24==-128)){t=37;break b}}w=q&255;if((w&192|0)!=128){o=k;break a}q=s&255;if((q&192|0)!=128){o=k;break a}if(((u&255)<<12&258048|n<<18&1835008|w<<6&4032|q&63)>>>0>f>>>0){o=k;break a}p=k+4|0}}while(0);if(!(p>>>0<c>>>0&l>>>0<e>>>0)){o=p;break a}k=p;l=l+1|0}if((t|0)==21){x=r-b|0;i=h;return x|0}else if((t|0)==23){x=r-b|0;i=h;return x|0}else if((t|0)==25){x=r-b|0;i=h;return x|0}else if((t|0)==33){x=v-b|0;i=h;return x|0}else if((t|0)==35){x=v-b|0;i=h;return x|0}else if((t|0)==37){x=v-b|0;i=h;return x|0}}else{o=j}}while(0);x=o-b|0;i=h;return x|0}function fl(a){a=a|0;i=i;return 4}function gl(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function hl(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function il(a){a=a|0;var b=0;b=i;c[a>>2]=7472;ve(a+12|0);Om(a);i=b;return}function jl(a){a=a|0;var b=0;b=i;c[a>>2]=7472;ve(a+12|0);i=b;return}function kl(a){a=a|0;var b=0;b=i;c[a>>2]=7512;ve(a+16|0);Om(a);i=b;return}function ll(a){a=a|0;var b=0;b=i;c[a>>2]=7512;ve(a+16|0);i=b;return}function ml(b){b=b|0;i=i;return a[b+8|0]|0}function nl(a){a=a|0;i=i;return c[a+8>>2]|0}function ol(b){b=b|0;i=i;return a[b+9|0]|0}function pl(a){a=a|0;i=i;return c[a+12>>2]|0}function ql(a,b){a=a|0;b=b|0;var c=0;c=i;se(a,b+12|0);i=c;return}function rl(a,b){a=a|0;b=b|0;var c=0;c=i;se(a,b+16|0);i=c;return}function sl(a,b){a=a|0;b=b|0;b=i;te(a,7544,4);i=b;return}function tl(a,b){a=a|0;b=b|0;b=i;Ee(a,7552,hm(7552)|0);i=b;return}function ul(a,b){a=a|0;b=b|0;b=i;te(a,7576,5);i=b;return}function vl(a,b){a=a|0;b=b|0;b=i;Ee(a,7584,hm(7584)|0);i=b;return}function wl(b){b=b|0;var d=0;b=i;if((a[7616]|0)!=0){d=c[1902]|0;i=b;return d|0}if((Ma(7616)|0)==0){d=c[1902]|0;i=b;return d|0}do{if((a[14816]|0)==0){if((Ma(14816)|0)==0){break}cn(14648,0,168)|0;Zb(117,0,p|0)|0;Za(14816)}}while(0);we(14648,14824)|0;we(14660|0,14832)|0;we(14672|0,14840)|0;we(14684|0,14848)|0;we(14696|0,14864)|0;we(14708|0,14880)|0;we(14720|0,14888)|0;we(14732|0,14904)|0;we(14744|0,14912)|0;we(14756|0,14920)|0;we(14768|0,14928)|0;we(14780|0,14936)|0;we(14792|0,14944)|0;we(14804|0,14952)|0;c[1902]=14648;Za(7616);d=c[1902]|0;i=b;return d|0}function xl(b){b=b|0;var d=0;b=i;if((a[7632]|0)!=0){d=c[1906]|0;i=b;return d|0}if((Ma(7632)|0)==0){d=c[1906]|0;i=b;return d|0}do{if((a[14280]|0)==0){if((Ma(14280)|0)==0){break}cn(14112,0,168)|0;Zb(118,0,p|0)|0;Za(14280)}}while(0);He(14112,14288)|0;He(14124|0,14320)|0;He(14136|0,14352)|0;He(14148|0,14384)|0;He(14160|0,14424)|0;He(14172|0,14464)|0;He(14184|0,14496)|0;He(14196|0,14536)|0;He(14208|0,14552)|0;He(14220|0,14568)|0;He(14232|0,14584)|0;He(14244|0,14600)|0;He(14256|0,14616)|0;He(14268|0,14632)|0;c[1906]=14112;Za(7632);d=c[1906]|0;i=b;return d|0}function yl(b){b=b|0;var d=0;b=i;if((a[7648]|0)!=0){d=c[1910]|0;i=b;return d|0}if((Ma(7648)|0)==0){d=c[1910]|0;i=b;return d|0}do{if((a[13888]|0)==0){if((Ma(13888)|0)==0){break}cn(13600,0,288)|0;Zb(119,0,p|0)|0;Za(13888)}}while(0);we(13600,13896)|0;we(13612|0,13904)|0;we(13624|0,13920)|0;we(13636|0,13928)|0;we(13648|0,13936)|0;we(13660|0,13944)|0;we(13672|0,13952)|0;we(13684|0,13960)|0;we(13696|0,13968)|0;we(13708|0,13984)|0;we(13720|0,13992)|0;we(13732|0,14008)|0;we(13744|0,14024)|0;we(13756|0,14032)|0;we(13768|0,14040)|0;we(13780|0,14048)|0;we(13792|0,13936)|0;we(13804|0,14056)|0;we(13816|0,14064)|0;we(13828|0,14072)|0;we(13840|0,14080)|0;we(13852|0,14088)|0;we(13864|0,14096)|0;we(13876|0,14104)|0;c[1910]=13600;Za(7648);d=c[1910]|0;i=b;return d|0}function zl(b){b=b|0;var d=0;b=i;if((a[7664]|0)!=0){d=c[1914]|0;i=b;return d|0}if((Ma(7664)|0)==0){d=c[1914]|0;i=b;return d|0}do{if((a[13048]|0)==0){if((Ma(13048)|0)==0){break}cn(12760,0,288)|0;Zb(120,0,p|0)|0;Za(13048)}}while(0);He(12760,13056)|0;He(12772|0,13088)|0;He(12784|0,13128)|0;He(12796|0,13152)|0;He(12808|0,13472)|0;He(12820|0,13176)|0;He(12832|0,13200)|0;He(12844|0,13224)|0;He(12856|0,13256)|0;He(12868|0,13296)|0;He(12880|0,13328)|0;He(12892|0,13368)|0;He(12904|0,13408)|0;He(12916|0,13424)|0;He(12928|0,13440)|0;He(12940|0,13456)|0;He(12952|0,13472)|0;He(12964|0,13488)|0;He(12976|0,13504)|0;He(12988|0,13520)|0;He(13e3|0,13536)|0;He(13012|0,13552)|0;He(13024|0,13568)|0;He(13036|0,13584)|0;c[1914]=12760;Za(7664);d=c[1914]|0;i=b;return d|0}function Al(b){b=b|0;var d=0;b=i;if((a[7680]|0)!=0){d=c[1918]|0;i=b;return d|0}if((Ma(7680)|0)==0){d=c[1918]|0;i=b;return d|0}do{if((a[12736]|0)==0){if((Ma(12736)|0)==0){break}cn(12448,0,288)|0;Zb(121,0,p|0)|0;Za(12736)}}while(0);we(12448,12744)|0;we(12460|0,12752)|0;c[1918]=12448;Za(7680);d=c[1918]|0;i=b;return d|0}function Bl(b){b=b|0;var d=0;b=i;if((a[7696]|0)!=0){d=c[1922]|0;i=b;return d|0}if((Ma(7696)|0)==0){d=c[1922]|0;i=b;return d|0}do{if((a[12408]|0)==0){if((Ma(12408)|0)==0){break}cn(12120,0,288)|0;Zb(122,0,p|0)|0;Za(12408)}}while(0);He(12120,12416)|0;He(12132|0,12432)|0;c[1922]=12120;Za(7696);d=c[1922]|0;i=b;return d|0}function Cl(b){b=b|0;b=i;do{if((a[7720]|0)==0){if((Ma(7720)|0)==0){break}te(7704,7728,8);Zb(123,7704,p|0)|0;Za(7720)}}while(0);i=b;return 7704}function Dl(b){b=b|0;b=i;if((a[7760]|0)!=0){i=b;return 7744}if((Ma(7760)|0)==0){i=b;return 7744}Ee(7744,7768,hm(7768)|0);Zb(124,7744,p|0)|0;Za(7760);i=b;return 7744}function El(b){b=b|0;b=i;do{if((a[7824]|0)==0){if((Ma(7824)|0)==0){break}te(7808,7832,8);Zb(123,7808,p|0)|0;Za(7824)}}while(0);i=b;return 7808}function Fl(b){b=b|0;b=i;if((a[7864]|0)!=0){i=b;return 7848}if((Ma(7864)|0)==0){i=b;return 7848}Ee(7848,7872,hm(7872)|0);Zb(124,7848,p|0)|0;Za(7864);i=b;return 7848}function Gl(b){b=b|0;b=i;do{if((a[7928]|0)==0){if((Ma(7928)|0)==0){break}te(7912,7936,20);Zb(123,7912,p|0)|0;Za(7928)}}while(0);i=b;return 7912}function Hl(b){b=b|0;b=i;if((a[7976]|0)!=0){i=b;return 7960}if((Ma(7976)|0)==0){i=b;return 7960}Ee(7960,7984,hm(7984)|0);Zb(124,7960,p|0)|0;Za(7976);i=b;return 7960}function Il(b){b=b|0;b=i;do{if((a[8088]|0)==0){if((Ma(8088)|0)==0){break}te(8072,8096,11);Zb(123,8072,p|0)|0;Za(8088)}}while(0);i=b;return 8072}function Jl(b){b=b|0;b=i;if((a[8128]|0)!=0){i=b;return 8112}if((Ma(8128)|0)==0){i=b;return 8112}Ee(8112,8136,hm(8136)|0);Zb(124,8112,p|0)|0;Za(8128);i=b;return 8112}function Kl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=Hb()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);l=+an(b,g,c[1798]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)!=34){h=l;i=f;return+h}c[e>>2]=4;h=l;i=f;return+h}function Ll(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=Hb()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);l=+an(b,g,c[1798]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)!=34){h=l;i=f;return+h}c[e>>2]=4;h=l;i=f;return+h}function Ml(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=Hb()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);l=+an(b,g,c[1798]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)==34){c[e>>2]=4}h=l;i=f;return+h}function Nl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+8|0;h=g;do{if((b|0)==(d|0)){c[e>>2]=4;j=0;k=0}else{if((a[b]|0)==45){c[e>>2]=4;j=0;k=0;break}l=Hb()|0;m=c[l>>2]|0;c[l>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);n=sb(b|0,h|0,f|0,c[1798]|0)|0;o=c[l>>2]|0;if((o|0)==0){c[l>>2]=m}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;k=0;break}if((o|0)!=34){j=n;k=I;break}c[e>>2]=4;j=-1;k=-1}}while(0);I=k;i=g;return j|0}function Ol(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=Hb()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);m=sb(b|0,h|0,f|0,c[1798]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>4294967295)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m;i=g;return j|0}return 0}function Pl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=Hb()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);m=sb(b|0,h|0,f|0,c[1798]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>4294967295)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m;i=g;return j|0}return 0}function Ql(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=Hb()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);m=sb(b|0,h|0,f|0,c[1798]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>65535)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m&65535;i=g;return j|0}return 0}function Rl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;k=0;I=k;i=g;return j|0}l=Hb()|0;m=c[l>>2]|0;c[l>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);n=Ha(b|0,h|0,f|0,c[1798]|0)|0;f=I;b=c[l>>2]|0;if((b|0)==0){c[l>>2]=m}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;k=0;I=k;i=g;return j|0}if((b|0)==34){c[e>>2]=4;e=(f|0)>0|(f|0)==0&n>>>0>0;I=e?2147483647:-2147483648;i=g;return(e?-1:0)|0}else{j=n;k=f;I=k;i=g;return j|0}return 0}function Sl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}k=Hb()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);m=Ha(b|0,h|0,f|0,c[1798]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}do{if((b|0)==34){c[e>>2]=4;if((f|0)>0|(f|0)==0&m>>>0>0){j=2147483647}else{break}i=g;return j|0}else{if((f|0)<-1|(f|0)==-1&m>>>0<2147483648){c[e>>2]=4;break}if((f|0)>0|(f|0)==0&m>>>0>2147483647){c[e>>2]=4;j=2147483647;i=g;return j|0}else{j=m;i=g;return j|0}}}while(0);j=-2147483648;i=g;return j|0}function Tl(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=i;e=a+4|0;f=e;g=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24;f=e+4|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24;f=(c[a>>2]|0)+(e>>1)|0;a=f;if((e&1|0)==0){h=g;hc[h&127](a);i=b;return}else{h=c[(c[f>>2]|0)+g>>2]|0;hc[h&127](a);i=b;return}}function Ul(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=b+8|0;g=b+4|0;h=c[g>>2]|0;j=c[f>>2]|0;k=h;if(!(j-k>>2>>>0<d>>>0)){l=d;m=h;do{if((m|0)==0){n=0}else{c[m>>2]=0;n=c[g>>2]|0}m=n+4|0;c[g>>2]=m;l=l+ -1|0;}while((l|0)!=0);i=e;return}l=b+16|0;m=b;n=c[m>>2]|0;h=k-n>>2;k=h+d|0;if(k>>>0>1073741823){Oj(0)}o=j-n|0;do{if(o>>2>>>0<536870911){n=o>>1;j=n>>>0<k>>>0?k:n;if((j|0)==0){p=0;q=0;break}n=b+128|0;if(!((a[n]|0)==0&j>>>0<29)){r=j;s=11;break}a[n]=1;p=j;q=l}else{r=1073741823;s=11}}while(0);if((s|0)==11){p=r;q=Mm(r<<2)|0}r=d;d=q+(h<<2)|0;do{if((d|0)==0){t=0}else{c[d>>2]=0;t=d}d=t+4|0;r=r+ -1|0;}while((r|0)!=0);r=c[m>>2]|0;t=(c[g>>2]|0)-r|0;s=q+(h-(t>>2)<<2)|0;h=r;fn(s|0,h|0,t|0)|0;c[m>>2]=s;c[g>>2]=d;c[f>>2]=q+(p<<2);if((r|0)==0){i=e;return}if((l|0)==(r|0)){a[b+128|0]=0;i=e;return}else{Om(h);i=e;return}}function Vl(a){a=a|0;a=i;Ge(12396|0);Ge(12384|0);Ge(12372|0);Ge(12360|0);Ge(12348|0);Ge(12336|0);Ge(12324|0);Ge(12312|0);Ge(12300|0);Ge(12288|0);Ge(12276|0);Ge(12264|0);Ge(12252|0);Ge(12240|0);Ge(12228|0);Ge(12216|0);Ge(12204|0);Ge(12192|0);Ge(12180|0);Ge(12168|0);Ge(12156|0);Ge(12144|0);Ge(12132|0);Ge(12120);i=a;return}function Wl(a){a=a|0;a=i;ve(12724|0);ve(12712|0);ve(12700|0);ve(12688|0);ve(12676|0);ve(12664|0);ve(12652|0);ve(12640|0);ve(12628|0);ve(12616|0);ve(12604|0);ve(12592|0);ve(12580|0);ve(12568|0);ve(12556|0);ve(12544|0);ve(12532|0);ve(12520|0);ve(12508|0);ve(12496|0);ve(12484|0);ve(12472|0);ve(12460|0);ve(12448);i=a;return}function Xl(a){a=a|0;a=i;Ge(13036|0);Ge(13024|0);Ge(13012|0);Ge(13e3|0);Ge(12988|0);Ge(12976|0);Ge(12964|0);Ge(12952|0);Ge(12940|0);Ge(12928|0);Ge(12916|0);Ge(12904|0);Ge(12892|0);Ge(12880|0);Ge(12868|0);Ge(12856|0);Ge(12844|0);Ge(12832|0);Ge(12820|0);Ge(12808|0);Ge(12796|0);Ge(12784|0);Ge(12772|0);Ge(12760);i=a;return}function Yl(a){a=a|0;a=i;ve(13876|0);ve(13864|0);ve(13852|0);ve(13840|0);ve(13828|0);ve(13816|0);ve(13804|0);ve(13792|0);ve(13780|0);ve(13768|0);ve(13756|0);ve(13744|0);ve(13732|0);ve(13720|0);ve(13708|0);ve(13696|0);ve(13684|0);ve(13672|0);ve(13660|0);ve(13648|0);ve(13636|0);ve(13624|0);ve(13612|0);ve(13600);i=a;return}function Zl(a){a=a|0;a=i;Ge(14268|0);Ge(14256|0);Ge(14244|0);Ge(14232|0);Ge(14220|0);Ge(14208|0);Ge(14196|0);Ge(14184|0);Ge(14172|0);Ge(14160|0);Ge(14148|0);Ge(14136|0);Ge(14124|0);Ge(14112);i=a;return}function _l(a){a=a|0;a=i;ve(14804|0);ve(14792|0);ve(14780|0);ve(14768|0);ve(14756|0);ve(14744|0);ve(14732|0);ve(14720|0);ve(14708|0);ve(14696|0);ve(14684|0);ve(14672|0);ve(14660|0);ve(14648);i=a;return}function $l(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=am(0,a,b,(c|0)!=0?c:15168)|0;i=d;return e|0}function am(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;g=i;i=i+8|0;h=g;c[h>>2]=b;j=(f|0)==0?15176:f;f=c[j>>2]|0;a:do{if((d|0)==0){if((f|0)==0){k=0}else{break}i=g;return k|0}else{if((b|0)==0){l=h;c[h>>2]=l;m=l}else{m=b}if((e|0)==0){k=-2;i=g;return k|0}do{if((f|0)==0){l=a[d]|0;n=l&255;if(l<<24>>24>-1){c[m>>2]=n;k=l<<24>>24!=0|0;i=g;return k|0}else{l=n+ -194|0;if(l>>>0>50){break a}o=e+ -1|0;p=c[14960+(l<<2)>>2]|0;q=d+1|0;break}}else{o=e;p=f;q=d}}while(0);b:do{if((o|0)==0){r=p}else{l=a[q]|0;n=(l&255)>>>3;if((n+ -16|n+(p>>26))>>>0>7){break a}else{s=o;t=l;u=p;v=q}while(1){v=v+1|0;u=(t&255)+ -128|u<<6;s=s+ -1|0;if((u|0)>=0){break}if((s|0)==0){r=u;break b}t=a[v]|0;if(((t&255)+ -128|0)>>>0>63){break a}}c[j>>2]=0;c[m>>2]=u;k=e-s|0;i=g;return k|0}}while(0);c[j>>2]=r;k=-2;i=g;return k|0}}while(0);c[j>>2]=0;c[(Hb()|0)>>2]=84;k=-1;i=g;return k|0}function bm(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,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;g=i;i=i+1032|0;h=g+1024|0;j=c[b>>2]|0;c[h>>2]=j;k=(a|0)!=0;l=g;m=k?e:256;e=k?a:l;a:do{if((j|0)==0|(m|0)==0){n=d;o=m;p=j;q=0;r=e}else{a=d;s=m;t=j;u=0;v=e;while(1){w=a>>>2;x=w>>>0>=s>>>0;if(!(x|a>>>0>131)){n=a;o=s;p=t;q=u;r=v;break a}y=x?s:w;z=a-y|0;w=cm(v,h,y,f)|0;if((w|0)==-1){break}if((v|0)==(l|0)){A=s;B=l}else{A=s-w|0;B=v+(w<<2)|0}y=w+u|0;w=c[h>>2]|0;if((w|0)==0|(A|0)==0){n=z;o=A;p=w;q=y;r=B;break a}else{a=z;s=A;t=w;u=y;v=B}}n=z;o=0;p=c[h>>2]|0;q=-1;r=v}}while(0);b:do{if((p|0)==0){C=q}else{if((o|0)==0|(n|0)==0){C=q;break}else{D=n;E=o;F=p;G=q;H=r}while(1){I=am(H,F,D,f)|0;if((I+2|0)>>>0<3){break}z=(c[h>>2]|0)+I|0;c[h>>2]=z;B=E+ -1|0;A=G+1|0;if((B|0)==0|(D|0)==(I|0)){C=A;break b}else{D=D-I|0;E=B;F=z;G=A;H=H+4|0}}if((I|0)==-1){C=-1;break}else if((I|0)==0){c[h>>2]=0;C=G;break}else{c[f>>2]=0;C=G;break}}}while(0);if(!k){i=g;return C|0}c[b>>2]=c[h>>2];i=g;return C|0}function cm(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=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,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;h=i;j=c[e>>2]|0;do{if((g|0)==0){k=5}else{l=g;m=c[l>>2]|0;if((m|0)==0){k=5;break}if((b|0)==0){n=f;o=m;p=j;k=16;break}c[l>>2]=0;q=b;r=f;s=m;t=j;k=36}}while(0);if((k|0)==5){if((b|0)==0){u=f;v=j;k=7}else{w=b;x=f;y=j;k=6}}a:while(1){if((k|0)==6){k=0;if((x|0)==0){z=f;k=53;break}else{A=w;B=x;C=y}while(1){j=a[C]|0;do{if(((j&255)+ -1|0)>>>0<127){if((C&3|0)==0&B>>>0>3){D=A;E=B;F=C}else{G=A;H=B;I=j;J=C;break}while(1){K=c[F>>2]|0;if(((K+ -16843009|K)&-2139062144|0)!=0){k=30;break}c[D>>2]=K&255;c[D+4>>2]=d[F+1|0]|0;c[D+8>>2]=d[F+2|0]|0;L=F+4|0;M=D+16|0;c[D+12>>2]=d[F+3|0]|0;N=E+ -4|0;if(N>>>0>3){D=M;E=N;F=L}else{k=31;break}}if((k|0)==30){k=0;G=D;H=E;I=K&255;J=F;break}else if((k|0)==31){k=0;G=M;H=N;I=a[L]|0;J=L;break}}else{G=A;H=B;I=j;J=C}}while(0);O=I&255;if(!((O+ -1|0)>>>0<127)){break}c[G>>2]=O;j=H+ -1|0;if((j|0)==0){z=f;k=53;break a}else{A=G+4|0;B=j;C=J+1|0}}j=O+ -194|0;if(j>>>0>50){P=G;Q=H;R=J;k=47;break}q=G;r=H;s=c[14960+(j<<2)>>2]|0;t=J+1|0;k=36;continue}else if((k|0)==7){k=0;j=a[v]|0;do{if(((j&255)+ -1|0)>>>0<127){if((v&3|0)!=0){S=u;T=j;U=v;break}g=c[v>>2]|0;if(((g+ -16843009|g)&-2139062144|0)==0){m=u;l=v;while(1){V=l+4|0;W=m+ -4|0;X=c[V>>2]|0;if(((X+ -16843009|X)&-2139062144|0)==0){l=V;m=W}else{Y=W;Z=X;_=V;break}}}else{Y=u;Z=g;_=v}S=Y;T=Z&255;U=_}else{S=u;T=j;U=v}}while(0);j=T&255;if((j+ -1|0)>>>0<127){u=S+ -1|0;v=U+1|0;k=7;continue}m=j+ -194|0;if(m>>>0>50){P=b;Q=S;R=U;k=47;break}n=S;o=c[14960+(m<<2)>>2]|0;p=U+1|0;k=16;continue}else if((k|0)==16){k=0;m=(d[p]|0)>>>3;if((m+ -16|m+(o>>26))>>>0>7){k=17;break}m=p+1|0;do{if((o&33554432|0)==0){$=m}else{if(((d[m]|0)+ -128|0)>>>0>63){k=20;break a}j=p+2|0;if((o&524288|0)==0){$=j;break}if(((d[j]|0)+ -128|0)>>>0>63){k=23;break a}$=p+3|0}}while(0);u=n+ -1|0;v=$;k=7;continue}else if((k|0)==36){k=0;m=d[t]|0;j=m>>>3;if((j+ -16|j+(s>>26))>>>0>7){k=37;break}j=t+1|0;aa=m+ -128|s<<6;do{if((aa|0)<0){m=(d[j]|0)+ -128|0;if(m>>>0>63){k=40;break a}l=t+2|0;ba=m|aa<<6;if((ba|0)>=0){ca=ba;da=l;break}m=(d[l]|0)+ -128|0;if(m>>>0>63){k=43;break a}ca=m|ba<<6;da=t+3|0}else{ca=aa;da=j}}while(0);c[q>>2]=ca;w=q+4|0;x=r+ -1|0;y=da;k=6;continue}}if((k|0)==17){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==20){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==23){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==37){ea=q;fa=r;ga=s;ha=t+ -1|0;k=46}else if((k|0)==40){ea=q;fa=r;ga=aa;ha=t+ -1|0;k=46}else if((k|0)==43){ea=q;fa=r;ga=ba;ha=t+ -1|0;k=46}else if((k|0)==53){i=h;return z|0}if((k|0)==46){if((ga|0)==0){P=ea;Q=fa;R=ha;k=47}else{ia=ea;ja=ha}}do{if((k|0)==47){if((a[R]|0)!=0){ia=P;ja=R;break}if((P|0)!=0){c[P>>2]=0;c[e>>2]=0}z=f-Q|0;i=h;return z|0}}while(0);c[(Hb()|0)>>2]=84;if((ia|0)==0){z=-1;i=h;return z|0}c[e>>2]=ja;z=-1;i=h;return z|0}function dm(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g;c[h>>2]=b;if((e|0)==0){j=0;i=g;return j|0}do{if((f|0)!=0){if((b|0)==0){k=h;c[h>>2]=k;l=k}else{l=b}k=a[e]|0;m=k&255;if(k<<24>>24>-1){c[l>>2]=m;j=k<<24>>24!=0|0;i=g;return j|0}k=m+ -194|0;if(k>>>0>50){break}m=e+1|0;n=c[14960+(k<<2)>>2]|0;if(f>>>0<4){if((n&-2147483648>>>((f*6|0)+ -6|0)|0)!=0){break}}k=d[m]|0;m=k>>>3;if((m+ -16|m+(n>>26))>>>0>7){break}m=k+ -128|n<<6;if((m|0)>=0){c[l>>2]=m;j=2;i=g;return j|0}n=(d[e+2|0]|0)+ -128|0;if(n>>>0>63){break}k=n|m<<6;if((k|0)>=0){c[l>>2]=k;j=3;i=g;return j|0}m=(d[e+3|0]|0)+ -128|0;if(m>>>0>63){break}c[l>>2]=m|k<<6;j=4;i=g;return j|0}}while(0);c[(Hb()|0)>>2]=84;j=-1;i=g;return j|0}function em(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((b|0)==0){f=1;i=e;return f|0}if(d>>>0<128){a[b]=d;f=1;i=e;return f|0}if(d>>>0<2048){a[b]=d>>>6|192;a[b+1|0]=d&63|128;f=2;i=e;return f|0}if(d>>>0<55296|(d+ -57344|0)>>>0<8192){a[b]=d>>>12|224;a[b+1|0]=d>>>6&63|128;a[b+2|0]=d&63|128;f=3;i=e;return f|0}if((d+ -65536|0)>>>0<1048576){a[b]=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;f=4;i=e;return f|0}else{c[(Hb()|0)>>2]=84;f=-1;i=e;return f|0}return 0}function fm(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,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;f=i;i=i+264|0;g=f+256|0;h=f;j=c[b>>2]|0;c[g>>2]=j;k=(a|0)!=0;l=k?e:256;e=k?a:h;a:do{if((j|0)==0|(l|0)==0){m=d;n=l;o=j;p=0;q=e}else{a=d;r=l;s=j;t=0;u=e;while(1){v=a>>>0>=r>>>0;if(!(v|a>>>0>32)){m=a;n=r;o=s;p=t;q=u;break a}w=v?r:a;x=a-w|0;v=gm(u,g,w,0)|0;if((v|0)==-1){break}if((u|0)==(h|0)){y=r;z=h}else{y=r-v|0;z=u+v|0}w=v+t|0;v=c[g>>2]|0;if((v|0)==0|(y|0)==0){m=x;n=y;o=v;p=w;q=z;break a}else{a=x;r=y;s=v;t=w;u=z}}m=x;n=0;o=c[g>>2]|0;p=-1;q=u}}while(0);b:do{if((o|0)==0){A=p}else{if((n|0)==0|(m|0)==0){A=p;break}else{B=m;C=n;D=o;E=p;F=q}while(1){G=em(F,c[D>>2]|0,0)|0;if((G+1|0)>>>0<2){break}x=(c[g>>2]|0)+4|0;c[g>>2]=x;z=B+ -1|0;y=E+1|0;if((C|0)==(G|0)|(z|0)==0){A=y;break b}else{B=z;C=C-G|0;D=x;E=y;F=F+G|0}}if((G|0)!=0){A=-1;break}c[g>>2]=0;A=E}}while(0);if(!k){i=f;return A|0}c[b>>2]=c[g>>2];i=f;return A|0}function gm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;f=i;i=i+8|0;g=f;if((b|0)==0){h=c[d>>2]|0;j=g;k=c[h>>2]|0;if((k|0)==0){l=0;i=f;return l|0}else{m=0;n=k;o=h}while(1){if(n>>>0>127){h=em(j,n,0)|0;if((h|0)==-1){l=-1;p=26;break}else{q=h}}else{q=1}h=q+m|0;k=o+4|0;r=c[k>>2]|0;if((r|0)==0){l=h;p=26;break}else{m=h;n=r;o=k}}if((p|0)==26){i=f;return l|0}}a:do{if(e>>>0>3){o=b;n=e;m=c[d>>2]|0;while(1){q=c[m>>2]|0;if((q|0)==0){s=o;t=n;break a}if(q>>>0>127){j=em(o,q,0)|0;if((j|0)==-1){l=-1;break}u=o+j|0;v=n-j|0;w=m}else{a[o]=q;u=o+1|0;v=n+ -1|0;w=c[d>>2]|0}q=w+4|0;c[d>>2]=q;if(v>>>0>3){o=u;n=v;m=q}else{s=u;t=v;break a}}i=f;return l|0}else{s=b;t=e}}while(0);b:do{if((t|0)==0){x=0}else{b=g;v=s;u=t;w=c[d>>2]|0;while(1){m=c[w>>2]|0;if((m|0)==0){p=24;break}if(m>>>0>127){n=em(b,m,0)|0;if((n|0)==-1){l=-1;p=26;break}if(n>>>0>u>>>0){p=20;break}em(v,c[w>>2]|0,0)|0;y=v+n|0;z=u-n|0;A=w}else{a[v]=m;y=v+1|0;z=u+ -1|0;A=c[d>>2]|0}m=A+4|0;c[d>>2]=m;if((z|0)==0){x=0;break b}else{v=y;u=z;w=m}}if((p|0)==20){l=e-u|0;i=f;return l|0}else if((p|0)==24){a[v]=0;x=u;break}else if((p|0)==26){i=f;return l|0}}}while(0);c[d>>2]=0;l=e-x|0;i=f;return l|0}function hm(a){a=a|0;var b=0,d=0;b=i;d=a;while(1){if((c[d>>2]|0)==0){break}else{d=d+4|0}}i=b;return d-a>>2|0}function im(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==0){i=e;return a|0}else{f=d;g=b;h=a}while(1){b=f+ -1|0;c[h>>2]=c[g>>2];if((b|0)==0){break}else{h=h+4|0;g=g+4|0;f=b}}i=e;return a|0}function jm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=(d|0)==0;do{if(a-b>>2>>>0<d>>>0){if(f){break}else{g=d}do{g=g+ -1|0;c[a+(g<<2)>>2]=c[b+(g<<2)>>2];}while((g|0)!=0)}else{if(f){break}else{h=b;j=a;k=d}while(1){l=k+ -1|0;c[j>>2]=c[h>>2];if((l|0)==0){break}else{k=l;j=j+4|0;h=h+4|0}}}}while(0);i=e;return a|0}function km(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)!=0){f=d;d=a;while(1){g=f+ -1|0;c[d>>2]=b;if((g|0)==0){break}else{d=d+4|0;f=g}}}i=e;return a|0}function lm(a){a=a|0;i=i;return}function mm(a){a=a|0;c[a>>2]=15192;i=i;return}function nm(a){a=a|0;var b=0;b=i;Kb(a|0);Om(a);i=b;return}function om(a){a=a|0;var b=0;b=i;Kb(a|0);i=b;return}function pm(a){a=a|0;i=i;return 15208}function qm(a){a=a|0;i=i;return}function rm(a){a=a|0;i=i;return}function sm(a){a=a|0;i=i;return}function tm(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function um(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function vm(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+56|0;f=e;if((a|0)==(b|0)){g=1;i=e;return g|0}if((b|0)==0){g=0;i=e;return g|0}h=Am(b,15320,15376,0)|0;b=h;if((h|0)==0){g=0;i=e;return g|0}j=f+0|0;k=j+56|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[f>>2]=b;c[f+8>>2]=a;c[f+12>>2]=-1;c[f+48>>2]=1;vc[c[(c[h>>2]|0)+28>>2]&7](b,f,c[d>>2]|0,1);if((c[f+24>>2]|0)!=1){g=0;i=e;return g|0}c[d>>2]=c[f+16>>2];g=1;i=e;return g|0}function xm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[d+8>>2]|0)!=(b|0)){i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function ym(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((b|0)!=(c[d+8>>2]|0)){h=c[b+8>>2]|0;vc[c[(c[h>>2]|0)+28>>2]&7](h,d,e,f);i=g;return}h=d+16|0;b=c[h>>2]|0;if((b|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function zm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;if((b|0)==(c[d+8>>2]|0)){h=d+16|0;j=c[h>>2]|0;if((j|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((j|0)!=(e|0)){j=d+36|0;c[j>>2]=(c[j>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}j=d+24|0;if((c[j>>2]|0)!=2){i=g;return}c[j>>2]=f;i=g;return}j=c[b+12>>2]|0;h=b+(j<<3)+16|0;k=c[b+20>>2]|0;l=k>>8;if((k&1|0)==0){m=l}else{m=c[(c[e>>2]|0)+l>>2]|0}l=c[b+16>>2]|0;vc[c[(c[l>>2]|0)+28>>2]&7](l,d,e+m|0,(k&2|0)!=0?f:2);if((j|0)<=1){i=g;return}j=d+54|0;k=e;m=b+24|0;while(1){b=c[m+4>>2]|0;l=b>>8;if((b&1|0)==0){n=l}else{n=c[(c[k>>2]|0)+l>>2]|0}l=c[m>>2]|0;vc[c[(c[l>>2]|0)+28>>2]&7](l,d,e+n|0,(b&2|0)!=0?f:2);if((a[j]|0)!=0){o=16;break}b=m+8|0;if(b>>>0<h>>>0){m=b}else{o=16;break}}if((o|0)==16){i=g;return}}function Am(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+56|0;j=h;k=c[d>>2]|0;l=d+(c[k+ -8>>2]|0)|0;m=c[k+ -4>>2]|0;k=m;c[j>>2]=f;c[j+4>>2]=d;c[j+8>>2]=e;c[j+12>>2]=g;g=j+16|0;e=j+20|0;d=j+24|0;n=j+28|0;o=j+32|0;p=j+40|0;q=(m|0)==(f|0);f=g;r=f+0|0;s=r+36|0;do{c[r>>2]=0;r=r+4|0}while((r|0)<(s|0));b[f+36>>1]=0;a[f+38|0]=0;if(q){c[j+48>>2]=1;sc[c[(c[m>>2]|0)+20>>2]&15](k,j,l,l,1,0);t=(c[d>>2]|0)==1?l:0;i=h;return t|0}gc[c[(c[m>>2]|0)+24>>2]&3](k,j,l,1,0);l=c[j+36>>2]|0;if((l|0)==0){if((c[p>>2]|0)!=1){t=0;i=h;return t|0}if((c[n>>2]|0)!=1){t=0;i=h;return t|0}t=(c[o>>2]|0)==1?c[e>>2]|0:0;i=h;return t|0}else if((l|0)==1){do{if((c[d>>2]|0)!=1){if((c[p>>2]|0)!=0){t=0;i=h;return t|0}if((c[n>>2]|0)!=1){t=0;i=h;return t|0}if((c[o>>2]|0)==1){break}else{t=0}i=h;return t|0}}while(0);t=c[g>>2]|0;i=h;return t|0}else{t=0;i=h;return t|0}return 0}function Bm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;j=b;if((j|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}k=d+28|0;if((c[k>>2]|0)==1){i=h;return}c[k>>2]=f;i=h;return}if((j|0)==(c[d>>2]|0)){do{if((c[d+16>>2]|0)!=(e|0)){j=d+20|0;if((c[j>>2]|0)==(e|0)){break}c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=c[b+12>>2]|0;m=b+(l<<3)+16|0;a:do{if((l|0)>0){n=d+52|0;o=d+53|0;p=d+54|0;q=b+8|0;r=d+24|0;s=e;t=0;u=0;v=b+16|0;b:while(1){a[n]=0;a[o]=0;w=c[v+4>>2]|0;x=w>>8;if((w&1|0)==0){y=x}else{y=c[(c[s>>2]|0)+x>>2]|0}x=c[v>>2]|0;sc[c[(c[x>>2]|0)+20>>2]&15](x,d,e,e+y|0,2-(w>>>1&1)|0,g);if((a[p]|0)!=0){z=t;A=u;break}do{if((a[o]|0)==0){B=t;C=u}else{if((a[n]|0)==0){if((c[q>>2]&1|0)==0){z=t;A=1;break b}else{B=t;C=1;break}}if((c[r>>2]|0)==1){D=27;break a}if((c[q>>2]&2|0)==0){D=27;break a}else{B=1;C=1}}}while(0);w=v+8|0;if(w>>>0<m>>>0){t=B;u=C;v=w}else{z=B;A=C;break}}if(z){E=A;D=26}else{F=A;D=23}}else{F=0;D=23}}while(0);do{if((D|0)==23){c[j>>2]=e;m=d+40|0;c[m>>2]=(c[m>>2]|0)+1;if((c[d+36>>2]|0)!=1){E=F;D=26;break}if((c[d+24>>2]|0)!=2){E=F;D=26;break}a[d+54|0]=1;if(F){D=27}else{D=28}}}while(0);if((D|0)==26){if(E){D=27}else{D=28}}if((D|0)==27){c[k>>2]=3;i=h;return}else if((D|0)==28){c[k>>2]=4;i=h;return}}}while(0);if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}E=c[b+12>>2]|0;F=b+(E<<3)+16|0;A=c[b+20>>2]|0;z=A>>8;if((A&1|0)==0){G=z}else{G=c[(c[e>>2]|0)+z>>2]|0}z=c[b+16>>2]|0;gc[c[(c[z>>2]|0)+24>>2]&3](z,d,e+G|0,(A&2|0)!=0?f:2,g);A=b+24|0;if((E|0)<=1){i=h;return}E=c[b+8>>2]|0;do{if((E&2|0)==0){b=d+36|0;if((c[b>>2]|0)==1){break}if((E&1|0)==0){G=d+54|0;z=e;C=A;while(1){if((a[G]|0)!=0){D=53;break}if((c[b>>2]|0)==1){D=53;break}B=c[C+4>>2]|0;y=B>>8;if((B&1|0)==0){H=y}else{H=c[(c[z>>2]|0)+y>>2]|0}y=c[C>>2]|0;gc[c[(c[y>>2]|0)+24>>2]&3](y,d,e+H|0,(B&2|0)!=0?f:2,g);B=C+8|0;if(B>>>0<F>>>0){C=B}else{D=53;break}}if((D|0)==53){i=h;return}}C=d+24|0;z=d+54|0;G=e;k=A;while(1){if((a[z]|0)!=0){D=53;break}if((c[b>>2]|0)==1){if((c[C>>2]|0)==1){D=53;break}}B=c[k+4>>2]|0;y=B>>8;if((B&1|0)==0){I=y}else{I=c[(c[G>>2]|0)+y>>2]|0}y=c[k>>2]|0;gc[c[(c[y>>2]|0)+24>>2]&3](y,d,e+I|0,(B&2|0)!=0?f:2,g);B=k+8|0;if(B>>>0<F>>>0){k=B}else{D=53;break}}if((D|0)==53){i=h;return}}}while(0);I=d+54|0;H=e;E=A;while(1){if((a[I]|0)!=0){D=53;break}A=c[E+4>>2]|0;k=A>>8;if((A&1|0)==0){J=k}else{J=c[(c[H>>2]|0)+k>>2]|0}k=c[E>>2]|0;gc[c[(c[k>>2]|0)+24>>2]&3](k,d,e+J|0,(A&2|0)!=0?f:2,g);A=E+8|0;if(A>>>0<F>>>0){E=A}else{D=53;break}}if((D|0)==53){i=h;return}}function Cm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=b;if((j|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}k=d+28|0;if((c[k>>2]|0)==1){i=h;return}c[k>>2]=f;i=h;return}if((j|0)!=(c[d>>2]|0)){j=c[b+8>>2]|0;gc[c[(c[j>>2]|0)+24>>2]&3](j,d,e,f,g);i=h;return}do{if((c[d+16>>2]|0)!=(e|0)){j=d+20|0;if((c[j>>2]|0)==(e|0)){break}c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=d+52|0;a[l]=0;m=d+53|0;a[m]=0;n=c[b+8>>2]|0;sc[c[(c[n>>2]|0)+20>>2]&15](n,d,e,e,1,g);if((a[m]|0)==0){o=0;p=13}else{if((a[l]|0)==0){o=1;p=13}}a:do{if((p|0)==13){c[j>>2]=e;l=d+40|0;c[l>>2]=(c[l>>2]|0)+1;do{if((c[d+36>>2]|0)==1){if((c[d+24>>2]|0)!=2){p=16;break}a[d+54|0]=1;if(o){break a}}else{p=16}}while(0);if((p|0)==16){if(o){break}}c[k>>2]=4;i=h;return}}while(0);c[k>>2]=3;i=h;return}}while(0);if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}function Dm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i;if((c[d+8>>2]|0)==(b|0)){if((c[d+4>>2]|0)!=(e|0)){i=g;return}h=d+28|0;if((c[h>>2]|0)==1){i=g;return}c[h>>2]=f;i=g;return}if((c[d>>2]|0)!=(b|0)){i=g;return}do{if((c[d+16>>2]|0)!=(e|0)){b=d+20|0;if((c[b>>2]|0)==(e|0)){break}c[d+32>>2]=f;c[b>>2]=e;b=d+40|0;c[b>>2]=(c[b>>2]|0)+1;do{if((c[d+36>>2]|0)==1){if((c[d+24>>2]|0)!=2){break}a[d+54|0]=1}}while(0);c[d+44>>2]=4;i=g;return}}while(0);if((f|0)!=1){i=g;return}c[d+32>>2]=1;i=g;return}\n\n\n\nfunction Eg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;k=i;i=i+104|0;l=(f-e|0)/12|0;m=k;do{if(l>>>0>100){n=Hm(l)|0;if((n|0)!=0){o=n;p=n;break}Tm()}else{o=0;p=m}}while(0);m=(e|0)==(f|0);if(m){q=0;r=l}else{n=e;s=0;t=l;l=p;while(1){u=a[n]|0;if((u&1)==0){v=(u&255)>>>1}else{v=c[n+4>>2]|0}if((v|0)==0){a[l]=2;w=s+1|0;x=t+ -1|0}else{a[l]=1;w=s;x=t}u=n+12|0;if((u|0)==(f|0)){q=w;r=x;break}else{n=u;s=w;t=x;l=l+1|0}}}l=b;b=d;d=g;x=0;t=q;q=r;a:while(1){r=c[l>>2]|0;do{if((r|0)==0){y=1}else{w=c[r+12>>2]|0;if((w|0)==(c[r+16>>2]|0)){z=kc[c[(c[r>>2]|0)+36>>2]&63](r)|0}else{z=c[w>>2]|0}if((z|0)==-1){c[l>>2]=0;y=1;break}else{y=(c[l>>2]|0)==0;break}}}while(0);r=c[b>>2]|0;do{if((r|0)==0){A=0;B=1}else{w=c[r+12>>2]|0;if((w|0)==(c[r+16>>2]|0)){C=kc[c[(c[r>>2]|0)+36>>2]&63](r)|0}else{C=c[w>>2]|0}if(!((C|0)==-1)){A=r;B=0;break}c[b>>2]=0;A=0;B=1}}while(0);D=c[l>>2]|0;if(!((y^B)&(q|0)!=0)){break}r=c[D+12>>2]|0;if((r|0)==(c[D+16>>2]|0)){E=kc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{E=c[r>>2]|0}if(j){F=E}else{F=tc[c[(c[d>>2]|0)+28>>2]&15](g,E)|0}r=x+1|0;if(m){x=r;q=q;t=t;continue}b:do{if(j){w=0;s=e;n=t;v=q;u=p;while(1){do{if((a[u]|0)==1){G=a[s]|0;H=(G&1)==0;if(H){I=s+4|0}else{I=c[s+8>>2]|0}if((F|0)!=(c[I+(x<<2)>>2]|0)){a[u]=0;J=w;K=n;L=v+ -1|0;break}if(H){M=(G&255)>>>1}else{M=c[s+4>>2]|0}if((M|0)!=(r|0)){J=1;K=n;L=v;break}a[u]=2;J=1;K=n+1|0;L=v+ -1|0}else{J=w;K=n;L=v}}while(0);G=s+12|0;if((G|0)==(f|0)){N=J;O=K;P=L;break b}w=J;s=G;n=K;v=L;u=u+1|0}}else{u=0;v=e;n=t;s=q;w=p;while(1){do{if((a[w]|0)==1){G=v;if((a[G]&1)==0){Q=v+4|0}else{Q=c[v+8>>2]|0}if((F|0)!=(tc[c[(c[d>>2]|0)+28>>2]&15](g,c[Q+(x<<2)>>2]|0)|0)){a[w]=0;R=u;S=n;T=s+ -1|0;break}H=a[G]|0;if((H&1)==0){U=(H&255)>>>1}else{U=c[v+4>>2]|0}if((U|0)!=(r|0)){R=1;S=n;T=s;break}a[w]=2;R=1;S=n+1|0;T=s+ -1|0}else{R=u;S=n;T=s}}while(0);H=v+12|0;if((H|0)==(f|0)){N=R;O=S;P=T;break b}u=R;v=H;n=S;s=T;w=w+1|0}}}while(0);if(!N){x=r;t=O;q=P;continue}w=c[l>>2]|0;s=w+12|0;n=c[s>>2]|0;if((n|0)==(c[w+16>>2]|0)){kc[c[(c[w>>2]|0)+40>>2]&63](w)|0}else{c[s>>2]=n+4}if((P+O|0)>>>0<2){x=r;t=O;q=P;continue}else{V=e;W=O;X=p}while(1){do{if((a[X]|0)==2){n=a[V]|0;if((n&1)==0){Y=(n&255)>>>1}else{Y=c[V+4>>2]|0}if((Y|0)==(r|0)){Z=W;break}a[X]=0;Z=W+ -1|0}else{Z=W}}while(0);n=V+12|0;if((n|0)==(f|0)){x=r;t=Z;q=P;continue a}else{V=n;W=Z;X=X+1|0}}}do{if((D|0)==0){_=1}else{X=c[D+12>>2]|0;if((X|0)==(c[D+16>>2]|0)){$=kc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{$=c[X>>2]|0}if(($|0)==-1){c[l>>2]=0;_=1;break}else{_=(c[l>>2]|0)==0;break}}}while(0);do{if((A|0)==0){aa=85}else{l=c[A+12>>2]|0;if((l|0)==(c[A+16>>2]|0)){ba=kc[c[(c[A>>2]|0)+36>>2]&63](A)|0}else{ba=c[l>>2]|0}if((ba|0)==-1){c[b>>2]=0;aa=85;break}else{if(_){break}else{aa=87;break}}}}while(0);if((aa|0)==85){if(_){aa=87}}if((aa|0)==87){c[h>>2]=c[h>>2]|2}c:do{if(m){aa=92}else{if((a[p]|0)==2){ca=e;break}else{da=e;ea=p}while(1){_=da+12|0;b=ea+1|0;if((_|0)==(f|0)){aa=92;break c}if((a[b]|0)==2){ca=_;break}else{ea=b;da=_}}}}while(0);if((aa|0)==92){c[h>>2]=c[h>>2]|4;ca=f}if((o|0)==0){i=k;return ca|0}Im(o);i=k;return ca|0}function Fg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Gg(a,0,k,j,f,g,h);i=b;return}function Gg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==0){t=0}else if((s|0)==64){t=8}else{t=10}s=k;ah(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=kc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=kc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}xe(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}xe(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{R=c[F>>2]|0}if((Yg(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){kc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Sl(J,c[o>>2]|0,h,t)|0;jj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=kc[c[(c[I>>2]|0)+36>>2]&63](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}function Hg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Ig(a,0,k,j,f,g,h);i=b;return}function Ig(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==0){t=0}else if((s|0)==8){t=16}else if((s|0)==64){t=8}else{t=10}s=k;ah(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=kc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=kc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{J=w;K=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){J=0;K=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){L=(w&255)>>>1}else{L=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(L|0)){if(F){M=(w&255)>>>1;N=(w&255)>>>1}else{w=c[y>>2]|0;M=w;N=w}xe(n,N<<1,0);if((a[g]&1)==0){O=10}else{O=(c[f>>2]&-2)+ -1|0}xe(n,O,0);if((a[g]&1)==0){P=u}else{P=c[v>>2]|0}c[o>>2]=P+M;Q=P}else{Q=A}w=B+12|0;F=c[w>>2]|0;R=B+16|0;if((F|0)==(c[R>>2]|0)){S=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{S=c[F>>2]|0}if((Yg(S,t,Q,o,r,z,m,k,q,s)|0)!=0){J=H;K=Q;break}F=c[w>>2]|0;if((F|0)==(c[R>>2]|0)){kc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=Q;continue}else{c[w>>2]=F+4;l=B;A=Q;continue}}Q=a[m]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[m+4>>2]|0}do{if((T|0)!=0){Q=c[q>>2]|0;if((Q-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=Q+4;c[Q>>2]=A}}while(0);r=Rl(K,c[o>>2]|0,h,t)|0;t=j;c[t>>2]=r;c[t+4>>2]=I;jj(m,k,c[q>>2]|0,h);do{if((B|0)==0){U=0;V=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){W=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{W=c[q>>2]|0}if(!((W|0)==-1)){U=B;V=0;break}c[x>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){E=60}else{x=c[J+12>>2]|0;if((x|0)==(c[J+16>>2]|0)){X=kc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{X=c[x>>2]|0}if((X|0)==-1){c[e>>2]=0;E=60;break}if(!V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}function Jg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Kg(a,0,k,j,f,g,h);i=b;return}function Kg(d,e,f,g,h,j,k){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;e=i;i=i+328|0;l=e;m=e+104|0;n=e+112|0;o=e+128|0;p=e+144|0;q=e+152|0;r=e+312|0;s=e+320|0;t=c[h+4>>2]&74;if((t|0)==0){u=0}else if((t|0)==64){u=8}else if((t|0)==8){u=16}else{u=10}t=l;ah(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=c[m>>2]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0;D=1}else{x=c[m+12>>2]|0;if((x|0)==(c[m+16>>2]|0)){E=kc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{E=c[x>>2]|0}if(!((E|0)==-1)){C=m;D=0;break}c[y>>2]=0;C=0;D=1}}while(0);x=c[f>>2]|0;do{if((x|0)==0){F=21}else{G=c[x+12>>2]|0;if((G|0)==(c[x+16>>2]|0)){H=kc[c[(c[x>>2]|0)+36>>2]&63](x)|0}else{H=c[G>>2]|0}if((H|0)==-1){c[f>>2]=0;F=21;break}else{if(D){I=x;break}else{J=x;K=B;break a}}}}while(0);if((F|0)==21){F=0;if(D){J=0;K=B;break}else{I=0}}x=a[h]|0;G=(x&1)==0;if(G){L=(x&255)>>>1}else{L=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(L|0)){if(G){M=(x&255)>>>1;N=(x&255)>>>1}else{x=c[z>>2]|0;M=x;N=x}xe(o,N<<1,0);if((a[h]&1)==0){O=10}else{O=(c[g>>2]&-2)+ -1|0}xe(o,O,0);if((a[h]&1)==0){P=v}else{P=c[w>>2]|0}c[p>>2]=P+M;Q=P}else{Q=B}x=C+12|0;G=c[x>>2]|0;R=C+16|0;if((G|0)==(c[R>>2]|0)){S=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{S=c[G>>2]|0}if((Yg(S,u,Q,p,s,A,n,l,r,t)|0)!=0){J=I;K=Q;break}G=c[x>>2]|0;if((G|0)==(c[R>>2]|0)){kc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=Q;continue}else{c[x>>2]=G+4;m=C;B=Q;continue}}Q=a[n]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[n+4>>2]|0}do{if((T|0)!=0){Q=c[r>>2]|0;if((Q-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=Q+4;c[Q>>2]=B}}while(0);b[k>>1]=Ql(K,c[p>>2]|0,j,u)|0;jj(n,l,c[r>>2]|0,j);do{if((C|0)==0){U=0;V=1}else{r=c[C+12>>2]|0;if((r|0)==(c[C+16>>2]|0)){W=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{W=c[r>>2]|0}if(!((W|0)==-1)){U=C;V=0;break}c[y>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){F=60}else{y=c[J+12>>2]|0;if((y|0)==(c[J+16>>2]|0)){X=kc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{X=c[y>>2]|0}if((X|0)==-1){c[f>>2]=0;F=60;break}if(!V){break}Y=d;c[Y>>2]=U;ve(o);ve(n);i=e;return}}while(0);do{if((F|0)==60){if(V){break}Y=d;c[Y>>2]=U;ve(o);ve(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;Y=d;c[Y>>2]=U;ve(o);ve(n);i=e;return}function Lg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Mg(a,0,k,j,f,g,h);i=b;return}function Mg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==0){t=0}else if((s|0)==8){t=16}else if((s|0)==64){t=8}else{t=10}s=k;ah(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=kc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=kc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}xe(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}xe(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{R=c[F>>2]|0}if((Yg(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){kc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Pl(J,c[o>>2]|0,h,t)|0;jj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=kc[c[(c[I>>2]|0)+36>>2]&63](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}function Ng(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Og(a,0,k,j,f,g,h);i=b;return}function Og(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==64){t=8}else if((s|0)==0){t=0}else if((s|0)==8){t=16}else{t=10}s=k;ah(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=kc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=kc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}xe(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}xe(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{R=c[F>>2]|0}if((Yg(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){kc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Ol(J,c[o>>2]|0,h,t)|0;jj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=kc[c[(c[I>>2]|0)+36>>2]&63](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;ve(n);ve(m);i=d;return}function Pg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Qg(a,0,k,j,f,g,h);i=b;return}function Qg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==64){t=8}else if((s|0)==0){t=0}else{t=10}s=k;ah(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=kc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=kc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{J=w;K=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){J=0;K=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){L=(w&255)>>>1}else{L=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(L|0)){if(F){M=(w&255)>>>1;N=(w&255)>>>1}else{w=c[y>>2]|0;M=w;N=w}xe(n,N<<1,0);if((a[g]&1)==0){O=10}else{O=(c[f>>2]&-2)+ -1|0}xe(n,O,0);if((a[g]&1)==0){P=u}else{P=c[v>>2]|0}c[o>>2]=P+M;Q=P}else{Q=A}w=B+12|0;F=c[w>>2]|0;R=B+16|0;if((F|0)==(c[R>>2]|0)){S=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{S=c[F>>2]|0}if((Yg(S,t,Q,o,r,z,m,k,q,s)|0)!=0){J=H;K=Q;break}F=c[w>>2]|0;if((F|0)==(c[R>>2]|0)){kc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=Q;continue}else{c[w>>2]=F+4;l=B;A=Q;continue}}Q=a[m]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[m+4>>2]|0}do{if((T|0)!=0){Q=c[q>>2]|0;if((Q-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=Q+4;c[Q>>2]=A}}while(0);r=Nl(K,c[o>>2]|0,h,t)|0;t=j;c[t>>2]=r;c[t+4>>2]=I;jj(m,k,c[q>>2]|0,h);do{if((B|0)==0){U=0;V=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){W=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{W=c[q>>2]|0}if(!((W|0)==-1)){U=B;V=0;break}c[x>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){E=60}else{x=c[J+12>>2]|0;if((x|0)==(c[J+16>>2]|0)){X=kc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{X=c[x>>2]|0}if((X|0)==-1){c[e>>2]=0;E=60;break}if(!V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);do{if((E|0)==60){if(V){break}Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;Y=b;c[Y>>2]=U;ve(n);ve(m);i=d;return}function Rg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Sg(a,0,k,j,f,g,h);i=b;return}function Sg(b,d,e,f,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;bh(n,h,v,l,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;xe(o,10,0);if((a[h]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=kc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=kc[c[(c[z>>2]|0)+36>>2]&63](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[h]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}xe(o,P<<1,0);if((a[h]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}xe(o,Q,0);if((a[h]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=kc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{U=c[I>>2]|0}if((ch(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){kc[c[(c[E>>2]|0)+40>>2]&63](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);g[k>>2]=+Ml(M,c[p>>2]|0,j);jj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=kc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=kc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}function Tg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Ug(a,0,k,j,f,g,h);i=b;return}function Ug(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;bh(n,g,v,l,m);g=o;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(o,10,0);if((a[g]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=kc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=kc[c[(c[z>>2]|0)+36>>2]&63](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[g]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}xe(o,P<<1,0);if((a[g]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}xe(o,Q,0);if((a[g]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=kc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{U=c[I>>2]|0}if((ch(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){kc[c[(c[E>>2]|0)+40>>2]&63](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);h[k>>3]=+Ll(M,c[p>>2]|0,j);jj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=kc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=kc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}function Vg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Wg(a,0,k,j,f,g,h);i=b;return}function Wg(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;bh(n,g,v,l,m);g=o;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(o,10,0);if((a[g]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=kc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=kc[c[(c[z>>2]|0)+36>>2]&63](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[g]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}xe(o,P<<1,0);if((a[g]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}xe(o,Q,0);if((a[g]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=kc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{U=c[I>>2]|0}if((ch(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){kc[c[(c[E>>2]|0)+40>>2]&63](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);h[k>>3]=+Kl(M,c[p>>2]|0,j);jj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=kc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=kc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;ve(o);ve(n);i=d;return}function Xg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+8|0;k=d;l=i;i=i+16|0;m=i;i=i+104|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+160|0;r=n;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;Pe(o,g);g=o;o=c[g>>2]|0;if(!((c[1824]|0)==-1)){c[l>>2]=7296;c[l+4>>2]=113;c[l+8>>2]=0;qe(7296,l,114)}l=(c[7300>>2]|0)+ -1|0;s=c[o+8>>2]|0;if(!((c[o+12>>2]|0)-s>>2>>>0>l>>>0)){t=Ta(4)|0;u=t;mm(u);Vb(t|0,15264,101)}o=c[s+(l<<2)>>2]|0;if((o|0)==0){t=Ta(4)|0;u=t;mm(u);Vb(t|0,15264,101)}t=m;qc[c[(c[o>>2]|0)+48>>2]&7](o,5848,5874|0,t)|0;Yd(c[g>>2]|0)|0;g=p;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;xe(p,10,0);if((a[g]&1)==0){o=p+1|0;v=o;w=p+8|0;x=o}else{o=p+8|0;v=p+1|0;w=o;x=c[o>>2]|0}o=e;e=f;f=p;u=p+4|0;l=m+96|0;s=m+100|0;y=q;z=m+104|0;A=m;m=n+4|0;B=c[o>>2]|0;C=x;D=q;q=0;E=x;a:while(1){do{if((B|0)==0){F=0;G=1}else{x=c[B+12>>2]|0;if((x|0)==(c[B+16>>2]|0)){H=kc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{H=c[x>>2]|0}if(!((H|0)==-1)){F=B;G=0;break}c[o>>2]=0;F=0;G=1}}while(0);x=c[e>>2]|0;do{if((x|0)==0){I=22}else{J=c[x+12>>2]|0;if((J|0)==(c[x+16>>2]|0)){K=kc[c[(c[x>>2]|0)+36>>2]&63](x)|0}else{K=c[J>>2]|0}if((K|0)==-1){c[e>>2]=0;I=22;break}else{if(G){break}else{L=E;break a}}}}while(0);if((I|0)==22){I=0;if(G){L=E;break}}x=a[g]|0;J=(x&1)==0;if(J){M=(x&255)>>>1}else{M=c[u>>2]|0}if((C-E|0)==(M|0)){if(J){N=(x&255)>>>1;O=(x&255)>>>1}else{x=c[u>>2]|0;N=x;O=x}xe(p,O<<1,0);if((a[g]&1)==0){P=10}else{P=(c[f>>2]&-2)+ -1|0}xe(p,P,0);if((a[g]&1)==0){Q=v}else{Q=c[w>>2]|0}R=Q+N|0;S=Q}else{R=C;S=E}x=c[F+12>>2]|0;if((x|0)==(c[F+16>>2]|0)){T=kc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=c[x>>2]|0}x=(R|0)==(S|0);do{if(x){J=(c[l>>2]|0)==(T|0);if(!J){if((c[s>>2]|0)!=(T|0)){I=43;break}}a[R]=J?43:45;U=R+1|0;V=D;W=0}else{I=43}}while(0);do{if((I|0)==43){I=0;J=a[r]|0;if((J&1)==0){X=(J&255)>>>1}else{X=c[m>>2]|0}if((X|0)!=0&(T|0)==0){if((D-y|0)>=160){U=R;V=D;W=q;break}c[D>>2]=q;U=R;V=D+4|0;W=0;break}else{Y=t}while(1){J=Y+4|0;if((c[Y>>2]|0)==(T|0)){Z=Y;break}if((J|0)==(z|0)){Z=z;break}else{Y=J}}J=Z-A|0;_=J>>2;if((J|0)>92){L=S;break a}if((J|0)<88){a[R]=a[5848+_|0]|0;U=R+1|0;V=D;W=q+1|0;break}if(x){L=R;break a}if((R-S|0)>=3){L=S;break a}if((a[R+ -1|0]|0)!=48){L=S;break a}a[R]=a[5848+_|0]|0;U=R+1|0;V=D;W=0}}while(0);x=c[o>>2]|0;_=x+12|0;J=c[_>>2]|0;if((J|0)==(c[x+16>>2]|0)){kc[c[(c[x>>2]|0)+40>>2]&63](x)|0;B=x;C=U;D=V;q=W;E=S;continue}else{c[_>>2]=J+4;B=x;C=U;D=V;q=W;E=S;continue}}a[L+3|0]=0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);S=c[1798]|0;c[k>>2]=j;if((Ag(L,S,5888,k)|0)!=1){c[h>>2]=4}k=c[o>>2]|0;do{if((k|0)==0){$=0;aa=1}else{S=c[k+12>>2]|0;if((S|0)==(c[k+16>>2]|0)){ba=kc[c[(c[k>>2]|0)+36>>2]&63](k)|0}else{ba=c[S>>2]|0}if(!((ba|0)==-1)){$=k;aa=0;break}c[o>>2]=0;$=0;aa=1}}while(0);o=c[e>>2]|0;do{if((o|0)==0){I=78}else{k=c[o+12>>2]|0;if((k|0)==(c[o+16>>2]|0)){ca=kc[c[(c[o>>2]|0)+36>>2]&63](o)|0}else{ca=c[k>>2]|0}if((ca|0)==-1){c[e>>2]=0;I=78;break}if(!aa){break}da=b;c[da>>2]=$;ve(p);ve(n);i=d;return}}while(0);do{if((I|0)==78){if(aa){break}da=b;c[da>>2]=$;ve(p);ve(n);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;da=b;c[da>>2]=$;ve(p);ve(n);i=d;return}function Yg(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;o=c[f>>2]|0;p=(o|0)==(e|0);do{if(p){q=(c[m+96>>2]|0)==(b|0);if(!q){if((c[m+100>>2]|0)!=(b|0)){break}}c[f>>2]=e+1;a[e]=q?43:45;c[g>>2]=0;r=0;i=n;return r|0}}while(0);q=a[j]|0;if((q&1)==0){s=(q&255)>>>1}else{s=c[j+4>>2]|0}if((s|0)!=0&(b|0)==(h|0)){h=c[l>>2]|0;if((h-k|0)>=160){r=0;i=n;return r|0}k=c[g>>2]|0;c[l>>2]=h+4;c[h>>2]=k;c[g>>2]=0;r=0;i=n;return r|0}k=m+104|0;h=m;while(1){l=h+4|0;if((c[h>>2]|0)==(b|0)){t=h;break}if((l|0)==(k|0)){t=k;break}else{h=l}}h=t-m|0;m=h>>2;if((h|0)>92){r=-1;i=n;return r|0}do{if((d|0)==16){if((h|0)<88){break}if(p){r=-1;i=n;return r|0}if((o-e|0)>=3){r=-1;i=n;return r|0}if((a[o+ -1|0]|0)!=48){r=-1;i=n;return r|0}c[g>>2]=0;t=a[5848+m|0]|0;c[f>>2]=o+1;a[o]=t;r=0;i=n;return r|0}else if((d|0)==10|(d|0)==8){if((m|0)<(d|0)){break}else{r=-1}i=n;return r|0}}while(0);d=a[5848+m|0]|0;c[f>>2]=o+1;a[o]=d;c[g>>2]=(c[g>>2]|0)+1;r=0;i=n;return r|0}function Zg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+40|0;h=g;j=g+16|0;k=g+32|0;Pe(k,d);d=k;k=c[d>>2]|0;if(!((c[1826]|0)==-1)){c[j>>2]=7304;c[j+4>>2]=113;c[j+8>>2]=0;qe(7304,j,114)}j=(c[7308>>2]|0)+ -1|0;l=c[k+8>>2]|0;if(!((c[k+12>>2]|0)-l>>2>>>0>j>>>0)){m=Ta(4)|0;n=m;mm(n);Vb(m|0,15264,101)}k=c[l+(j<<2)>>2]|0;if((k|0)==0){m=Ta(4)|0;n=m;mm(n);Vb(m|0,15264,101)}qc[c[(c[k>>2]|0)+32>>2]&7](k,5848,5874|0,e)|0;e=c[d>>2]|0;if(!((c[1862]|0)==-1)){c[h>>2]=7448;c[h+4>>2]=113;c[h+8>>2]=0;qe(7448,h,114)}h=(c[7452>>2]|0)+ -1|0;k=c[e+8>>2]|0;if(!((c[e+12>>2]|0)-k>>2>>>0>h>>>0)){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}e=c[k+(h<<2)>>2]|0;if((e|0)==0){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}else{o=e;a[f]=kc[c[(c[e>>2]|0)+16>>2]&63](o)|0;ic[c[(c[e>>2]|0)+20>>2]&63](b,o);Yd(c[d>>2]|0)|0;i=g;return}}function _g(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+40|0;j=h;k=h+16|0;l=h+32|0;Pe(l,d);d=l;l=c[d>>2]|0;if(!((c[1826]|0)==-1)){c[k>>2]=7304;c[k+4>>2]=113;c[k+8>>2]=0;qe(7304,k,114)}k=(c[7308>>2]|0)+ -1|0;m=c[l+8>>2]|0;if(!((c[l+12>>2]|0)-m>>2>>>0>k>>>0)){n=Ta(4)|0;o=n;mm(o);Vb(n|0,15264,101)}l=c[m+(k<<2)>>2]|0;if((l|0)==0){n=Ta(4)|0;o=n;mm(o);Vb(n|0,15264,101)}qc[c[(c[l>>2]|0)+32>>2]&7](l,5848,5880|0,e)|0;e=c[d>>2]|0;if(!((c[1862]|0)==-1)){c[j>>2]=7448;c[j+4>>2]=113;c[j+8>>2]=0;qe(7448,j,114)}j=(c[7452>>2]|0)+ -1|0;l=c[e+8>>2]|0;if(!((c[e+12>>2]|0)-l>>2>>>0>j>>>0)){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}e=c[l+(j<<2)>>2]|0;if((e|0)==0){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}else{p=e;q=e;a[f]=kc[c[(c[q>>2]|0)+12>>2]&63](p)|0;a[g]=kc[c[(c[q>>2]|0)+16>>2]&63](p)|0;ic[c[(c[e>>2]|0)+20>>2]&63](b,p);Yd(c[d>>2]|0)|0;i=h;return}}function $g(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0;p=i;if(b<<24>>24==h<<24>>24){if((a[d]|0)==0){q=-1;i=p;return q|0}a[d]=0;h=c[g>>2]|0;c[g>>2]=h+1;a[h]=46;h=a[k]|0;if((h&1)==0){r=(h&255)>>>1}else{r=c[k+4>>2]|0}if((r|0)==0){q=0;i=p;return q|0}r=c[m>>2]|0;if((r-l|0)>=160){q=0;i=p;return q|0}h=c[n>>2]|0;c[m>>2]=r+4;c[r>>2]=h;q=0;i=p;return q|0}do{if(b<<24>>24==j<<24>>24){h=a[k]|0;if((h&1)==0){s=(h&255)>>>1}else{s=c[k+4>>2]|0}if((s|0)==0){break}if((a[d]|0)==0){q=-1;i=p;return q|0}h=c[m>>2]|0;if((h-l|0)>=160){q=0;i=p;return q|0}r=c[n>>2]|0;c[m>>2]=h+4;c[h>>2]=r;c[n>>2]=0;q=0;i=p;return q|0}}while(0);s=o+32|0;j=o;while(1){r=j+1|0;if((a[j]|0)==b<<24>>24){t=j;break}if((r|0)==(s|0)){t=s;break}else{j=r}}j=t-o|0;if((j|0)>31){q=-1;i=p;return q|0}o=a[5848+j|0]|0;if((j|0)==24|(j|0)==25){t=c[g>>2]|0;do{if((t|0)!=(f|0)){if((a[t+ -1|0]&95|0)==(a[e]&127|0)){break}else{q=-1}i=p;return q|0}}while(0);c[g>>2]=t+1;a[t]=o;q=0;i=p;return q|0}else if((j|0)==23|(j|0)==22){a[e]=80;t=c[g>>2]|0;c[g>>2]=t+1;a[t]=o;q=0;i=p;return q|0}else{t=o&95;do{if((t|0)==(a[e]|0)){a[e]=t|128;if((a[d]|0)==0){break}a[d]=0;f=a[k]|0;if((f&1)==0){u=(f&255)>>>1}else{u=c[k+4>>2]|0}if((u|0)==0){break}f=c[m>>2]|0;if((f-l|0)>=160){break}s=c[n>>2]|0;c[m>>2]=f+4;c[f>>2]=s}}while(0);m=c[g>>2]|0;c[g>>2]=m+1;a[m]=o;if((j|0)>21){q=0;i=p;return q|0}c[n>>2]=(c[n>>2]|0)+1;q=0;i=p;return q|0}return 0}function ah(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+40|0;g=f;h=f+16|0;j=f+32|0;Pe(j,b);b=j;j=c[b>>2]|0;if(!((c[1824]|0)==-1)){c[h>>2]=7296;c[h+4>>2]=113;c[h+8>>2]=0;qe(7296,h,114)}h=(c[7300>>2]|0)+ -1|0;k=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-k>>2>>>0>h>>>0)){l=Ta(4)|0;m=l;mm(m);Vb(l|0,15264,101)}j=c[k+(h<<2)>>2]|0;if((j|0)==0){l=Ta(4)|0;m=l;mm(m);Vb(l|0,15264,101)}qc[c[(c[j>>2]|0)+48>>2]&7](j,5848,5874|0,d)|0;d=c[b>>2]|0;if(!((c[1864]|0)==-1)){c[g>>2]=7456;c[g+4>>2]=113;c[g+8>>2]=0;qe(7456,g,114)}g=(c[7460>>2]|0)+ -1|0;j=c[d+8>>2]|0;if(!((c[d+12>>2]|0)-j>>2>>>0>g>>>0)){n=Ta(4)|0;o=n;mm(o);Vb(n|0,15264,101)}d=c[j+(g<<2)>>2]|0;if((d|0)==0){n=Ta(4)|0;o=n;mm(o);Vb(n|0,15264,101)}else{n=d;c[e>>2]=kc[c[(c[d>>2]|0)+16>>2]&63](n)|0;ic[c[(c[d>>2]|0)+20>>2]&63](a,n);Yd(c[b>>2]|0)|0;i=f;return}}function bh(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+40|0;h=g;j=g+16|0;k=g+32|0;Pe(k,b);b=k;k=c[b>>2]|0;if(!((c[1824]|0)==-1)){c[j>>2]=7296;c[j+4>>2]=113;c[j+8>>2]=0;qe(7296,j,114)}j=(c[7300>>2]|0)+ -1|0;l=c[k+8>>2]|0;if(!((c[k+12>>2]|0)-l>>2>>>0>j>>>0)){m=Ta(4)|0;n=m;mm(n);Vb(m|0,15264,101)}k=c[l+(j<<2)>>2]|0;if((k|0)==0){m=Ta(4)|0;n=m;mm(n);Vb(m|0,15264,101)}qc[c[(c[k>>2]|0)+48>>2]&7](k,5848,5880|0,d)|0;d=c[b>>2]|0;if(!((c[1864]|0)==-1)){c[h>>2]=7456;c[h+4>>2]=113;c[h+8>>2]=0;qe(7456,h,114)}h=(c[7460>>2]|0)+ -1|0;k=c[d+8>>2]|0;if(!((c[d+12>>2]|0)-k>>2>>>0>h>>>0)){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}d=c[k+(h<<2)>>2]|0;if((d|0)==0){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}else{o=d;p=d;c[e>>2]=kc[c[(c[p>>2]|0)+12>>2]&63](o)|0;c[f>>2]=kc[c[(c[p>>2]|0)+16>>2]&63](o)|0;ic[c[(c[d>>2]|0)+20>>2]&63](a,o);Yd(c[b>>2]|0)|0;i=g;return}}function ch(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0;p=i;if((b|0)==(h|0)){if((a[d]|0)==0){q=-1;i=p;return q|0}a[d]=0;h=c[g>>2]|0;c[g>>2]=h+1;a[h]=46;h=a[k]|0;if((h&1)==0){r=(h&255)>>>1}else{r=c[k+4>>2]|0}if((r|0)==0){q=0;i=p;return q|0}r=c[m>>2]|0;if((r-l|0)>=160){q=0;i=p;return q|0}h=c[n>>2]|0;c[m>>2]=r+4;c[r>>2]=h;q=0;i=p;return q|0}do{if((b|0)==(j|0)){h=a[k]|0;if((h&1)==0){s=(h&255)>>>1}else{s=c[k+4>>2]|0}if((s|0)==0){break}if((a[d]|0)==0){q=-1;i=p;return q|0}h=c[m>>2]|0;if((h-l|0)>=160){q=0;i=p;return q|0}r=c[n>>2]|0;c[m>>2]=h+4;c[h>>2]=r;c[n>>2]=0;q=0;i=p;return q|0}}while(0);s=o+128|0;j=o;while(1){r=j+4|0;if((c[j>>2]|0)==(b|0)){t=j;break}if((r|0)==(s|0)){t=s;break}else{j=r}}j=t-o|0;o=j>>2;if((j|0)>124){q=-1;i=p;return q|0}t=a[5848+o|0]|0;do{if((o|0)==23|(o|0)==22){a[e]=80}else if((o|0)==24|(o|0)==25){s=c[g>>2]|0;do{if((s|0)!=(f|0)){if((a[s+ -1|0]&95|0)==(a[e]&127|0)){break}else{q=-1}i=p;return q|0}}while(0);c[g>>2]=s+1;a[s]=t;q=0;i=p;return q|0}else{b=t&95;if((b|0)!=(a[e]|0)){break}a[e]=b|128;if((a[d]|0)==0){break}a[d]=0;b=a[k]|0;if((b&1)==0){u=(b&255)>>>1}else{u=c[k+4>>2]|0}if((u|0)==0){break}b=c[m>>2]|0;if((b-l|0)>=160){break}r=c[n>>2]|0;c[m>>2]=b+4;c[b>>2]=r}}while(0);m=c[g>>2]|0;c[g>>2]=m+1;a[m]=t;if((j|0)>84){q=0;i=p;return q|0}c[n>>2]=(c[n>>2]|0)+1;q=0;i=p;return q|0}function dh(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function eh(a){a=a|0;i=i;return}function fh(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 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;j=i;i=i+56|0;k=j;l=j+8|0;m=j+24|0;n=j+32|0;o=j+40|0;if((c[f+4>>2]&1|0)==0){p=c[(c[d>>2]|0)+24>>2]|0;c[m>>2]=c[e>>2];q=h&1;r=k;s=m;c[r+0>>2]=c[s+0>>2];sc[p&15](b,d,k,f,g,q);i=j;return}Pe(n,f);f=n;n=c[f>>2]|0;if(!((c[1862]|0)==-1)){c[l>>2]=7448;c[l+4>>2]=113;c[l+8>>2]=0;qe(7448,l,114)}l=(c[7452>>2]|0)+ -1|0;q=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-q>>2>>>0>l>>>0)){t=Ta(4)|0;u=t;mm(u);Vb(t|0,15264,101)}n=c[q+(l<<2)>>2]|0;if((n|0)==0){t=Ta(4)|0;u=t;mm(u);Vb(t|0,15264,101)}t=n;Yd(c[f>>2]|0)|0;f=c[n>>2]|0;if(h){ic[c[f+24>>2]&63](o,t)}else{ic[c[f+28>>2]&63](o,t)}t=o;f=a[t]|0;if((f&1)==0){h=o+1|0;v=h;w=h;x=o+8|0}else{h=o+8|0;v=c[h>>2]|0;w=o+1|0;x=h}h=e;e=o+4|0;n=f;f=v;while(1){if((n&1)==0){y=w;z=(n&255)>>>1}else{y=c[x>>2]|0;z=c[e>>2]|0}if((f|0)==(y+z|0)){break}v=a[f]|0;u=c[h>>2]|0;do{if((u|0)!=0){l=u+24|0;q=c[l>>2]|0;if((q|0)!=(c[u+28>>2]|0)){c[l>>2]=q+1;a[q]=v;break}if(!((tc[c[(c[u>>2]|0)+52>>2]&15](u,v&255)|0)==-1)){break}c[h>>2]=0}}while(0);n=a[t]|0;f=f+1|0}c[b>>2]=c[h>>2];ve(o);i=j;return}function gh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+24|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[6096|0]|0;a[s+1|0]=a[6097|0]|0;a[s+2|0]=a[6098|0]|0;a[s+3|0]=a[6099|0]|0;a[s+4|0]=a[6100|0]|0;a[s+5|0]=a[6101|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=m;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);v=c[1798]|0;c[k>>2]=h;h=hh(w,12,v,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else if((s|0)==32){y=k}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Pe(q,f);ih(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];jh(b,j,z,e,o,f,g);i=d;return}function hh(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;g=i;i=i+16|0;h=g;c[h>>2]=f;f=fb(d|0)|0;d=Jb(a|0,b|0,e|0,h|0)|0;if((f|0)==0){i=g;return d|0}fb(f|0)|0;i=g;return d|0}function ih(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1826]|0)==-1)){c[m>>2]=7304;c[m+4>>2]=113;c[m+8>>2]=0;qe(7304,m,114)}m=(c[7308>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}q=j;r=c[o>>2]|0;if(!((c[1862]|0)==-1)){c[l>>2]=7448;c[l+4>>2]=113;c[l+8>>2]=0;qe(7448,l,114)}l=(c[7452>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}s=r;ic[c[(c[r>>2]|0)+20>>2]&63](n,s);t=n;l=a[t]|0;if((l&1)==0){u=(l&255)>>>1}else{u=c[n+4>>2]|0}do{if((u|0)==0){qc[c[(c[j>>2]|0)+32>>2]&7](q,b,e,f)|0;c[h>>2]=f+(e-b)}else{c[h>>2]=f;l=a[b]|0;if(l<<24>>24==43|l<<24>>24==45){o=tc[c[(c[j>>2]|0)+28>>2]&15](q,l)|0;l=c[h>>2]|0;c[h>>2]=l+1;a[l]=o;v=b+1|0}else{v=b}do{if((e-v|0)>1){if((a[v]|0)!=48){w=v;break}o=v+1|0;l=a[o]|0;if(!(l<<24>>24==88|l<<24>>24==120)){w=v;break}l=j;m=tc[c[(c[l>>2]|0)+28>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=m;m=tc[c[(c[l>>2]|0)+28>>2]&15](q,a[o]|0)|0;o=c[h>>2]|0;c[h>>2]=o+1;a[o]=m;w=v+2|0}else{w=v}}while(0);do{if((w|0)!=(e|0)){m=e+ -1|0;if(m>>>0>w>>>0){x=w;y=m}else{break}do{m=a[x]|0;a[x]=a[y]|0;a[y]=m;x=x+1|0;y=y+ -1|0;}while(x>>>0<y>>>0)}}while(0);m=kc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(w>>>0<e>>>0){o=n+1|0;l=j;p=n+4|0;z=n+8|0;A=0;B=0;C=w;while(1){D=(a[t]&1)==0;do{if((a[(D?o:c[z>>2]|0)+B|0]|0)==0){E=A;F=B}else{if((A|0)!=(a[(D?o:c[z>>2]|0)+B|0]|0)){E=A;F=B;break}G=c[h>>2]|0;c[h>>2]=G+1;a[G]=m;G=a[t]|0;if((G&1)==0){H=(G&255)>>>1}else{H=c[p>>2]|0}E=0;F=(B>>>0<(H+ -1|0)>>>0)+B|0}}while(0);D=tc[c[(c[l>>2]|0)+28>>2]&15](q,a[C]|0)|0;G=c[h>>2]|0;c[h>>2]=G+1;a[G]=D;D=C+1|0;if(D>>>0<e>>>0){A=E+1|0;B=F;C=D}else{break}}}C=f+(w-b)|0;B=c[h>>2]|0;if((C|0)==(B|0)){break}A=B+ -1|0;if(A>>>0>C>>>0){I=C;J=A}else{break}do{A=a[I]|0;a[I]=a[J]|0;a[J]=A;I=I+1|0;J=J+ -1|0;}while(I>>>0<J>>>0)}}while(0);if((d|0)==(e|0)){K=c[h>>2]|0;c[g>>2]=K;ve(n);i=k;return}else{K=f+(d-b)|0;c[g>>2]=K;ve(n);i=k;return}}function jh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+16|0;l=k;m=d;d=c[m>>2]|0;if((d|0)==0){c[b>>2]=0;i=k;return}n=g;g=e;o=n-g|0;p=h+12|0;h=c[p>>2]|0;q=(h|0)>(o|0)?h-o|0:0;o=f;h=o-g|0;do{if((h|0)>0){if((ec[c[(c[d>>2]|0)+48>>2]&31](d,e,h)|0)==(h|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);do{if((q|0)>0){ue(l,q,j);if((a[l]&1)==0){r=l+1|0}else{r=c[l+8>>2]|0}if((ec[c[(c[d>>2]|0)+48>>2]&31](d,r,q)|0)==(q|0)){ve(l);break}c[m>>2]=0;c[b>>2]=0;ve(l);i=k;return}}while(0);l=n-o|0;do{if((l|0)>0){if((ec[c[(c[d>>2]|0)+48>>2]&31](d,f,l)|0)==(l|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);c[p>>2]=0;c[b>>2]=d;i=k;return}function kh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+48|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=n;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);v=c[1798]|0;x=l;c[x>>2]=h;c[x+4>>2]=j;j=hh(w,22,v,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Pe(r,f);ih(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];jh(b,k,z,e,p,f,g);i=d;return}function lh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+24|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[6096|0]|0;a[s+1|0]=a[6097|0]|0;a[s+2|0]=a[6098|0]|0;a[s+3|0]=a[6099|0]|0;a[s+4|0]=a[6100|0]|0;a[s+5|0]=a[6101|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=m;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);x=c[1798]|0;c[k>>2]=h;h=hh(w,12,x,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else if((s|0)==32){y=k}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Pe(q,f);ih(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];jh(b,j,z,e,o,f,g);i=d;return}function mh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+48|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=117}}while(0);w=n;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);v=c[1798]|0;x=l;c[x>>2]=h;c[x+4>>2]=j;j=hh(w,23,v,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Pe(r,f);ih(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];jh(b,k,z,e,p,f,g);i=d;return}function nh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+24|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+64|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){if((q&1|0)==0){a[D]=97;E=0;break}else{a[D]=65;E=0;break}}else{a[D]=46;B=D+2|0;a[D+1|0]=42;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=hh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=hh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[7200]|0)==0;if(E){do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=oh(s,r,z,n)|0}else{do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);o=c[1798]|0;c[m>>2]=c[f+8>>2];r=m+4|0;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=oh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Tm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Hm(J<<1)|0;if((L|0)!=0){M=H;N=L;O=L;break}Tm()}}while(0);Pe(w,f);ph(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];jh(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Im(N)}if((I|0)==0){i=d;return}Im(I);i=d;return}function oh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=fb(b|0)|0;b=Eb(a|0,d|0,g|0)|0;if((e|0)==0){i=f;return b|0}fb(e|0)|0;i=f;return b|0}function ph(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1826]|0)==-1)){c[m>>2]=7304;c[m+4>>2]=113;c[m+8>>2]=0;qe(7304,m,114)}m=(c[7308>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}q=j;r=c[o>>2]|0;if(!((c[1862]|0)==-1)){c[l>>2]=7448;c[l+4>>2]=113;c[l+8>>2]=0;qe(7448,l,114)}l=(c[7452>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}s=r;ic[c[(c[r>>2]|0)+20>>2]&63](n,s);c[h>>2]=f;t=a[b]|0;if(t<<24>>24==43|t<<24>>24==45){l=tc[c[(c[j>>2]|0)+28>>2]&15](q,t)|0;t=c[h>>2]|0;c[h>>2]=t+1;a[t]=l;u=b+1|0}else{u=b}l=e;a:do{if((l-u|0)>1){if((a[u]|0)!=48){v=14;break}t=u+1|0;o=a[t]|0;if(!(o<<24>>24==88|o<<24>>24==120)){v=14;break}o=j;m=tc[c[(c[o>>2]|0)+28>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=m;m=u+2|0;p=tc[c[(c[o>>2]|0)+28>>2]&15](q,a[t]|0)|0;t=c[h>>2]|0;c[h>>2]=t+1;a[t]=p;if(m>>>0<e>>>0){w=m}else{x=m;y=m;break}while(1){p=a[w]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);t=w+1|0;if((Wa(p<<24>>24|0,c[1798]|0)|0)==0){x=m;y=w;break a}if(t>>>0<e>>>0){w=t}else{x=m;y=t;break}}}else{v=14}}while(0);b:do{if((v|0)==14){if(u>>>0<e>>>0){z=u}else{x=u;y=u;break}while(1){w=a[z]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);p=z+1|0;if((xb(w<<24>>24|0,c[1798]|0)|0)==0){x=u;y=z;break b}if(p>>>0<e>>>0){z=p}else{x=u;y=p;break}}}}while(0);u=n;z=a[u]|0;if((z&1)==0){A=(z&255)>>>1}else{A=c[n+4>>2]|0}do{if((A|0)==0){qc[c[(c[j>>2]|0)+32>>2]&7](q,x,y,c[h>>2]|0)|0;c[h>>2]=(c[h>>2]|0)+(y-x)}else{do{if((x|0)!=(y|0)){z=y+ -1|0;if(z>>>0>x>>>0){B=x;C=z}else{break}do{z=a[B]|0;a[B]=a[C]|0;a[C]=z;B=B+1|0;C=C+ -1|0;}while(B>>>0<C>>>0)}}while(0);w=kc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(x>>>0<y>>>0){z=n+1|0;v=n+4|0;p=n+8|0;m=j;t=0;o=0;D=x;while(1){E=(a[u]&1)==0;do{if((a[(E?z:c[p>>2]|0)+o|0]|0)>0){if((t|0)!=(a[(E?z:c[p>>2]|0)+o|0]|0)){F=t;G=o;break}H=c[h>>2]|0;c[h>>2]=H+1;a[H]=w;H=a[u]|0;if((H&1)==0){I=(H&255)>>>1}else{I=c[v>>2]|0}F=0;G=(o>>>0<(I+ -1|0)>>>0)+o|0}else{F=t;G=o}}while(0);E=tc[c[(c[m>>2]|0)+28>>2]&15](q,a[D]|0)|0;H=c[h>>2]|0;c[h>>2]=H+1;a[H]=E;E=D+1|0;if(E>>>0<y>>>0){t=F+1|0;o=G;D=E}else{break}}}D=f+(x-b)|0;o=c[h>>2]|0;if((D|0)==(o|0)){break}t=o+ -1|0;if(t>>>0>D>>>0){J=D;K=t}else{break}do{t=a[J]|0;a[J]=a[K]|0;a[K]=t;J=J+1|0;K=K+ -1|0;}while(J>>>0<K>>>0)}}while(0);c:do{if(y>>>0<e>>>0){K=j;J=y;while(1){x=a[J]|0;if(x<<24>>24==46){break}G=tc[c[(c[K>>2]|0)+28>>2]&15](q,x)|0;x=c[h>>2]|0;c[h>>2]=x+1;a[x]=G;G=J+1|0;if(G>>>0<e>>>0){J=G}else{L=G;break c}}K=kc[c[(c[r>>2]|0)+12>>2]&63](s)|0;G=c[h>>2]|0;c[h>>2]=G+1;a[G]=K;L=J+1|0}else{L=y}}while(0);qc[c[(c[j>>2]|0)+32>>2]&7](q,L,e,c[h>>2]|0)|0;q=(c[h>>2]|0)+(l-L)|0;c[h>>2]=q;if((d|0)==(e|0)){M=q;c[g>>2]=M;ve(n);i=k;return}M=f+(d-b)|0;c[g>>2]=M;ve(n);i=k;return}function qh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+64|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){a[D]=76;B=D+1|0;if((q&1|0)==0){a[B]=97;E=0;break}else{a[B]=65;E=0;break}}else{a[D]=46;a[D+1|0]=42;a[D+2|0]=76;B=D+3|0;if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=hh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=hh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[7200]|0)==0;if(E){do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=oh(s,r,z,n)|0}else{do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);o=c[1798]|0;r=m;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=oh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Tm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Hm(J<<1)|0;if((L|0)!=0){M=H;N=L;O=L;break}Tm()}}while(0);Pe(w,f);ph(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];jh(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Im(N)}if((I|0)==0){i=d;return}Im(I);i=d;return}function rh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+16|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+40|0;p=i;i=i+8|0;q=i;i=i+8|0;r=m;a[r+0|0]=a[6104|0]|0;a[r+1|0]=a[6105|0]|0;a[r+2|0]=a[6106|0]|0;a[r+3|0]=a[6107|0]|0;a[r+4|0]=a[6108|0]|0;a[r+5|0]=a[6109|0]|0;m=n;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);s=c[1798]|0;c[k>>2]=h;h=hh(m,20,s,r,k)|0;k=n+h|0;r=c[f+4>>2]&176;do{if((r|0)==32){t=k}else if((r|0)==16){s=a[m]|0;if(s<<24>>24==43|s<<24>>24==45){t=n+1|0;break}if(!((h|0)>1&s<<24>>24==48)){u=10;break}s=a[n+1|0]|0;if(!(s<<24>>24==88|s<<24>>24==120)){u=10;break}t=n+2|0}else{u=10}}while(0);if((u|0)==10){t=m}u=o;Pe(p,f);r=p;p=c[r>>2]|0;if(!((c[1826]|0)==-1)){c[l>>2]=7304;c[l+4>>2]=113;c[l+8>>2]=0;qe(7304,l,114)}l=(c[7308>>2]|0)+ -1|0;s=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-s>>2>>>0>l>>>0)){v=Ta(4)|0;w=v;mm(w);Vb(v|0,15264,101)}p=c[s+(l<<2)>>2]|0;if((p|0)==0){v=Ta(4)|0;w=v;mm(w);Vb(v|0,15264,101)}Yd(c[r>>2]|0)|0;qc[c[(c[p>>2]|0)+32>>2]&7](p,m,k,u)|0;m=o+h|0;if((t|0)==(k|0)){x=m;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];jh(b,j,u,x,m,f,g);E=j;i=d;return}x=o+(t-n)|0;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];jh(b,j,u,x,m,f,g);E=j;i=d;return}function sh(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function th(a){a=a|0;i=i;return}function uh(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 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;j=i;i=i+56|0;k=j;l=j+8|0;m=j+24|0;n=j+32|0;o=j+40|0;if((c[f+4>>2]&1|0)==0){p=c[(c[d>>2]|0)+24>>2]|0;c[m>>2]=c[e>>2];q=h&1;r=k;s=m;c[r+0>>2]=c[s+0>>2];sc[p&15](b,d,k,f,g,q);i=j;return}Pe(n,f);f=n;n=c[f>>2]|0;if(!((c[1864]|0)==-1)){c[l>>2]=7456;c[l+4>>2]=113;c[l+8>>2]=0;qe(7456,l,114)}l=(c[7460>>2]|0)+ -1|0;q=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-q>>2>>>0>l>>>0)){t=Ta(4)|0;u=t;mm(u);Vb(t|0,15264,101)}n=c[q+(l<<2)>>2]|0;if((n|0)==0){t=Ta(4)|0;u=t;mm(u);Vb(t|0,15264,101)}t=n;Yd(c[f>>2]|0)|0;f=c[n>>2]|0;if(h){ic[c[f+24>>2]&63](o,t)}else{ic[c[f+28>>2]&63](o,t)}t=o;f=a[t]|0;if((f&1)==0){h=o+4|0;v=h;w=o+8|0;x=h}else{h=o+8|0;v=c[h>>2]|0;w=h;x=o+4|0}h=e;e=f;f=v;while(1){if((e&1)==0){y=x;z=(e&255)>>>1}else{y=c[w>>2]|0;z=c[x>>2]|0}if((f|0)==(y+(z<<2)|0)){break}v=c[f>>2]|0;n=c[h>>2]|0;do{if((n|0)!=0){u=n+24|0;l=c[u>>2]|0;if((l|0)==(c[n+28>>2]|0)){A=tc[c[(c[n>>2]|0)+52>>2]&15](n,v)|0}else{c[u>>2]=l+4;c[l>>2]=v;A=v}if(!((A|0)==-1)){break}c[h>>2]=0}}while(0);e=a[t]|0;f=f+4|0}c[b>>2]=c[h>>2];Ge(o);i=j;return}function vh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+88|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[6096|0]|0;a[s+1|0]=a[6097|0]|0;a[s+2|0]=a[6098|0]|0;a[s+3|0]=a[6099|0]|0;a[s+4|0]=a[6100|0]|0;a[s+5|0]=a[6101|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=100}}while(0);w=m;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);x=c[1798]|0;c[k>>2]=h;h=hh(w,12,x,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else if((s|0)==32){y=k}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Pe(q,f);wh(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];xh(b,j,z,e,o,f,g);i=d;return}function wh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1824]|0)==-1)){c[m>>2]=7296;c[m+4>>2]=113;c[m+8>>2]=0;qe(7296,m,114)}m=(c[7300>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}q=j;r=c[o>>2]|0;if(!((c[1864]|0)==-1)){c[l>>2]=7456;c[l+4>>2]=113;c[l+8>>2]=0;qe(7456,l,114)}l=(c[7460>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}s=r;ic[c[(c[r>>2]|0)+20>>2]&63](n,s);t=n;l=a[t]|0;if((l&1)==0){u=(l&255)>>>1}else{u=c[n+4>>2]|0}do{if((u|0)==0){qc[c[(c[j>>2]|0)+48>>2]&7](q,b,e,f)|0;l=f+(e-b<<2)|0;c[h>>2]=l;v=l}else{c[h>>2]=f;l=a[b]|0;if(l<<24>>24==43|l<<24>>24==45){o=tc[c[(c[j>>2]|0)+44>>2]&15](q,l)|0;l=c[h>>2]|0;c[h>>2]=l+4;c[l>>2]=o;w=b+1|0}else{w=b}do{if((e-w|0)>1){if((a[w]|0)!=48){x=w;break}o=w+1|0;l=a[o]|0;if(!(l<<24>>24==88|l<<24>>24==120)){x=w;break}l=j;m=tc[c[(c[l>>2]|0)+44>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+4;c[p>>2]=m;m=tc[c[(c[l>>2]|0)+44>>2]&15](q,a[o]|0)|0;o=c[h>>2]|0;c[h>>2]=o+4;c[o>>2]=m;x=w+2|0}else{x=w}}while(0);do{if((x|0)!=(e|0)){m=e+ -1|0;if(m>>>0>x>>>0){y=x;z=m}else{break}do{m=a[y]|0;a[y]=a[z]|0;a[z]=m;y=y+1|0;z=z+ -1|0;}while(y>>>0<z>>>0)}}while(0);m=kc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(x>>>0<e>>>0){o=n+1|0;l=j;p=n+4|0;A=n+8|0;B=0;C=0;D=x;while(1){E=(a[t]&1)==0;do{if((a[(E?o:c[A>>2]|0)+C|0]|0)==0){F=B;G=C}else{if((B|0)!=(a[(E?o:c[A>>2]|0)+C|0]|0)){F=B;G=C;break}H=c[h>>2]|0;c[h>>2]=H+4;c[H>>2]=m;H=a[t]|0;if((H&1)==0){I=(H&255)>>>1}else{I=c[p>>2]|0}F=0;G=(C>>>0<(I+ -1|0)>>>0)+C|0}}while(0);E=tc[c[(c[l>>2]|0)+44>>2]&15](q,a[D]|0)|0;H=c[h>>2]|0;J=H+4|0;c[h>>2]=J;c[H>>2]=E;E=D+1|0;if(E>>>0<e>>>0){B=F+1|0;C=G;D=E}else{K=J;break}}}else{K=c[h>>2]|0}D=f+(x-b<<2)|0;if((D|0)==(K|0)){v=K;break}C=K+ -4|0;if(C>>>0>D>>>0){L=D;M=C}else{v=K;break}while(1){C=c[L>>2]|0;c[L>>2]=c[M>>2];c[M>>2]=C;C=L+4|0;D=M+ -4|0;if(C>>>0<D>>>0){M=D;L=C}else{v=K;break}}}}while(0);if((d|0)==(e|0)){N=v;c[g>>2]=N;ve(n);i=k;return}N=f+(d-b<<2)|0;c[g>>2]=N;ve(n);i=k;return}function xh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+16|0;l=k;m=d;d=c[m>>2]|0;if((d|0)==0){c[b>>2]=0;i=k;return}n=g;g=e;o=n-g>>2;p=h+12|0;h=c[p>>2]|0;q=(h|0)>(o|0)?h-o|0:0;o=f;h=o-g|0;g=h>>2;do{if((h|0)>0){if((ec[c[(c[d>>2]|0)+48>>2]&31](d,e,g)|0)==(g|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);do{if((q|0)>0){Fe(l,q,j);if((a[l]&1)==0){r=l+4|0}else{r=c[l+8>>2]|0}if((ec[c[(c[d>>2]|0)+48>>2]&31](d,r,q)|0)==(q|0)){Ge(l);break}c[m>>2]=0;c[b>>2]=0;Ge(l);i=k;return}}while(0);l=n-o|0;o=l>>2;do{if((l|0)>0){if((ec[c[(c[d>>2]|0)+48>>2]&31](d,f,o)|0)==(o|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);c[p>>2]=0;c[b>>2]=d;i=k;return}function yh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+168|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=n;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);v=c[1798]|0;x=l;c[x>>2]=h;c[x+4>>2]=j;j=hh(w,22,v,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Pe(r,f);wh(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];xh(b,k,z,e,p,f,g);i=d;return}function zh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+88|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[6096|0]|0;a[s+1|0]=a[6097|0]|0;a[s+2|0]=a[6098|0]|0;a[s+3|0]=a[6099|0]|0;a[s+4|0]=a[6100|0]|0;a[s+5|0]=a[6101|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=m;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);x=c[1798]|0;c[k>>2]=h;h=hh(w,12,x,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else if((s|0)==32){y=k}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Pe(q,f);wh(w,y,k,z,o,p,q);Yd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];xh(b,j,z,e,o,f,g);i=d;return}function Ah(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+176|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=117}}while(0);w=n;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);v=c[1798]|0;x=l;c[x>>2]=h;c[x+4>>2]=j;j=hh(w,23,v,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else if((t|0)==32){y=l}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Pe(r,f);wh(w,y,l,z,p,q,r);Yd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];xh(b,k,z,e,p,f,g);i=d;return}function Bh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+24|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+232|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){if((q&1|0)==0){a[D]=97;E=0;break}else{a[D]=65;E=0;break}}else{a[D]=46;B=D+2|0;a[D+1|0]=42;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=hh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=hh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[7200]|0)==0;if(E){do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=oh(s,r,z,n)|0}else{do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);o=c[1798]|0;c[m>>2]=c[f+8>>2];r=m+4|0;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=oh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Tm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else if((s|0)==32){K=F}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Hm(J<<3)|0;s=L;if((L|0)!=0){M=H;N=s;O=s;break}Tm()}}while(0);Pe(w,f);Ch(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];xh(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Im(N)}if((I|0)==0){i=d;return}Im(I);i=d;return}function Ch(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[1824]|0)==-1)){c[m>>2]=7296;c[m+4>>2]=113;c[m+8>>2]=0;qe(7296,m,114)}m=(c[7300>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Ta(4)|0;r=q;mm(r);Vb(q|0,15264,101)}q=j;r=c[o>>2]|0;if(!((c[1864]|0)==-1)){c[l>>2]=7456;c[l+4>>2]=113;c[l+8>>2]=0;qe(7456,l,114)}l=(c[7460>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Ta(4)|0;t=s;mm(t);Vb(s|0,15264,101)}s=r;ic[c[(c[r>>2]|0)+20>>2]&63](n,s);c[h>>2]=f;t=a[b]|0;if(t<<24>>24==43|t<<24>>24==45){l=tc[c[(c[j>>2]|0)+44>>2]&15](q,t)|0;t=c[h>>2]|0;c[h>>2]=t+4;c[t>>2]=l;u=b+1|0}else{u=b}l=e;a:do{if((l-u|0)>1){if((a[u]|0)!=48){v=14;break}t=u+1|0;o=a[t]|0;if(!(o<<24>>24==88|o<<24>>24==120)){v=14;break}o=j;m=tc[c[(c[o>>2]|0)+44>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+4;c[p>>2]=m;m=u+2|0;p=tc[c[(c[o>>2]|0)+44>>2]&15](q,a[t]|0)|0;t=c[h>>2]|0;c[h>>2]=t+4;c[t>>2]=p;if(m>>>0<e>>>0){w=m}else{x=m;y=m;break}while(1){p=a[w]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);t=w+1|0;if((Wa(p<<24>>24|0,c[1798]|0)|0)==0){x=m;y=w;break a}if(t>>>0<e>>>0){w=t}else{x=m;y=t;break}}}else{v=14}}while(0);b:do{if((v|0)==14){if(u>>>0<e>>>0){z=u}else{x=u;y=u;break}while(1){w=a[z]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);p=z+1|0;if((xb(w<<24>>24|0,c[1798]|0)|0)==0){x=u;y=z;break b}if(p>>>0<e>>>0){z=p}else{x=u;y=p;break}}}}while(0);u=n;z=a[u]|0;if((z&1)==0){A=(z&255)>>>1}else{A=c[n+4>>2]|0}do{if((A|0)==0){qc[c[(c[j>>2]|0)+48>>2]&7](q,x,y,c[h>>2]|0)|0;z=(c[h>>2]|0)+(y-x<<2)|0;c[h>>2]=z;B=z}else{do{if((x|0)!=(y|0)){z=y+ -1|0;if(z>>>0>x>>>0){C=x;D=z}else{break}do{z=a[C]|0;a[C]=a[D]|0;a[D]=z;C=C+1|0;D=D+ -1|0;}while(C>>>0<D>>>0)}}while(0);w=kc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(x>>>0<y>>>0){z=n+1|0;v=n+4|0;p=n+8|0;m=j;t=0;o=0;E=x;while(1){F=(a[u]&1)==0;do{if((a[(F?z:c[p>>2]|0)+o|0]|0)>0){if((t|0)!=(a[(F?z:c[p>>2]|0)+o|0]|0)){G=t;H=o;break}I=c[h>>2]|0;c[h>>2]=I+4;c[I>>2]=w;I=a[u]|0;if((I&1)==0){J=(I&255)>>>1}else{J=c[v>>2]|0}G=0;H=(o>>>0<(J+ -1|0)>>>0)+o|0}else{G=t;H=o}}while(0);F=tc[c[(c[m>>2]|0)+44>>2]&15](q,a[E]|0)|0;I=c[h>>2]|0;K=I+4|0;c[h>>2]=K;c[I>>2]=F;F=E+1|0;if(F>>>0<y>>>0){t=G+1|0;o=H;E=F}else{L=K;break}}}else{L=c[h>>2]|0}E=f+(x-b<<2)|0;if((E|0)==(L|0)){B=L;break}o=L+ -4|0;if(o>>>0>E>>>0){M=E;N=o}else{B=L;break}while(1){o=c[M>>2]|0;c[M>>2]=c[N>>2];c[N>>2]=o;o=M+4|0;E=N+ -4|0;if(o>>>0<E>>>0){N=E;M=o}else{B=L;break}}}}while(0);c:do{if(y>>>0<e>>>0){L=j;M=y;while(1){N=a[M]|0;if(N<<24>>24==46){break}x=tc[c[(c[L>>2]|0)+44>>2]&15](q,N)|0;N=c[h>>2]|0;H=N+4|0;c[h>>2]=H;c[N>>2]=x;x=M+1|0;if(x>>>0<e>>>0){M=x}else{O=H;P=x;break c}}L=kc[c[(c[r>>2]|0)+12>>2]&63](s)|0;x=c[h>>2]|0;H=x+4|0;c[h>>2]=H;c[x>>2]=L;O=H;P=M+1|0}else{O=B;P=y}}while(0);qc[c[(c[j>>2]|0)+48>>2]&7](q,P,e,O)|0;O=(c[h>>2]|0)+(l-P<<2)|0;c[h>>2]=O;if((d|0)==(e|0)){Q=O;c[g>>2]=Q;ve(n);i=k;return}Q=f+(d-b<<2)|0;c[g>>2]=Q;ve(n);i=k;return}function Dh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+232|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){a[D]=76;B=D+1|0;if((q&1|0)==0){a[B]=97;E=0;break}else{a[B]=65;E=0;break}}else{a[D]=46;a[D+1|0]=42;a[D+2|0]=76;B=D+3|0;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=hh(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=hh(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[7200]|0)==0;if(E){do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);r=c[1798]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=oh(s,r,z,n)|0}else{do{if(o){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);o=c[1798]|0;r=m;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=oh(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Tm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Hm(J<<3)|0;s=L;if((L|0)!=0){M=H;N=s;O=s;break}Tm()}}while(0);Pe(w,f);Ch(M,K,F,O,u,v,w);Yd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];xh(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Im(N)}if((I|0)==0){i=d;return}Im(I);i=d;return}function Eh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+16|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+152|0;p=i;i=i+8|0;q=i;i=i+8|0;r=m;a[r+0|0]=a[6104|0]|0;a[r+1|0]=a[6105|0]|0;a[r+2|0]=a[6106|0]|0;a[r+3|0]=a[6107|0]|0;a[r+4|0]=a[6108|0]|0;a[r+5|0]=a[6109|0]|0;m=n;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);s=c[1798]|0;c[k>>2]=h;h=hh(m,20,s,r,k)|0;k=n+h|0;r=c[f+4>>2]&176;do{if((r|0)==16){s=a[m]|0;if(s<<24>>24==43|s<<24>>24==45){t=n+1|0;break}if(!((h|0)>1&s<<24>>24==48)){u=10;break}s=a[n+1|0]|0;if(!(s<<24>>24==88|s<<24>>24==120)){u=10;break}t=n+2|0}else if((r|0)==32){t=k}else{u=10}}while(0);if((u|0)==10){t=m}Pe(p,f);u=p;p=c[u>>2]|0;if(!((c[1824]|0)==-1)){c[l>>2]=7296;c[l+4>>2]=113;c[l+8>>2]=0;qe(7296,l,114)}l=(c[7300>>2]|0)+ -1|0;r=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-r>>2>>>0>l>>>0)){v=Ta(4)|0;w=v;mm(w);Vb(v|0,15264,101)}p=c[r+(l<<2)>>2]|0;if((p|0)==0){v=Ta(4)|0;w=v;mm(w);Vb(v|0,15264,101)}Yd(c[u>>2]|0)|0;u=o;qc[c[(c[p>>2]|0)+48>>2]&7](p,m,k,u)|0;m=o+(h<<2)|0;if((t|0)==(k|0)){x=m;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];xh(b,j,u,x,m,f,g);E=j;i=d;return}x=o+(t-n<<2)|0;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];xh(b,j,u,x,m,f,g);E=j;i=d;return}function Fh(e,f,g,h,j,k,l,m,n){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,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;o=i;i=i+64|0;p=o;q=o+8|0;r=o+16|0;s=o+32|0;t=o+40|0;u=o+48|0;v=o+56|0;Pe(s,j);w=s;s=c[w>>2]|0;if(!((c[1826]|0)==-1)){c[r>>2]=7304;c[r+4>>2]=113;c[r+8>>2]=0;qe(7304,r,114)}r=(c[7308>>2]|0)+ -1|0;x=c[s+8>>2]|0;if(!((c[s+12>>2]|0)-x>>2>>>0>r>>>0)){y=Ta(4)|0;z=y;mm(z);Vb(y|0,15264,101)}s=c[x+(r<<2)>>2]|0;if((s|0)==0){y=Ta(4)|0;z=y;mm(z);Vb(y|0,15264,101)}y=s;Yd(c[w>>2]|0)|0;c[k>>2]=0;w=g;a:do{if((m|0)==(n|0)){A=65}else{z=h;r=s;x=s+8|0;B=s;C=f;D=u;E=v;F=t;G=m;H=0;b:while(1){I=H;while(1){if((I|0)!=0){A=65;break a}J=c[w>>2]|0;do{if((J|0)==0){K=0}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){K=J;break}if(!((kc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1)){K=J;break}c[w>>2]=0;K=0}}while(0);J=(K|0)==0;L=c[z>>2]|0;c:do{if((L|0)==0){A=19}else{do{if((c[L+12>>2]|0)==(c[L+16>>2]|0)){if(!((kc[c[(c[L>>2]|0)+36>>2]&63](L)|0)==-1)){break}c[z>>2]=0;A=19;break c}}while(0);if(J){M=L}else{A=20;break b}}}while(0);if((A|0)==19){A=0;if(J){A=20;break b}else{M=0}}if((ec[c[(c[r>>2]|0)+36>>2]&31](y,a[G]|0,0)|0)<<24>>24==37){A=22;break}L=a[G]|0;if(L<<24>>24>-1){N=c[x>>2]|0;if(!((b[N+(L<<24>>24<<1)>>1]&8192)==0)){O=G;A=33;break}}P=K+12|0;L=c[P>>2]|0;Q=K+16|0;if((L|0)==(c[Q>>2]|0)){R=kc[c[(c[K>>2]|0)+36>>2]&63](K)|0}else{R=d[L]|0}L=tc[c[(c[B>>2]|0)+12>>2]&15](y,R&255)|0;if(L<<24>>24==(tc[c[(c[B>>2]|0)+12>>2]&15](y,a[G]|0)|0)<<24>>24){A=60;break}c[k>>2]=4;I=4}d:do{if((A|0)==22){A=0;I=G+1|0;if((I|0)==(n|0)){A=23;break b}L=ec[c[(c[r>>2]|0)+36>>2]&31](y,a[I]|0,0)|0;if(L<<24>>24==48|L<<24>>24==69){S=G+2|0;if((S|0)==(n|0)){A=26;break b}T=S;U=ec[c[(c[r>>2]|0)+36>>2]&31](y,a[S]|0,0)|0;V=L}else{T=I;U=L;V=0}L=c[(c[C>>2]|0)+36>>2]|0;c[D>>2]=K;c[E>>2]=M;I=q;S=u;c[I+0>>2]=c[S+0>>2];S=p;I=v;c[S+0>>2]=c[I+0>>2];jc[L&3](t,f,q,p,j,k,l,U,V);c[w>>2]=c[F>>2];W=T+1|0}else if((A|0)==33){while(1){A=0;L=O+1|0;if((L|0)==(n|0)){X=n;break}I=a[L]|0;if(!(I<<24>>24>-1)){X=L;break}if((b[N+(I<<24>>24<<1)>>1]&8192)==0){X=L;break}else{O=L;A=33}}J=K;L=M;I=M;while(1){do{if((J|0)==0){Y=0}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){Y=J;break}if(!((kc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1)){Y=J;break}c[w>>2]=0;Y=0}}while(0);S=(Y|0)==0;do{if((I|0)==0){Z=L;A=46}else{if((c[I+12>>2]|0)!=(c[I+16>>2]|0)){if(S){_=L;$=I;break}else{W=X;break d}}if((kc[c[(c[I>>2]|0)+36>>2]&63](I)|0)==-1){c[z>>2]=0;Z=0;A=46;break}else{if(S^(L|0)==0){_=L;$=L;break}else{W=X;break d}}}}while(0);if((A|0)==46){A=0;if(S){W=X;break d}else{_=Z;$=0}}aa=Y+12|0;ba=c[aa>>2]|0;ca=Y+16|0;if((ba|0)==(c[ca>>2]|0)){da=kc[c[(c[Y>>2]|0)+36>>2]&63](Y)|0}else{da=d[ba]|0}if(!((da&255)<<24>>24>-1)){W=X;break d}if((b[(c[x>>2]|0)+(da<<24>>24<<1)>>1]&8192)==0){W=X;break d}ba=c[aa>>2]|0;if((ba|0)==(c[ca>>2]|0)){kc[c[(c[Y>>2]|0)+40>>2]&63](Y)|0;J=Y;L=_;I=$;continue}else{c[aa>>2]=ba+1;J=Y;L=_;I=$;continue}}}else if((A|0)==60){A=0;I=c[P>>2]|0;if((I|0)==(c[Q>>2]|0)){kc[c[(c[K>>2]|0)+40>>2]&63](K)|0}else{c[P>>2]=I+1}W=G+1|0}}while(0);if((W|0)==(n|0)){A=65;break a}G=W;H=c[k>>2]|0}if((A|0)==20){c[k>>2]=4;ea=K;break}else if((A|0)==23){c[k>>2]=4;ea=K;break}else if((A|0)==26){c[k>>2]=4;ea=K;break}}}while(0);if((A|0)==65){ea=c[w>>2]|0}w=g;do{if((ea|0)==0){fa=0}else{if((c[ea+12>>2]|0)!=(c[ea+16>>2]|0)){fa=ea;break}if(!((kc[c[(c[ea>>2]|0)+36>>2]&63](ea)|0)==-1)){fa=ea;break}c[w>>2]=0;fa=0}}while(0);w=(fa|0)==0;ea=h;h=c[ea>>2]|0;e:do{if((h|0)==0){A=75}else{do{if((c[h+12>>2]|0)==(c[h+16>>2]|0)){if(!((kc[c[(c[h>>2]|0)+36>>2]&63](h)|0)==-1)){break}c[ea>>2]=0;A=75;break e}}while(0);if(!w){break}ga=e;c[ga>>2]=fa;i=o;return}}while(0);do{if((A|0)==75){if(w){break}ga=e;c[ga>>2]=fa;i=o;return}}while(0);c[k>>2]=c[k>>2]|2;ga=e;c[ga>>2]=fa;i=o;return}function Gh(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Hh(a){a=a|0;i=i;return}function Ih(a){a=a|0;i=i;return 2}function Jh(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 j=0,k=0,l=0,m=0,n=0;j=i;i=i+32|0;k=j;l=j+8|0;m=j+16|0;n=j+24|0;c[m>>2]=c[d>>2];c[n>>2]=c[e>>2];e=l;d=m;c[e+0>>2]=c[d+0>>2];d=k;e=n;c[d+0>>2]=c[e+0>>2];Fh(a,b,l,k,f,g,h,6208,6216|0);i=j;return}function Kh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=i;i=i+32|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=d+8|0;q=kc[c[(c[p>>2]|0)+20>>2]&63](p)|0;c[n>>2]=c[e>>2];c[o>>2]=c[f>>2];f=a[q]|0;if((f&1)==0){r=q+1|0;s=q+1|0;t=(f&255)>>>1}else{f=c[q+8>>2]|0;r=f;s=f;t=c[q+4>>2]|0}q=r+t|0;t=m;r=n;c[t+0>>2]=c[r+0>>2];r=l;t=o;c[r+0>>2]=c[t+0>>2];Fh(b,d,m,l,g,h,j,s,q);i=k;return}function Lh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Pe(n,f);f=n;n=c[f>>2]|0;if(!((c[1826]|0)==-1)){c[m>>2]=7304;c[m+4>>2]=113;c[m+8>>2]=0;qe(7304,m,114)}m=(c[7308>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=kc[c[c[e>>2]>>2]&63](e)|0;c[l>>2]=f;f=b+168|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=fg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=168){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+24>>2]=((g|0)/12|0|0)%7|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Mh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Pe(n,f);f=n;n=c[f>>2]|0;if(!((c[1826]|0)==-1)){c[m>>2]=7304;c[m+4>>2]=113;c[m+8>>2]=0;qe(7304,m,114)}m=(c[7308>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=kc[c[(c[e>>2]|0)+4>>2]&63](e)|0;c[l>>2]=f;f=b+288|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=fg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=288){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+16>>2]=((g|0)/12|0|0)%12|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Nh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+40|0;j=b;k=b+8|0;l=b+16|0;m=b+32|0;Pe(m,f);f=m;m=c[f>>2]|0;if(!((c[1826]|0)==-1)){c[l>>2]=7304;c[l+4>>2]=113;c[l+8>>2]=0;qe(7304,l,114)}l=(c[7308>>2]|0)+ -1|0;n=c[m+8>>2]|0;if(!((c[m+12>>2]|0)-n>>2>>>0>l>>>0)){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}m=c[n+(l<<2)>>2]|0;if((m|0)==0){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}o=m;Yd(c[f>>2]|0)|0;f=h+20|0;c[k>>2]=c[e>>2];e=j;h=k;c[e+0>>2]=c[h+0>>2];h=Rh(d,j,g,o,4)|0;if((c[g>>2]&4|0)!=0){q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}if((h|0)<69){t=h+2e3|0}else{t=(h+ -69|0)>>>0<31?h+1900|0:h}c[f>>2]=t+ -1900;q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}function Oh(b,d,e,f,g,h,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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,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;l=i;i=i+576|0;m=l;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+312|0;_=l+320|0;$=l+328|0;aa=l+336|0;ba=l+344|0;ca=l+352|0;da=l+368|0;ea=l+376|0;fa=l+384|0;ga=l+392|0;ha=l+400|0;ia=l+408|0;ja=l+416|0;ka=l+424|0;la=l+432|0;ma=l+440|0;na=l+448|0;oa=l+456|0;pa=l+464|0;qa=l+472|0;ra=l+480|0;sa=l+488|0;ta=l+496|0;ua=l+504|0;va=l+512|0;wa=l+520|0;xa=l+528|0;ya=l+536|0;za=l+544|0;Aa=l+552|0;Ba=l+560|0;Ca=l+568|0;c[h>>2]=0;Pe(da,g);Da=da;da=c[Da>>2]|0;if(!((c[1826]|0)==-1)){c[ca>>2]=7304;c[ca+4>>2]=113;c[ca+8>>2]=0;qe(7304,ca,114)}ca=(c[7308>>2]|0)+ -1|0;Ea=c[da+8>>2]|0;if(!((c[da+12>>2]|0)-Ea>>2>>>0>ca>>>0)){Fa=Ta(4)|0;Ga=Fa;mm(Ga);Vb(Fa|0,15264,101)}da=c[Ea+(ca<<2)>>2]|0;if((da|0)==0){Fa=Ta(4)|0;Ga=Fa;mm(Ga);Vb(Fa|0,15264,101)}Fa=da;Yd(c[Da>>2]|0)|0;a:do{switch(k<<24>>24|0){case 65:case 97:{Da=c[f>>2]|0;da=d+8|0;Ga=kc[c[c[da>>2]>>2]&63](da)|0;c[ba>>2]=Da;c[Q+0>>2]=c[ba+0>>2];Da=(fg(e,Q,Ga,Ga+168|0,Fa,h,0)|0)-Ga|0;if((Da|0)>=168){break a}c[j+24>>2]=((Da|0)/12|0|0)%7|0;break};case 104:case 66:case 98:{Da=c[f>>2]|0;Ga=d+8|0;da=kc[c[(c[Ga>>2]|0)+4>>2]&63](Ga)|0;c[aa>>2]=Da;c[P+0>>2]=c[aa+0>>2];Da=(fg(e,P,da,da+288|0,Fa,h,0)|0)-da|0;if((Da|0)>=288){break a}c[j+16>>2]=((Da|0)/12|0|0)%12|0;break};case 73:{Da=j+8|0;c[Z>>2]=c[f>>2];c[G+0>>2]=c[Z+0>>2];da=Rh(e,G,h,Fa,2)|0;Ga=c[h>>2]|0;do{if((Ga&4|0)==0){if(!((da+ -1|0)>>>0<12)){break}c[Da>>2]=da;break a}}while(0);c[h>>2]=Ga|4;break};case 99:{da=d+8|0;Da=kc[c[(c[da>>2]|0)+12>>2]&63](da)|0;da=e;c[fa>>2]=c[da>>2];c[ga>>2]=c[f>>2];ca=a[Da]|0;if((ca&1)==0){Ha=Da+1|0;Ia=Da+1|0;Ja=(ca&255)>>>1}else{ca=c[Da+8>>2]|0;Ha=ca;Ia=ca;Ja=c[Da+4>>2]|0}c[O+0>>2]=c[fa+0>>2];c[N+0>>2]=c[ga+0>>2];Fh(ea,d,O,N,g,h,j,Ia,Ha+Ja|0);c[da>>2]=c[ea>>2];break};case 106:{c[Y>>2]=c[f>>2];c[F+0>>2]=c[Y+0>>2];da=Rh(e,F,h,Fa,3)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<366){c[j+28>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 101:case 100:{Da=j+12|0;c[$>>2]=c[f>>2];c[M+0>>2]=c[$+0>>2];da=Rh(e,M,h,Fa,2)|0;ca=c[h>>2]|0;do{if((ca&4|0)==0){if(!((da+ -1|0)>>>0<31)){break}c[Da>>2]=da;break a}}while(0);c[h>>2]=ca|4;break};case 72:{c[_>>2]=c[f>>2];c[H+0>>2]=c[_+0>>2];da=Rh(e,H,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<24){c[j+8>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 109:{c[X>>2]=c[f>>2];c[E+0>>2]=c[X+0>>2];Da=Rh(e,E,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(Da|0)<13){c[j+16>>2]=Da+ -1;break a}else{c[h>>2]=da|4;break a}break};case 77:{c[W>>2]=c[f>>2];c[D+0>>2]=c[W+0>>2];da=Rh(e,D,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<60){c[j+4>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 116:case 110:{c[na>>2]=c[f>>2];c[C+0>>2]=c[na+0>>2];Ph(0,e,C,h,Fa);break};case 112:{Da=j+8|0;da=c[f>>2]|0;Ga=d+8|0;Ea=kc[c[(c[Ga>>2]|0)+8>>2]&63](Ga)|0;Ga=a[Ea]|0;if((Ga&1)==0){Ka=(Ga&255)>>>1}else{Ka=c[Ea+4>>2]|0}Ga=a[Ea+12|0]|0;if((Ga&1)==0){La=(Ga&255)>>>1}else{La=c[Ea+16>>2]|0}if((Ka|0)==(0-La|0)){c[h>>2]=c[h>>2]|4;break a}c[V>>2]=da;c[B+0>>2]=c[V+0>>2];da=fg(e,B,Ea,Ea+24|0,Fa,h,0)|0;Ga=da-Ea|0;do{if((da|0)==(Ea|0)){if((c[Da>>2]|0)!=12){break}c[Da>>2]=0;break a}}while(0);if((Ga|0)!=12){break a}Ea=c[Da>>2]|0;if((Ea|0)>=12){break a}c[Da>>2]=Ea+12;break};case 114:{Ea=e;c[pa>>2]=c[Ea>>2];c[qa>>2]=c[f>>2];c[A+0>>2]=c[pa+0>>2];c[z+0>>2]=c[qa+0>>2];Fh(oa,d,A,z,g,h,j,6232,6243|0);c[Ea>>2]=c[oa>>2];break};case 82:{Ea=e;c[sa>>2]=c[Ea>>2];c[ta>>2]=c[f>>2];c[y+0>>2]=c[sa+0>>2];c[x+0>>2]=c[ta+0>>2];Fh(ra,d,y,x,g,h,j,6248,6253|0);c[Ea>>2]=c[ra>>2];break};case 83:{c[U>>2]=c[f>>2];c[w+0>>2]=c[U+0>>2];Ea=Rh(e,w,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(Ea|0)<61){c[j>>2]=Ea;break a}else{c[h>>2]=da|4;break a}break};case 84:{da=e;c[va>>2]=c[da>>2];c[wa>>2]=c[f>>2];c[v+0>>2]=c[va+0>>2];c[u+0>>2]=c[wa+0>>2];Fh(ua,d,v,u,g,h,j,6256,6264|0);c[da>>2]=c[ua>>2];break};case 119:{c[T>>2]=c[f>>2];c[t+0>>2]=c[T+0>>2];da=Rh(e,t,h,Fa,1)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(da|0)<7){c[j+24>>2]=da;break a}else{c[h>>2]=Ea|4;break a}break};case 120:{Ea=c[(c[d>>2]|0)+20>>2]|0;c[xa>>2]=c[e>>2];c[ya>>2]=c[f>>2];c[s+0>>2]=c[xa+0>>2];c[r+0>>2]=c[ya+0>>2];fc[Ea&63](b,d,s,r,g,h,j);i=l;return};case 88:{Ea=d+8|0;da=kc[c[(c[Ea>>2]|0)+24>>2]&63](Ea)|0;Ea=e;c[Aa>>2]=c[Ea>>2];c[Ba>>2]=c[f>>2];ca=a[da]|0;if((ca&1)==0){Ma=da+1|0;Na=da+1|0;Oa=(ca&255)>>>1}else{ca=c[da+8>>2]|0;Ma=ca;Na=ca;Oa=c[da+4>>2]|0}c[q+0>>2]=c[Aa+0>>2];c[p+0>>2]=c[Ba+0>>2];Fh(za,d,q,p,g,h,j,Na,Ma+Oa|0);c[Ea>>2]=c[za>>2];break};case 121:{c[S>>2]=c[f>>2];c[o+0>>2]=c[S+0>>2];Ea=Rh(e,o,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}if((Ea|0)<69){Pa=Ea+2e3|0}else{Pa=(Ea+ -69|0)>>>0<31?Ea+1900|0:Ea}c[j+20>>2]=Pa+ -1900;break};case 89:{c[R>>2]=c[f>>2];c[n+0>>2]=c[R+0>>2];Ea=Rh(e,n,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}c[j+20>>2]=Ea+ -1900;break};case 37:{c[Ca>>2]=c[f>>2];c[m+0>>2]=c[Ca+0>>2];Qh(0,e,m,h,Fa);break};case 70:{Ea=e;c[la>>2]=c[Ea>>2];c[ma>>2]=c[f>>2];c[J+0>>2]=c[la+0>>2];c[I+0>>2]=c[ma+0>>2];Fh(ka,d,J,I,g,h,j,6224,6232|0);c[Ea>>2]=c[ka>>2];break};case 68:{Ea=e;c[ia>>2]=c[Ea>>2];c[ja>>2]=c[f>>2];c[L+0>>2]=c[ia+0>>2];c[K+0>>2]=c[ja+0>>2];Fh(ha,d,L,K,g,h,j,6216,6224|0);c[Ea>>2]=c[ha>>2];break};default:{c[h>>2]=c[h>>2]|4}}}while(0);c[b>>2]=c[e>>2];i=l;return}function Ph(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a=i;j=e;e=f;f=h+8|0;a:while(1){h=c[j>>2]|0;do{if((h|0)==0){k=0}else{if((c[h+12>>2]|0)!=(c[h+16>>2]|0)){k=h;break}if((kc[c[(c[h>>2]|0)+36>>2]&63](h)|0)==-1){c[j>>2]=0;k=0;break}else{k=c[j>>2]|0;break}}}while(0);h=(k|0)==0;l=c[e>>2]|0;do{if((l|0)==0){m=12}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){if(h){n=l;break}else{o=l;break a}}if((kc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1){c[e>>2]=0;m=12;break}else{if(h){n=l;break}else{o=l;break a}}}}while(0);if((m|0)==12){m=0;if(h){o=0;break}else{n=0}}l=c[j>>2]|0;p=c[l+12>>2]|0;if((p|0)==(c[l+16>>2]|0)){q=kc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{q=d[p]|0}if(!((q&255)<<24>>24>-1)){o=n;break}if((b[(c[f>>2]|0)+(q<<24>>24<<1)>>1]&8192)==0){o=n;break}p=c[j>>2]|0;l=p+12|0;r=c[l>>2]|0;if((r|0)==(c[p+16>>2]|0)){kc[c[(c[p>>2]|0)+40>>2]&63](p)|0;continue}else{c[l>>2]=r+1;continue}}n=c[j>>2]|0;do{if((n|0)==0){s=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){s=n;break}if((kc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1){c[j>>2]=0;s=0;break}else{s=c[j>>2]|0;break}}}while(0);j=(s|0)==0;b:do{if((o|0)==0){m=32}else{do{if((c[o+12>>2]|0)==(c[o+16>>2]|0)){if(!((kc[c[(c[o>>2]|0)+36>>2]&63](o)|0)==-1)){break}c[e>>2]=0;m=32;break b}}while(0);if(!j){break}i=a;return}}while(0);do{if((m|0)==32){if(j){break}i=a;return}}while(0);c[g>>2]=c[g>>2]|2;i=a;return}function Qh(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;a=i;h=b;b=c[h>>2]|0;do{if((b|0)==0){j=0}else{if((c[b+12>>2]|0)!=(c[b+16>>2]|0)){j=b;break}if((kc[c[(c[b>>2]|0)+36>>2]&63](b)|0)==-1){c[h>>2]=0;j=0;break}else{j=c[h>>2]|0;break}}}while(0);b=(j|0)==0;j=e;e=c[j>>2]|0;a:do{if((e|0)==0){k=11}else{do{if((c[e+12>>2]|0)==(c[e+16>>2]|0)){if(!((kc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){break}c[j>>2]=0;k=11;break a}}while(0);if(b){l=e}else{k=12}}}while(0);if((k|0)==11){if(b){k=12}else{l=0}}if((k|0)==12){c[f>>2]=c[f>>2]|6;i=a;return}b=c[h>>2]|0;e=c[b+12>>2]|0;if((e|0)==(c[b+16>>2]|0)){m=kc[c[(c[b>>2]|0)+36>>2]&63](b)|0}else{m=d[e]|0}if(!((ec[c[(c[g>>2]|0)+36>>2]&31](g,m&255,0)|0)<<24>>24==37)){c[f>>2]=c[f>>2]|4;i=a;return}m=c[h>>2]|0;g=m+12|0;e=c[g>>2]|0;if((e|0)==(c[m+16>>2]|0)){kc[c[(c[m>>2]|0)+40>>2]&63](m)|0}else{c[g>>2]=e+1}e=c[h>>2]|0;do{if((e|0)==0){n=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){n=e;break}if((kc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1){c[h>>2]=0;n=0;break}else{n=c[h>>2]|0;break}}}while(0);h=(n|0)==0;b:do{if((l|0)==0){k=31}else{do{if((c[l+12>>2]|0)==(c[l+16>>2]|0)){if(!((kc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1)){break}c[j>>2]=0;k=31;break b}}while(0);if(!h){break}i=a;return}}while(0);do{if((k|0)==31){if(h){break}i=a;return}}while(0);c[f>>2]=c[f>>2]|2;i=a;return}function Rh(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|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,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;j=i;k=a;a=c[k>>2]|0;do{if((a|0)==0){l=0}else{if((c[a+12>>2]|0)!=(c[a+16>>2]|0)){l=a;break}if((kc[c[(c[a>>2]|0)+36>>2]&63](a)|0)==-1){c[k>>2]=0;l=0;break}else{l=c[k>>2]|0;break}}}while(0);a=(l|0)==0;l=e;e=c[l>>2]|0;a:do{if((e|0)==0){m=11}else{do{if((c[e+12>>2]|0)==(c[e+16>>2]|0)){if(!((kc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){break}c[l>>2]=0;m=11;break a}}while(0);if(a){n=e}else{m=12}}}while(0);if((m|0)==11){if(a){m=12}else{n=0}}if((m|0)==12){c[f>>2]=c[f>>2]|6;o=0;i=j;return o|0}a=c[k>>2]|0;e=c[a+12>>2]|0;if((e|0)==(c[a+16>>2]|0)){p=kc[c[(c[a>>2]|0)+36>>2]&63](a)|0}else{p=d[e]|0}e=p&255;do{if(e<<24>>24>-1){a=g+8|0;if((b[(c[a>>2]|0)+(p<<24>>24<<1)>>1]&2048)==0){break}q=g;r=(ec[c[(c[q>>2]|0)+36>>2]&31](g,e,0)|0)<<24>>24;s=c[k>>2]|0;t=s+12|0;u=c[t>>2]|0;if((u|0)==(c[s+16>>2]|0)){kc[c[(c[s>>2]|0)+40>>2]&63](s)|0;v=h;w=n;x=n;y=r}else{c[t>>2]=u+1;v=h;w=n;x=n;y=r}while(1){z=y+ -48|0;r=v+ -1|0;u=c[k>>2]|0;do{if((u|0)==0){A=0}else{if((c[u+12>>2]|0)!=(c[u+16>>2]|0)){A=u;break}if((kc[c[(c[u>>2]|0)+36>>2]&63](u)|0)==-1){c[k>>2]=0;A=0;break}else{A=c[k>>2]|0;break}}}while(0);u=(A|0)==0;do{if((x|0)==0){B=w;C=0}else{if((c[x+12>>2]|0)!=(c[x+16>>2]|0)){B=w;C=x;break}if(!((kc[c[(c[x>>2]|0)+36>>2]&63](x)|0)==-1)){B=w;C=w;break}c[l>>2]=0;B=0;C=0}}while(0);D=c[k>>2]|0;if(!((u^(C|0)==0)&(r|0)>0)){m=40;break}t=c[D+12>>2]|0;if((t|0)==(c[D+16>>2]|0)){E=kc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{E=d[t]|0}t=E&255;if(!(t<<24>>24>-1)){o=z;m=52;break}if((b[(c[a>>2]|0)+(E<<24>>24<<1)>>1]&2048)==0){o=z;m=52;break}s=((ec[c[(c[q>>2]|0)+36>>2]&31](g,t,0)|0)<<24>>24)+(z*10|0)|0;t=c[k>>2]|0;F=t+12|0;G=c[F>>2]|0;if((G|0)==(c[t+16>>2]|0)){kc[c[(c[t>>2]|0)+40>>2]&63](t)|0;H=r;w=B;x=C;y=s;v=H;continue}else{c[F>>2]=G+1;H=r;w=B;x=C;y=s;v=H;continue}}if((m|0)==40){do{if((D|0)==0){I=0}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){I=D;break}if((kc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[k>>2]=0;I=0;break}else{I=c[k>>2]|0;break}}}while(0);q=(I|0)==0;b:do{if((B|0)==0){m=50}else{do{if((c[B+12>>2]|0)==(c[B+16>>2]|0)){if(!((kc[c[(c[B>>2]|0)+36>>2]&63](B)|0)==-1)){break}c[l>>2]=0;m=50;break b}}while(0);if(q){o=z}else{break}i=j;return o|0}}while(0);do{if((m|0)==50){if(q){break}else{o=z}i=j;return o|0}}while(0);c[f>>2]=c[f>>2]|2;o=z;i=j;return o|0}else if((m|0)==52){i=j;return o|0}}}while(0);c[f>>2]=c[f>>2]|4;o=0;i=j;return o|0}function Sh(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;l=i;i=i+64|0;m=l;n=l+8|0;o=l+16|0;p=l+32|0;q=l+40|0;r=l+48|0;s=l+56|0;Pe(p,f);t=p;p=c[t>>2]|0;if(!((c[1824]|0)==-1)){c[o>>2]=7296;c[o+4>>2]=113;c[o+8>>2]=0;qe(7296,o,114)}o=(c[7300>>2]|0)+ -1|0;u=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-u>>2>>>0>o>>>0)){v=Ta(4)|0;w=v;mm(w);Vb(v|0,15264,101)}p=c[u+(o<<2)>>2]|0;if((p|0)==0){v=Ta(4)|0;w=v;mm(w);Vb(v|0,15264,101)}v=p;Yd(c[t>>2]|0)|0;c[g>>2]=0;t=d;a:do{if((j|0)==(k|0)){x=69}else{w=e;o=p;u=p;y=p;z=b;A=r;B=s;C=q;D=j;E=0;b:while(1){F=E;while(1){if((F|0)!=0){x=69;break a}G=c[t>>2]|0;do{if((G|0)==0){H=0;I=1}else{J=c[G+12>>2]|0;if((J|0)==(c[G+16>>2]|0)){K=kc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{K=c[J>>2]|0}if(!((K|0)==-1)){H=G;I=0;break}c[t>>2]=0;H=0;I=1}}while(0);G=c[w>>2]|0;do{if((G|0)==0){x=22}else{J=c[G+12>>2]|0;if((J|0)==(c[G+16>>2]|0)){L=kc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{L=c[J>>2]|0}if((L|0)==-1){c[w>>2]=0;x=22;break}else{if(I){M=G;break}else{x=24;break b}}}}while(0);if((x|0)==22){x=0;if(I){x=24;break b}else{M=0}}if((ec[c[(c[o>>2]|0)+52>>2]&31](v,c[D>>2]|0,0)|0)<<24>>24==37){x=26;break}if(ec[c[(c[u>>2]|0)+12>>2]&31](v,8192,c[D>>2]|0)|0){N=D;x=36;break}O=H+12|0;G=c[O>>2]|0;P=H+16|0;if((G|0)==(c[P>>2]|0)){Q=kc[c[(c[H>>2]|0)+36>>2]&63](H)|0}else{Q=c[G>>2]|0}G=tc[c[(c[y>>2]|0)+28>>2]&15](v,Q)|0;if((G|0)==(tc[c[(c[y>>2]|0)+28>>2]&15](v,c[D>>2]|0)|0)){x=64;break}c[g>>2]=4;F=4}c:do{if((x|0)==26){x=0;F=D+4|0;if((F|0)==(k|0)){x=27;break b}G=ec[c[(c[o>>2]|0)+52>>2]&31](v,c[F>>2]|0,0)|0;if(G<<24>>24==48|G<<24>>24==69){J=D+8|0;if((J|0)==(k|0)){x=30;break b}R=J;S=ec[c[(c[o>>2]|0)+52>>2]&31](v,c[J>>2]|0,0)|0;T=G}else{R=F;S=G;T=0}G=c[(c[z>>2]|0)+36>>2]|0;c[A>>2]=H;c[B>>2]=M;F=n;J=r;c[F+0>>2]=c[J+0>>2];J=m;F=s;c[J+0>>2]=c[F+0>>2];jc[G&3](q,b,n,m,f,g,h,S,T);c[t>>2]=c[C>>2];U=R+4|0}else if((x|0)==36){while(1){x=0;G=N+4|0;if((G|0)==(k|0)){V=k;break}if(ec[c[(c[u>>2]|0)+12>>2]&31](v,8192,c[G>>2]|0)|0){N=G;x=36}else{V=G;break}}G=H;F=M;J=M;while(1){do{if((G|0)==0){W=0;X=1}else{Y=c[G+12>>2]|0;if((Y|0)==(c[G+16>>2]|0)){Z=kc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{Z=c[Y>>2]|0}if(!((Z|0)==-1)){W=G;X=0;break}c[t>>2]=0;W=0;X=1}}while(0);do{if((J|0)==0){_=F;x=51}else{Y=c[J+12>>2]|0;if((Y|0)==(c[J+16>>2]|0)){$=kc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{$=c[Y>>2]|0}if(($|0)==-1){c[w>>2]=0;_=0;x=51;break}else{if(X^(F|0)==0){aa=F;ba=F;break}else{U=V;break c}}}}while(0);if((x|0)==51){x=0;if(X){U=V;break c}else{aa=_;ba=0}}Y=W+12|0;ca=c[Y>>2]|0;da=W+16|0;if((ca|0)==(c[da>>2]|0)){ea=kc[c[(c[W>>2]|0)+36>>2]&63](W)|0}else{ea=c[ca>>2]|0}if(!(ec[c[(c[u>>2]|0)+12>>2]&31](v,8192,ea)|0)){U=V;break c}ca=c[Y>>2]|0;if((ca|0)==(c[da>>2]|0)){kc[c[(c[W>>2]|0)+40>>2]&63](W)|0;G=W;F=aa;J=ba;continue}else{c[Y>>2]=ca+4;G=W;F=aa;J=ba;continue}}}else if((x|0)==64){x=0;J=c[O>>2]|0;if((J|0)==(c[P>>2]|0)){kc[c[(c[H>>2]|0)+40>>2]&63](H)|0}else{c[O>>2]=J+4}U=D+4|0}}while(0);if((U|0)==(k|0)){x=69;break a}D=U;E=c[g>>2]|0}if((x|0)==24){c[g>>2]=4;fa=H;break}else if((x|0)==27){c[g>>2]=4;fa=H;break}else if((x|0)==30){c[g>>2]=4;fa=H;break}}}while(0);if((x|0)==69){fa=c[t>>2]|0}t=d;do{if((fa|0)==0){ga=0;ha=1}else{d=c[fa+12>>2]|0;if((d|0)==(c[fa+16>>2]|0)){ia=kc[c[(c[fa>>2]|0)+36>>2]&63](fa)|0}else{ia=c[d>>2]|0}if(!((ia|0)==-1)){ga=fa;ha=0;break}c[t>>2]=0;ga=0;ha=1}}while(0);t=e;e=c[t>>2]|0;do{if((e|0)==0){x=82}else{fa=c[e+12>>2]|0;if((fa|0)==(c[e+16>>2]|0)){ja=kc[c[(c[e>>2]|0)+36>>2]&63](e)|0}else{ja=c[fa>>2]|0}if((ja|0)==-1){c[t>>2]=0;x=82;break}if(!ha){break}ka=a;c[ka>>2]=ga;i=l;return}}while(0);do{if((x|0)==82){if(ha){break}ka=a;c[ka>>2]=ga;i=l;return}}while(0);c[g>>2]=c[g>>2]|2;ka=a;c[ka>>2]=ga;i=l;return}function Th(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Uh(a){a=a|0;i=i;return}function Vh(a){a=a|0;i=i;return 2}function Wh(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 j=0,k=0,l=0,m=0,n=0;j=i;i=i+32|0;k=j;l=j+8|0;m=j+16|0;n=j+24|0;c[m>>2]=c[d>>2];c[n>>2]=c[e>>2];e=l;d=m;c[e+0>>2]=c[d+0>>2];d=k;e=n;c[d+0>>2]=c[e+0>>2];Sh(a,b,l,k,f,g,h,6360,6392|0);i=j;return}function Xh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=i;i=i+32|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=d+8|0;q=kc[c[(c[p>>2]|0)+20>>2]&63](p)|0;c[n>>2]=c[e>>2];c[o>>2]=c[f>>2];f=a[q]|0;if((f&1)==0){r=q+4|0;s=q+4|0;t=(f&255)>>>1}else{f=c[q+8>>2]|0;r=f;s=f;t=c[q+4>>2]|0}q=r+(t<<2)|0;t=m;r=n;c[t+0>>2]=c[r+0>>2];r=l;t=o;c[r+0>>2]=c[t+0>>2];Sh(b,d,m,l,g,h,j,s,q);i=k;return}function Yh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Pe(n,f);f=n;n=c[f>>2]|0;if(!((c[1824]|0)==-1)){c[m>>2]=7296;c[m+4>>2]=113;c[m+8>>2]=0;qe(7296,m,114)}m=(c[7300>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=kc[c[c[e>>2]>>2]&63](e)|0;c[l>>2]=f;f=b+168|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=Eg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=168){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+24>>2]=((g|0)/12|0|0)%7|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Zh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Pe(n,f);f=n;n=c[f>>2]|0;if(!((c[1824]|0)==-1)){c[m>>2]=7296;c[m+4>>2]=113;c[m+8>>2]=0;qe(7296,m,114)}m=(c[7300>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Ta(4)|0;q=p;mm(q);Vb(p|0,15264,101)}p=n;Yd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=kc[c[(c[e>>2]|0)+4>>2]&63](e)|0;c[l>>2]=f;f=b+288|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=Eg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=288){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+16>>2]=((g|0)/12|0|0)%12|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function _h(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+40|0;j=b;k=b+8|0;l=b+16|0;m=b+32|0;Pe(m,f);f=m;m=c[f>>2]|0;if(!((c[1824]|0)==-1)){c[l>>2]=7296;c[l+4>>2]=113;c[l+8>>2]=0;qe(7296,l,114)}l=(c[7300>>2]|0)+ -1|0;n=c[m+8>>2]|0;if(!((c[m+12>>2]|0)-n>>2>>>0>l>>>0)){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}m=c[n+(l<<2)>>2]|0;if((m|0)==0){o=Ta(4)|0;p=o;mm(p);Vb(o|0,15264,101)}o=m;Yd(c[f>>2]|0)|0;f=h+20|0;c[k>>2]=c[e>>2];e=j;h=k;c[e+0>>2]=c[h+0>>2];h=ci(d,j,g,o,4)|0;if((c[g>>2]&4|0)!=0){q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}if((h|0)<69){t=h+2e3|0}else{t=(h+ -69|0)>>>0<31?h+1900|0:h}c[f>>2]=t+ -1900;q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}function $h(b,d,e,f,g,h,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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,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;l=i;i=i+576|0;m=l;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+312|0;_=l+320|0;$=l+328|0;aa=l+336|0;ba=l+344|0;ca=l+352|0;da=l+368|0;ea=l+376|0;fa=l+384|0;ga=l+392|0;ha=l+400|0;ia=l+408|0;ja=l+416|0;ka=l+424|0;la=l+432|0;ma=l+440|0;na=l+448|0;oa=l+456|0;pa=l+464|0;qa=l+472|0;ra=l+480|0;sa=l+488|0;ta=l+496|0;ua=l+504|0;va=l+512|0;wa=l+520|0;xa=l+528|0;ya=l+536|0;za=l+544|0;Aa=l+552|0;Ba=l+560|0;Ca=l+568|0;c[h>>2]=0;Pe(da,g);Da=da;da=c[Da>>2]|0;if(!((c[1824]|0)==-1)){c[ca>>2]=7296;c[ca+4>>2]=113;c[ca+8>>2]=0;qe(7296,ca,114)}ca=(c[7300>>2]|0)+ -1|0;Ea=c[da+8>>2]|0;if(!((c[da+12>>2]|0)-Ea>>2>>>0>ca>>>0)){Fa=Ta(4)|0;Ga=Fa;mm(Ga);Vb(Fa|0,15264,101)}da=c[Ea+(ca<<2)>>2]|0;if((da|0)==0){Fa=Ta(4)|0;Ga=Fa;mm(Ga);Vb(Fa|0,15264,101)}Fa=da;Yd(c[Da>>2]|0)|0;a:do{switch(k<<24>>24|0){case 89:{c[R>>2]=c[f>>2];c[n+0>>2]=c[R+0>>2];Da=ci(e,n,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}c[j+20>>2]=Da+ -1900;break};case 120:{Da=c[(c[d>>2]|0)+20>>2]|0;c[xa>>2]=c[e>>2];c[ya>>2]=c[f>>2];c[s+0>>2]=c[xa+0>>2];c[r+0>>2]=c[ya+0>>2];fc[Da&63](b,d,s,r,g,h,j);i=l;return};case 101:case 100:{Da=j+12|0;c[$>>2]=c[f>>2];c[M+0>>2]=c[$+0>>2];da=ci(e,M,h,Fa,2)|0;Ga=c[h>>2]|0;do{if((Ga&4|0)==0){if(!((da+ -1|0)>>>0<31)){break}c[Da>>2]=da;break a}}while(0);c[h>>2]=Ga|4;break};case 112:{da=j+8|0;Da=c[f>>2]|0;ca=d+8|0;Ea=kc[c[(c[ca>>2]|0)+8>>2]&63](ca)|0;ca=a[Ea]|0;if((ca&1)==0){Ha=(ca&255)>>>1}else{Ha=c[Ea+4>>2]|0}ca=a[Ea+12|0]|0;if((ca&1)==0){Ia=(ca&255)>>>1}else{Ia=c[Ea+16>>2]|0}if((Ha|0)==(0-Ia|0)){c[h>>2]=c[h>>2]|4;break a}c[V>>2]=Da;c[B+0>>2]=c[V+0>>2];Da=Eg(e,B,Ea,Ea+24|0,Fa,h,0)|0;ca=Da-Ea|0;do{if((Da|0)==(Ea|0)){if((c[da>>2]|0)!=12){break}c[da>>2]=0;break a}}while(0);if((ca|0)!=12){break a}Ea=c[da>>2]|0;if((Ea|0)>=12){break a}c[da>>2]=Ea+12;break};case 119:{c[T>>2]=c[f>>2];c[t+0>>2]=c[T+0>>2];Ea=ci(e,t,h,Fa,1)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(Ea|0)<7){c[j+24>>2]=Ea;break a}else{c[h>>2]=Da|4;break a}break};case 121:{c[S>>2]=c[f>>2];c[o+0>>2]=c[S+0>>2];Da=ci(e,o,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}if((Da|0)<69){Ja=Da+2e3|0}else{Ja=(Da+ -69|0)>>>0<31?Da+1900|0:Da}c[j+20>>2]=Ja+ -1900;break};case 88:{Da=d+8|0;Ea=kc[c[(c[Da>>2]|0)+24>>2]&63](Da)|0;Da=e;c[Aa>>2]=c[Da>>2];c[Ba>>2]=c[f>>2];Ga=a[Ea]|0;if((Ga&1)==0){Ka=Ea+4|0;La=Ea+4|0;Ma=(Ga&255)>>>1}else{Ga=c[Ea+8>>2]|0;Ka=Ga;La=Ga;Ma=c[Ea+4>>2]|0}c[q+0>>2]=c[Aa+0>>2];c[p+0>>2]=c[Ba+0>>2];Sh(za,d,q,p,g,h,j,La,Ka+(Ma<<2)|0);c[Da>>2]=c[za>>2];break};case 68:{Da=e;c[ia>>2]=c[Da>>2];c[ja>>2]=c[f>>2];c[L+0>>2]=c[ia+0>>2];c[K+0>>2]=c[ja+0>>2];Sh(ha,d,L,K,g,h,j,6392,6424|0);c[Da>>2]=c[ha>>2];break};case 70:{Da=e;c[la>>2]=c[Da>>2];c[ma>>2]=c[f>>2];c[J+0>>2]=c[la+0>>2];c[I+0>>2]=c[ma+0>>2];Sh(ka,d,J,I,g,h,j,6424,6456|0);c[Da>>2]=c[ka>>2];break};case 72:{c[_>>2]=c[f>>2];c[H+0>>2]=c[_+0>>2];Da=ci(e,H,h,Fa,2)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(Da|0)<24){c[j+8>>2]=Da;break a}else{c[h>>2]=Ea|4;break a}break};case 73:{Ea=j+8|0;c[Z>>2]=c[f>>2];c[G+0>>2]=c[Z+0>>2];Da=ci(e,G,h,Fa,2)|0;Ga=c[h>>2]|0;do{if((Ga&4|0)==0){if(!((Da+ -1|0)>>>0<12)){break}c[Ea>>2]=Da;break a}}while(0);c[h>>2]=Ga|4;break};case 106:{c[Y>>2]=c[f>>2];c[F+0>>2]=c[Y+0>>2];Da=ci(e,F,h,Fa,3)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(Da|0)<366){c[j+28>>2]=Da;break a}else{c[h>>2]=Ea|4;break a}break};case 109:{c[X>>2]=c[f>>2];c[E+0>>2]=c[X+0>>2];Ea=ci(e,E,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(Ea|0)<13){c[j+16>>2]=Ea+ -1;break a}else{c[h>>2]=Da|4;break a}break};case 65:case 97:{Da=c[f>>2]|0;Ea=d+8|0;da=kc[c[c[Ea>>2]>>2]&63](Ea)|0;c[ba>>2]=Da;c[Q+0>>2]=c[ba+0>>2];Da=(Eg(e,Q,da,da+168|0,Fa,h,0)|0)-da|0;if((Da|0)>=168){break a}c[j+24>>2]=((Da|0)/12|0|0)%7|0;break};case 104:case 66:case 98:{Da=c[f>>2]|0;da=d+8|0;Ea=kc[c[(c[da>>2]|0)+4>>2]&63](da)|0;c[aa>>2]=Da;c[P+0>>2]=c[aa+0>>2];Da=(Eg(e,P,Ea,Ea+288|0,Fa,h,0)|0)-Ea|0;if((Da|0)>=288){break a}c[j+16>>2]=((Da|0)/12|0|0)%12|0;break};case 99:{Da=d+8|0;Ea=kc[c[(c[Da>>2]|0)+12>>2]&63](Da)|0;Da=e;c[fa>>2]=c[Da>>2];c[ga>>2]=c[f>>2];da=a[Ea]|0;if((da&1)==0){Na=Ea+4|0;Oa=Ea+4|0;Pa=(da&255)>>>1}else{da=c[Ea+8>>2]|0;Na=da;Oa=da;Pa=c[Ea+4>>2]|0}c[O+0>>2]=c[fa+0>>2];c[N+0>>2]=c[ga+0>>2];Sh(ea,d,O,N,g,h,j,Oa,Na+(Pa<<2)|0);c[Da>>2]=c[ea>>2];break};case 114:{Da=e;c[pa>>2]=c[Da>>2];c[qa>>2]=c[f>>2];c[A+0>>2]=c[pa+0>>2];c[z+0>>2]=c[qa+0>>2];Sh(oa,d,A,z,g,h,j,6456,6500|0);c[Da>>2]=c[oa>>2];break};case 82:{Da=e;c[sa>>2]=c[Da>>2];c[ta>>2]=c[f>>2];c[y+0>>2]=c[sa+0>>2];c[x+0>>2]=c[ta+0>>2];Sh(ra,d,y,x,g,h,j,6504,6524|0);c[Da>>2]=c[ra>>2];break};case 83:{c[U>>2]=c[f>>2];c[w+0>>2]=c[U+0>>2];Da=ci(e,w,h,Fa,2)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(Da|0)<61){c[j>>2]=Da;break a}else{c[h>>2]=Ea|4;break a}break};case 84:{Ea=e;c[va>>2]=c[Ea>>2];c[wa>>2]=c[f>>2];c[v+0>>2]=c[va+0>>2];c[u+0>>2]=c[wa+0>>2];Sh(ua,d,v,u,g,h,j,6528,6560|0);c[Ea>>2]=c[ua>>2];break};case 37:{c[Ca>>2]=c[f>>2];c[m+0>>2]=c[Ca+0>>2];bi(0,e,m,h,Fa);break};case 116:case 110:{c[na>>2]=c[f>>2];c[C+0>>2]=c[na+0>>2];ai(0,e,C,h,Fa);break};case 77:{c[W>>2]=c[f>>2];c[D+0>>2]=c[W+0>>2];Ea=ci(e,D,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(Ea|0)<60){c[j+4>>2]=Ea;break a}else{c[h>>2]=Da|4;break a}break};default:{c[h>>2]=c[h>>2]|4}}}while(0);c[b>>2]=c[e>>2];i=l;return}function ai(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;a=i;g=b;b=d;d=f;a:while(1){h=c[g>>2]|0;do{if((h|0)==0){j=1}else{k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){l=kc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{l=c[k>>2]|0}if((l|0)==-1){c[g>>2]=0;j=1;break}else{j=(c[g>>2]|0)==0;break}}}while(0);h=c[b>>2]|0;do{if((h|0)==0){m=15}else{k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){n=kc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{n=c[k>>2]|0}if((n|0)==-1){c[b>>2]=0;m=15;break}else{if(j){o=h;break}else{p=h;break a}}}}while(0);if((m|0)==15){m=0;if(j){p=0;break}else{o=0}}h=c[g>>2]|0;k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){q=kc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{q=c[k>>2]|0}if(!(ec[c[(c[d>>2]|0)+12>>2]&31](f,8192,q)|0)){p=o;break}k=c[g>>2]|0;h=k+12|0;r=c[h>>2]|0;if((r|0)==(c[k+16>>2]|0)){kc[c[(c[k>>2]|0)+40>>2]&63](k)|0;continue}else{c[h>>2]=r+4;continue}}o=c[g>>2]|0;do{if((o|0)==0){s=1}else{q=c[o+12>>2]|0;if((q|0)==(c[o+16>>2]|0)){t=kc[c[(c[o>>2]|0)+36>>2]&63](o)|0}else{t=c[q>>2]|0}if((t|0)==-1){c[g>>2]=0;s=1;break}else{s=(c[g>>2]|0)==0;break}}}while(0);do{if((p|0)==0){m=37}else{g=c[p+12>>2]|0;if((g|0)==(c[p+16>>2]|0)){u=kc[c[(c[p>>2]|0)+36>>2]&63](p)|0}else{u=c[g>>2]|0}if((u|0)==-1){c[b>>2]=0;m=37;break}if(!s){break}i=a;return}}while(0);do{if((m|0)==37){if(s){break}i=a;return}}while(0);c[e>>2]=c[e>>2]|2;i=a;return}function bi(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a=i;g=b;b=c[g>>2]|0;do{if((b|0)==0){h=1}else{j=c[b+12>>2]|0;if((j|0)==(c[b+16>>2]|0)){k=kc[c[(c[b>>2]|0)+36>>2]&63](b)|0}else{k=c[j>>2]|0}if((k|0)==-1){c[g>>2]=0;h=1;break}else{h=(c[g>>2]|0)==0;break}}}while(0);k=d;d=c[k>>2]|0;do{if((d|0)==0){l=14}else{b=c[d+12>>2]|0;if((b|0)==(c[d+16>>2]|0)){m=kc[c[(c[d>>2]|0)+36>>2]&63](d)|0}else{m=c[b>>2]|0}if((m|0)==-1){c[k>>2]=0;l=14;break}else{if(h){n=d;break}else{l=16;break}}}}while(0);if((l|0)==14){if(h){l=16}else{n=0}}if((l|0)==16){c[e>>2]=c[e>>2]|6;i=a;return}h=c[g>>2]|0;d=c[h+12>>2]|0;if((d|0)==(c[h+16>>2]|0)){o=kc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{o=c[d>>2]|0}if(!((ec[c[(c[f>>2]|0)+52>>2]&31](f,o,0)|0)<<24>>24==37)){c[e>>2]=c[e>>2]|4;i=a;return}o=c[g>>2]|0;f=o+12|0;d=c[f>>2]|0;if((d|0)==(c[o+16>>2]|0)){kc[c[(c[o>>2]|0)+40>>2]&63](o)|0}else{c[f>>2]=d+4}d=c[g>>2]|0;do{if((d|0)==0){p=1}else{f=c[d+12>>2]|0;if((f|0)==(c[d+16>>2]|0)){q=kc[c[(c[d>>2]|0)+36>>2]&63](d)|0}else{q=c[f>>2]|0}if((q|0)==-1){c[g>>2]=0;p=1;break}else{p=(c[g>>2]|0)==0;break}}}while(0);do{if((n|0)==0){l=38}else{g=c[n+12>>2]|0;if((g|0)==(c[n+16>>2]|0)){r=kc[c[(c[n>>2]|0)+36>>2]&63](n)|0}else{r=c[g>>2]|0}if((r|0)==-1){c[k>>2]=0;l=38;break}if(!p){break}i=a;return}}while(0);do{if((l|0)==38){if(p){break}i=a;return}}while(0);c[e>>2]=c[e>>2]|2;i=a;return}function ci(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,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;g=i;h=a;a=c[h>>2]|0;do{if((a|0)==0){j=1}else{k=c[a+12>>2]|0;if((k|0)==(c[a+16>>2]|0)){l=kc[c[(c[a>>2]|0)+36>>2]&63](a)|0}else{l=c[k>>2]|0}if((l|0)==-1){c[h>>2]=0;j=1;break}else{j=(c[h>>2]|0)==0;break}}}while(0);l=b;b=c[l>>2]|0;do{if((b|0)==0){m=14}else{a=c[b+12>>2]|0;if((a|0)==(c[b+16>>2]|0)){n=kc[c[(c[b>>2]|0)+36>>2]&63](b)|0}else{n=c[a>>2]|0}if((n|0)==-1){c[l>>2]=0;m=14;break}else{if(j){o=b;break}else{m=16;break}}}}while(0);if((m|0)==14){if(j){m=16}else{o=0}}if((m|0)==16){c[d>>2]=c[d>>2]|6;p=0;i=g;return p|0}j=c[h>>2]|0;b=c[j+12>>2]|0;if((b|0)==(c[j+16>>2]|0)){q=kc[c[(c[j>>2]|0)+36>>2]&63](j)|0}else{q=c[b>>2]|0}b=e;if(!(ec[c[(c[b>>2]|0)+12>>2]&31](e,2048,q)|0)){c[d>>2]=c[d>>2]|4;p=0;i=g;return p|0}j=e;n=(ec[c[(c[j>>2]|0)+52>>2]&31](e,q,0)|0)<<24>>24;q=c[h>>2]|0;a=q+12|0;k=c[a>>2]|0;if((k|0)==(c[q+16>>2]|0)){kc[c[(c[q>>2]|0)+40>>2]&63](q)|0;r=f;s=o;t=o;u=n}else{c[a>>2]=k+4;r=f;s=o;t=o;u=n}while(1){v=u+ -48|0;n=r+ -1|0;o=c[h>>2]|0;do{if((o|0)==0){w=1}else{f=c[o+12>>2]|0;if((f|0)==(c[o+16>>2]|0)){x=kc[c[(c[o>>2]|0)+36>>2]&63](o)|0}else{x=c[f>>2]|0}if((x|0)==-1){c[h>>2]=0;w=1;break}else{w=(c[h>>2]|0)==0;break}}}while(0);do{if((t|0)==0){y=s;z=0;A=1}else{o=c[t+12>>2]|0;if((o|0)==(c[t+16>>2]|0)){B=kc[c[(c[t>>2]|0)+36>>2]&63](t)|0}else{B=c[o>>2]|0}if((B|0)==-1){c[l>>2]=0;y=0;z=0;A=1;break}else{y=s;z=s;A=(s|0)==0;break}}}while(0);C=c[h>>2]|0;if(!((w^A)&(n|0)>0)){break}o=c[C+12>>2]|0;if((o|0)==(c[C+16>>2]|0)){D=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{D=c[o>>2]|0}if(!(ec[c[(c[b>>2]|0)+12>>2]&31](e,2048,D)|0)){p=v;m=63;break}o=((ec[c[(c[j>>2]|0)+52>>2]&31](e,D,0)|0)<<24>>24)+(v*10|0)|0;f=c[h>>2]|0;k=f+12|0;a=c[k>>2]|0;if((a|0)==(c[f+16>>2]|0)){kc[c[(c[f>>2]|0)+40>>2]&63](f)|0;E=n;s=y;t=z;u=o;r=E;continue}else{c[k>>2]=a+4;E=n;s=y;t=z;u=o;r=E;continue}}if((m|0)==63){i=g;return p|0}do{if((C|0)==0){F=1}else{E=c[C+12>>2]|0;if((E|0)==(c[C+16>>2]|0)){G=kc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{G=c[E>>2]|0}if((G|0)==-1){c[h>>2]=0;F=1;break}else{F=(c[h>>2]|0)==0;break}}}while(0);do{if((y|0)==0){m=60}else{h=c[y+12>>2]|0;if((h|0)==(c[y+16>>2]|0)){H=kc[c[(c[y>>2]|0)+36>>2]&63](y)|0}else{H=c[h>>2]|0}if((H|0)==-1){c[l>>2]=0;m=60;break}if(F){p=v}else{break}i=g;return p|0}}while(0);do{if((m|0)==60){if(F){break}else{p=v}i=g;return p|0}}while(0);c[d>>2]=c[d>>2]|2;p=v;i=g;return p|0}function di(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+8|0;f=c[e>>2]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);if((f|0)==(c[1798]|0)){g=b;Om(g);i=d;return}tb(c[e>>2]|0);g=b;Om(g);i=d;return}function ei(b){b=b|0;var d=0,e=0;d=i;e=b+8|0;b=c[e>>2]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);if((b|0)==(c[1798]|0)){i=d;return}tb(c[e>>2]|0);i=d;return}function fi(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+112|0;f=g;l=g+8|0;m=l;n=f;a[n]=37;o=f+1|0;a[o]=j;p=f+2|0;a[p]=k;a[f+3|0]=0;if(!(k<<24>>24==0)){a[o]=k;a[p]=j}j=bb(m|0,100,n|0,h|0,c[d+8>>2]|0)|0;d=l+j|0;l=c[e>>2]|0;if((j|0)==0){q=l;r=b;c[r>>2]=q;i=g;return}else{s=m;t=l;u=l}while(1){l=a[s]|0;do{if((u|0)==0){v=t;w=0}else{m=u+24|0;j=c[m>>2]|0;if((j|0)==(c[u+28>>2]|0)){e=(tc[c[(c[u>>2]|0)+52>>2]&15](u,l&255)|0)==-1;v=e?0:t;w=e?0:u;break}else{c[m>>2]=j+1;a[j]=l;v=t;w=u;break}}}while(0);l=s+1|0;if((l|0)==(d|0)){q=v;break}else{s=l;t=v;u=w}}r=b;c[r>>2]=q;i=g;return}function gi(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+8|0;f=c[e>>2]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);if((f|0)==(c[1798]|0)){g=b;Om(g);i=d;return}tb(c[e>>2]|0);g=b;Om(g);i=d;return}function hi(b){b=b|0;var d=0,e=0;d=i;e=b+8|0;b=c[e>>2]|0;do{if((a[7200]|0)==0){if((Ma(7200)|0)==0){break}c[1798]=hb(2147483647,7208,0)|0;Za(7200)}}while(0);if((b|0)==(c[1798]|0)){i=d;return}tb(c[e>>2]|0);i=d;return}function ii(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+408|0;e=f;k=f+400|0;l=e;c[k>>2]=e+400;ji(b+8|0,l,k,g,h,j);j=c[k>>2]|0;k=c[d>>2]|0;if((l|0)==(j|0)){m=k;n=a;c[n>>2]=m;i=f;return}else{o=l;p=k;q=k}while(1){k=c[o>>2]|0;if((p|0)==0){r=q;s=0}else{l=p+24|0;d=c[l>>2]|0;if((d|0)==(c[p+28>>2]|0)){t=tc[c[(c[p>>2]|0)+52>>2]&15](p,k)|0}else{c[l>>2]=d+4;c[d>>2]=k;t=k}k=(t|0)==-1;r=k?0:q;s=k?0:p}k=o+4|0;if((k|0)==(j|0)){m=r;break}else{o=k;p=s;q=r}}n=a;c[n>>2]=m;i=f;return}function ji(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;i=i+120|0;k=j;l=j+112|0;m=i;i=i+8|0;n=j+8|0;o=k;a[o]=37;p=k+1|0;a[p]=g;q=k+2|0;a[q]=h;a[k+3|0]=0;if(!(h<<24>>24==0)){a[p]=h;a[q]=g}g=b;bb(n|0,100,o|0,f|0,c[g>>2]|0)|0;f=l;c[f>>2]=0;c[f+4>>2]=0;c[m>>2]=n;n=(c[e>>2]|0)-d>>2;f=fb(c[g>>2]|0)|0;g=cm(d,m,n,l)|0;if((f|0)!=0){fb(f|0)|0}if((g|0)==-1){fj(8184)}else{c[e>>2]=d+(g<<2);i=j;return}}function ki(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function li(a){a=a|0;i=i;return}function mi(a){a=a|0;i=i;return 127}function ni(a){a=a|0;i=i;return 127}function oi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function pi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function qi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function ri(a,b){a=a|0;b=b|0;b=i;ue(a,1,45);i=b;return}function si(a){a=a|0;i=i;return 0}function ti(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function ui(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function vi(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function wi(a){a=a|0;i=i;return}function xi(a){a=a|0;i=i;return 127}function yi(a){a=a|0;i=i;return 127}function zi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Ai(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Bi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Ci(a,b){a=a|0;b=b|0;b=i;ue(a,1,45);i=b;return}function Di(a){a=a|0;i=i;return 0}function Ei(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Fi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Gi(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Hi(a){a=a|0;i=i;return}function Ii(a){a=a|0;i=i;return 2147483647}function Ji(a){a=a|0;i=i;return 2147483647}function Ki(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Li(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Mi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Ni(a,b){a=a|0;b=b|0;b=i;Fe(a,1,45);i=b;return}function Oi(a){a=a|0;i=i;return 0}function Pi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Qi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ri(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Si(a){a=a|0;i=i;return}function Ti(a){a=a|0;i=i;return 2147483647}function Ui(a){a=a|0;i=i;return 2147483647}function Vi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Wi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Xi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Yi(a,b){a=a|0;b=b|0;b=i;Fe(a,1,45);i=b;return}function Zi(a){a=a|0;i=i;return 0}function _i(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function $i(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function aj(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function bj(a){a=a|0;i=i;return}function cj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+104|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=i;i=i+8|0;u=i;i=i+16|0;v=i;i=i+104|0;w=p;c[w>>2]=o;x=p+4|0;c[x>>2]=115;y=o+100|0;Pe(r,h);o=r;z=c[o>>2]|0;if(!((c[1826]|0)==-1)){c[n>>2]=7304;c[n+4>>2]=113;c[n+8>>2]=0;qe(7304,n,114)}n=(c[7308>>2]|0)+ -1|0;A=c[z+8>>2]|0;if(!((c[z+12>>2]|0)-A>>2>>>0>n>>>0)){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}z=c[A+(n<<2)>>2]|0;if((z|0)==0){B=Ta(4)|0;C=B;mm(C);Vb(B|0,15264,101)}B=z;a[s]=0;C=f;c[t>>2]=c[C>>2];f=c[h+4>>2]|0;h=l;n=t;c[h+0>>2]=c[n+0>>2];n=ej(e,l,g,r,f,j,s,B,p,q,y)|0;do{if(n){y=u;qc[c[(c[z>>2]|0)+32>>2]&7](B,6920,6930|0,y)|0;p=v;f=c[q>>2]|0;r=c[w>>2]|0;g=f-r|0;do{if((g|0)>98){l=Hm(g+2|0)|0;if((l|0)!=0){D=l;E=l;break}Tm()}else{D=0;E=p}}while(0);if((a[s]|0)==0){F=E}else{a[E]=45;F=E+1|0}if(r>>>0<f>>>0){g=u+10|0;l=u;h=F;t=r;while(1){A=a[t]|0;G=y;while(1){H=G+1|0;if((a[G]|0)==A<<24>>24){I=G;break}if((H|0)==(g|0)){I=g;break}else{G=H}}a[h]=a[6920+(I-l)|0]|0;G=t+1|0;A=h+1|0;if(G>>>0<(c[q>>2]|0)>>>0){h=A;t=G}else{J=A;break}}}else{J=F}a[J]=0;c[m>>2]=k;if((db(p|0,6936,m|0)|0)!=1){t=Ta(8)|0;ce(t,6944);Vb(t|0,4312,11)}if((D|0)==0){break}Im(D)}}while(0);D=e;e=c[D>>2]|0;do{if((e|0)==0){K=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){K=e;break}if(!((kc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){K=e;break}c[D>>2]=0;K=0}}while(0);D=(K|0)==0;e=c[C>>2]|0;do{if((e|0)==0){L=31}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){if(D){break}else{L=33;break}}if((kc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1){c[C>>2]=0;L=31;break}else{if(D){break}else{L=33;break}}}}while(0);if((L|0)==31){if(D){L=33}}if((L|0)==33){c[j>>2]=c[j>>2]|2}c[b>>2]=K;Yd(c[o>>2]|0)|0;o=c[w>>2]|0;c[w>>2]=0;if((o|0)==0){i=d;return}hc[c[x>>2]&127](o);i=d;return}function dj(a){a=a|0;i=i;return}\n\n\n\nfunction Em(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 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;j=i;if((b|0)!=(c[d+8>>2]|0)){k=d+52|0;l=a[k]|0;m=d+53|0;n=a[m]|0;o=c[b+12>>2]|0;p=b+(o<<3)+16|0;a[k]=0;a[m]=0;q=c[b+20>>2]|0;r=q>>8;if((q&1|0)==0){s=r}else{s=c[(c[f>>2]|0)+r>>2]|0}r=c[b+16>>2]|0;sc[c[(c[r>>2]|0)+20>>2]&15](r,d,e,f+s|0,(q&2|0)!=0?g:2,h);a:do{if((o|0)>1){q=d+24|0;s=b+8|0;r=d+54|0;t=f;u=b+24|0;do{if((a[r]|0)!=0){break a}do{if((a[k]|0)==0){if((a[m]|0)==0){break}if((c[s>>2]&1|0)==0){break a}}else{if((c[q>>2]|0)==1){break a}if((c[s>>2]&2|0)==0){break a}}}while(0);a[k]=0;a[m]=0;v=c[u+4>>2]|0;w=v>>8;if((v&1|0)==0){x=w}else{x=c[(c[t>>2]|0)+w>>2]|0}w=c[u>>2]|0;sc[c[(c[w>>2]|0)+20>>2]&15](w,d,e,f+x|0,(v&2|0)!=0?g:2,h);u=u+8|0;}while(u>>>0<p>>>0)}}while(0);a[k]=l;a[m]=n;i=j;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52|0]=1;f=d+16|0;n=c[f>>2]|0;if((n|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}if((n|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=j;return}e=d+24|0;n=c[e>>2]|0;if((n|0)==2){c[e>>2]=g;y=g}else{y=n}if(!((c[d+48>>2]|0)==1&(y|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}function Fm(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 j=0,k=0,l=0;j=i;if((b|0)!=(c[d+8>>2]|0)){k=c[b+8>>2]|0;sc[c[(c[k>>2]|0)+20>>2]&15](k,d,e,f,g,h);i=j;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52|0]=1;f=d+16|0;h=c[f>>2]|0;if((h|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=j;return}e=d+24|0;h=c[e>>2]|0;if((h|0)==2){c[e>>2]=g;l=g}else{l=h}if(!((c[d+48>>2]|0)==1&(l|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}function Gm(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 j=0;h=i;if((c[d+8>>2]|0)!=(b|0)){i=h;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=h;return}a[d+52|0]=1;f=d+16|0;b=c[f>>2]|0;if((b|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54|0]=1;i=h;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=h;return}e=d+24|0;b=c[e>>2]|0;if((b|0)==2){c[e>>2]=g;j=g}else{j=b}if(!((c[d+48>>2]|0)==1&(j|0)==1)){i=h;return}a[d+54|0]=1;i=h;return}function Hm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,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;b=i;do{if(a>>>0<245){if(a>>>0<11){d=16}else{d=a+11&-8}e=d>>>3;f=c[3906]|0;g=f>>>e;if((g&3|0)!=0){h=(g&1^1)+e|0;j=h<<1;k=15664+(j<<2)|0;l=15664+(j+2<<2)|0;j=c[l>>2]|0;m=j+8|0;n=c[m>>2]|0;do{if((k|0)==(n|0)){c[3906]=f&~(1<<h)}else{if(n>>>0<(c[15640>>2]|0)>>>0){Sb()}o=n+12|0;if((c[o>>2]|0)==(j|0)){c[o>>2]=k;c[l>>2]=n;break}else{Sb()}}}while(0);n=h<<3;c[j+4>>2]=n|3;l=j+(n|4)|0;c[l>>2]=c[l>>2]|1;p=m;i=b;return p|0}if(!(d>>>0>(c[15632>>2]|0)>>>0)){q=d;break}if((g|0)!=0){l=2<<e;n=g<<e&(l|0-l);l=(n&0-n)+ -1|0;n=l>>>12&16;k=l>>>n;l=k>>>5&8;o=k>>>l;k=o>>>2&4;r=o>>>k;o=r>>>1&2;s=r>>>o;r=s>>>1&1;t=(l|n|k|o|r)+(s>>>r)|0;r=t<<1;s=15664+(r<<2)|0;o=15664+(r+2<<2)|0;r=c[o>>2]|0;k=r+8|0;n=c[k>>2]|0;do{if((s|0)==(n|0)){c[3906]=f&~(1<<t)}else{if(n>>>0<(c[15640>>2]|0)>>>0){Sb()}l=n+12|0;if((c[l>>2]|0)==(r|0)){c[l>>2]=s;c[o>>2]=n;break}else{Sb()}}}while(0);n=t<<3;o=n-d|0;c[r+4>>2]=d|3;s=r;f=s+d|0;c[s+(d|4)>>2]=o|1;c[s+n>>2]=o;n=c[15632>>2]|0;if((n|0)!=0){s=c[15644>>2]|0;e=n>>>3;n=e<<1;g=15664+(n<<2)|0;m=c[3906]|0;j=1<<e;do{if((m&j|0)==0){c[3906]=m|j;u=15664+(n+2<<2)|0;v=g}else{e=15664+(n+2<<2)|0;h=c[e>>2]|0;if(!(h>>>0<(c[15640>>2]|0)>>>0)){u=e;v=h;break}Sb()}}while(0);c[u>>2]=s;c[v+12>>2]=s;c[s+8>>2]=v;c[s+12>>2]=g}c[15632>>2]=o;c[15644>>2]=f;p=k;i=b;return p|0}n=c[15628>>2]|0;if((n|0)==0){q=d;break}j=(n&0-n)+ -1|0;n=j>>>12&16;m=j>>>n;j=m>>>5&8;r=m>>>j;m=r>>>2&4;t=r>>>m;r=t>>>1&2;h=t>>>r;t=h>>>1&1;e=c[15928+((j|n|m|r|t)+(h>>>t)<<2)>>2]|0;t=(c[e+4>>2]&-8)-d|0;h=e;r=e;while(1){e=c[h+16>>2]|0;if((e|0)==0){m=c[h+20>>2]|0;if((m|0)==0){break}else{w=m}}else{w=e}e=(c[w+4>>2]&-8)-d|0;m=e>>>0<t>>>0;t=m?e:t;h=w;r=m?w:r}h=r;k=c[15640>>2]|0;if(h>>>0<k>>>0){Sb()}f=h+d|0;o=f;if(!(h>>>0<f>>>0)){Sb()}f=c[r+24>>2]|0;g=c[r+12>>2]|0;do{if((g|0)==(r|0)){s=r+20|0;m=c[s>>2]|0;if((m|0)==0){e=r+16|0;n=c[e>>2]|0;if((n|0)==0){x=0;break}else{y=n;z=e}}else{y=m;z=s}while(1){s=y+20|0;m=c[s>>2]|0;if((m|0)!=0){z=s;y=m;continue}m=y+16|0;s=c[m>>2]|0;if((s|0)==0){break}else{y=s;z=m}}if(z>>>0<k>>>0){Sb()}else{c[z>>2]=0;x=y;break}}else{m=c[r+8>>2]|0;if(m>>>0<k>>>0){Sb()}s=m+12|0;if((c[s>>2]|0)!=(r|0)){Sb()}e=g+8|0;if((c[e>>2]|0)==(r|0)){c[s>>2]=g;c[e>>2]=m;x=g;break}else{Sb()}}}while(0);a:do{if((f|0)!=0){g=c[r+28>>2]|0;k=15928+(g<<2)|0;do{if((r|0)==(c[k>>2]|0)){c[k>>2]=x;if((x|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<g);break a}else{if(f>>>0<(c[15640>>2]|0)>>>0){Sb()}m=f+16|0;if((c[m>>2]|0)==(r|0)){c[m>>2]=x}else{c[f+20>>2]=x}if((x|0)==0){break a}}}while(0);if(x>>>0<(c[15640>>2]|0)>>>0){Sb()}c[x+24>>2]=f;g=c[r+16>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[x+16>>2]=g;c[g+24>>2]=x;break}}}while(0);g=c[r+20>>2]|0;if((g|0)==0){break}if(g>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[x+20>>2]=g;c[g+24>>2]=x;break}}}while(0);if(t>>>0<16){f=t+d|0;c[r+4>>2]=f|3;g=h+(f+4)|0;c[g>>2]=c[g>>2]|1}else{c[r+4>>2]=d|3;c[h+(d|4)>>2]=t|1;c[h+(t+d)>>2]=t;g=c[15632>>2]|0;if((g|0)!=0){f=c[15644>>2]|0;k=g>>>3;g=k<<1;m=15664+(g<<2)|0;e=c[3906]|0;s=1<<k;do{if((e&s|0)==0){c[3906]=e|s;A=15664+(g+2<<2)|0;B=m}else{k=15664+(g+2<<2)|0;n=c[k>>2]|0;if(!(n>>>0<(c[15640>>2]|0)>>>0)){A=k;B=n;break}Sb()}}while(0);c[A>>2]=f;c[B+12>>2]=f;c[f+8>>2]=B;c[f+12>>2]=m}c[15632>>2]=t;c[15644>>2]=o}p=r+8|0;i=b;return p|0}else{if(a>>>0>4294967231){q=-1;break}g=a+11|0;s=g&-8;e=c[15628>>2]|0;if((e|0)==0){q=s;break}h=0-s|0;n=g>>>8;do{if((n|0)==0){C=0}else{if(s>>>0>16777215){C=31;break}g=(n+1048320|0)>>>16&8;k=n<<g;j=(k+520192|0)>>>16&4;l=k<<j;k=(l+245760|0)>>>16&2;D=14-(j|g|k)+(l<<k>>>15)|0;C=s>>>(D+7|0)&1|D<<1}}while(0);n=c[15928+(C<<2)>>2]|0;b:do{if((n|0)==0){E=h;F=0;G=0}else{if((C|0)==31){H=0}else{H=25-(C>>>1)|0}r=h;o=0;t=s<<H;m=n;f=0;while(1){D=c[m+4>>2]&-8;k=D-s|0;if(k>>>0<r>>>0){if((D|0)==(s|0)){E=k;F=m;G=m;break b}else{I=k;J=m}}else{I=r;J=f}k=c[m+20>>2]|0;D=c[m+(t>>>31<<2)+16>>2]|0;l=(k|0)==0|(k|0)==(D|0)?o:k;if((D|0)==0){E=I;F=l;G=J;break}else{r=I;o=l;t=t<<1;m=D;f=J}}}}while(0);if((F|0)==0&(G|0)==0){n=2<<C;h=e&(n|0-n);if((h|0)==0){q=s;break}n=(h&0-h)+ -1|0;h=n>>>12&16;f=n>>>h;n=f>>>5&8;m=f>>>n;f=m>>>2&4;t=m>>>f;m=t>>>1&2;o=t>>>m;t=o>>>1&1;K=c[15928+((n|h|f|m|t)+(o>>>t)<<2)>>2]|0}else{K=F}if((K|0)==0){L=E;M=G}else{t=E;o=K;m=G;while(1){f=(c[o+4>>2]&-8)-s|0;h=f>>>0<t>>>0;n=h?f:t;f=h?o:m;h=c[o+16>>2]|0;if((h|0)!=0){N=f;O=n;m=N;o=h;t=O;continue}h=c[o+20>>2]|0;if((h|0)==0){L=n;M=f;break}else{N=f;O=n;o=h;m=N;t=O}}}if((M|0)==0){q=s;break}if(!(L>>>0<((c[15632>>2]|0)-s|0)>>>0)){q=s;break}t=M;m=c[15640>>2]|0;if(t>>>0<m>>>0){Sb()}o=t+s|0;e=o;if(!(t>>>0<o>>>0)){Sb()}h=c[M+24>>2]|0;n=c[M+12>>2]|0;do{if((n|0)==(M|0)){f=M+20|0;r=c[f>>2]|0;if((r|0)==0){D=M+16|0;l=c[D>>2]|0;if((l|0)==0){P=0;break}else{Q=l;R=D}}else{Q=r;R=f}while(1){f=Q+20|0;r=c[f>>2]|0;if((r|0)!=0){R=f;Q=r;continue}r=Q+16|0;f=c[r>>2]|0;if((f|0)==0){break}else{Q=f;R=r}}if(R>>>0<m>>>0){Sb()}else{c[R>>2]=0;P=Q;break}}else{r=c[M+8>>2]|0;if(r>>>0<m>>>0){Sb()}f=r+12|0;if((c[f>>2]|0)!=(M|0)){Sb()}D=n+8|0;if((c[D>>2]|0)==(M|0)){c[f>>2]=n;c[D>>2]=r;P=n;break}else{Sb()}}}while(0);c:do{if((h|0)!=0){n=c[M+28>>2]|0;m=15928+(n<<2)|0;do{if((M|0)==(c[m>>2]|0)){c[m>>2]=P;if((P|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<n);break c}else{if(h>>>0<(c[15640>>2]|0)>>>0){Sb()}r=h+16|0;if((c[r>>2]|0)==(M|0)){c[r>>2]=P}else{c[h+20>>2]=P}if((P|0)==0){break c}}}while(0);if(P>>>0<(c[15640>>2]|0)>>>0){Sb()}c[P+24>>2]=h;n=c[M+16>>2]|0;do{if((n|0)!=0){if(n>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[P+16>>2]=n;c[n+24>>2]=P;break}}}while(0);n=c[M+20>>2]|0;if((n|0)==0){break}if(n>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[P+20>>2]=n;c[n+24>>2]=P;break}}}while(0);d:do{if(L>>>0<16){h=L+s|0;c[M+4>>2]=h|3;n=t+(h+4)|0;c[n>>2]=c[n>>2]|1}else{c[M+4>>2]=s|3;c[t+(s|4)>>2]=L|1;c[t+(L+s)>>2]=L;n=L>>>3;if(L>>>0<256){h=n<<1;m=15664+(h<<2)|0;r=c[3906]|0;D=1<<n;do{if((r&D|0)==0){c[3906]=r|D;S=15664+(h+2<<2)|0;T=m}else{n=15664+(h+2<<2)|0;f=c[n>>2]|0;if(!(f>>>0<(c[15640>>2]|0)>>>0)){S=n;T=f;break}Sb()}}while(0);c[S>>2]=e;c[T+12>>2]=e;c[t+(s+8)>>2]=T;c[t+(s+12)>>2]=m;break}h=o;D=L>>>8;do{if((D|0)==0){U=0}else{if(L>>>0>16777215){U=31;break}r=(D+1048320|0)>>>16&8;f=D<<r;n=(f+520192|0)>>>16&4;l=f<<n;f=(l+245760|0)>>>16&2;k=14-(n|r|f)+(l<<f>>>15)|0;U=L>>>(k+7|0)&1|k<<1}}while(0);D=15928+(U<<2)|0;c[t+(s+28)>>2]=U;c[t+(s+20)>>2]=0;c[t+(s+16)>>2]=0;m=c[15628>>2]|0;k=1<<U;if((m&k|0)==0){c[15628>>2]=m|k;c[D>>2]=h;c[t+(s+24)>>2]=D;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break}k=c[D>>2]|0;if((U|0)==31){V=0}else{V=25-(U>>>1)|0}e:do{if((c[k+4>>2]&-8|0)==(L|0)){W=k}else{D=L<<V;m=k;while(1){X=m+(D>>>31<<2)+16|0;f=c[X>>2]|0;if((f|0)==0){break}if((c[f+4>>2]&-8|0)==(L|0)){W=f;break e}else{D=D<<1;m=f}}if(X>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[X>>2]=h;c[t+(s+24)>>2]=m;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break d}}}while(0);k=W+8|0;D=c[k>>2]|0;f=c[15640>>2]|0;if(W>>>0<f>>>0){Sb()}if(D>>>0<f>>>0){Sb()}else{c[D+12>>2]=h;c[k>>2]=h;c[t+(s+8)>>2]=D;c[t+(s+12)>>2]=W;c[t+(s+24)>>2]=0;break}}}while(0);p=M+8|0;i=b;return p|0}}while(0);M=c[15632>>2]|0;if(!(q>>>0>M>>>0)){W=M-q|0;X=c[15644>>2]|0;if(W>>>0>15){L=X;c[15644>>2]=L+q;c[15632>>2]=W;c[L+(q+4)>>2]=W|1;c[L+M>>2]=W;c[X+4>>2]=q|3}else{c[15632>>2]=0;c[15644>>2]=0;c[X+4>>2]=M|3;W=X+(M+4)|0;c[W>>2]=c[W>>2]|1}p=X+8|0;i=b;return p|0}X=c[15636>>2]|0;if(q>>>0<X>>>0){W=X-q|0;c[15636>>2]=W;X=c[15648>>2]|0;M=X;c[15648>>2]=M+q;c[M+(q+4)>>2]=W|1;c[X+4>>2]=q|3;p=X+8|0;i=b;return p|0}do{if((c[4024]|0)==0){X=Pb(30)|0;if((X+ -1&X|0)==0){c[16104>>2]=X;c[16100>>2]=X;c[16108>>2]=-1;c[16112>>2]=-1;c[16116>>2]=0;c[16068>>2]=0;c[4024]=(ac(0)|0)&-16^1431655768;break}else{Sb()}}}while(0);X=q+48|0;W=c[16104>>2]|0;M=q+47|0;L=W+M|0;V=0-W|0;W=L&V;if(!(W>>>0>q>>>0)){p=0;i=b;return p|0}U=c[16064>>2]|0;do{if((U|0)!=0){T=c[16056>>2]|0;S=T+W|0;if(S>>>0<=T>>>0|S>>>0>U>>>0){p=0}else{break}i=b;return p|0}}while(0);f:do{if((c[16068>>2]&4|0)==0){U=c[15648>>2]|0;g:do{if((U|0)==0){Y=182}else{S=U;T=16072|0;while(1){Z=T;P=c[Z>>2]|0;if(!(P>>>0>S>>>0)){_=T+4|0;if((P+(c[_>>2]|0)|0)>>>0>S>>>0){break}}P=c[T+8>>2]|0;if((P|0)==0){Y=182;break g}else{T=P}}if((T|0)==0){Y=182;break}S=L-(c[15636>>2]|0)&V;if(!(S>>>0<2147483647)){$=0;break}h=eb(S|0)|0;P=(h|0)==((c[Z>>2]|0)+(c[_>>2]|0)|0);aa=h;ba=S;ca=P?h:-1;da=P?S:0;Y=191}}while(0);do{if((Y|0)==182){U=eb(0)|0;if((U|0)==(-1|0)){$=0;break}S=U;P=c[16100>>2]|0;h=P+ -1|0;if((h&S|0)==0){ea=W}else{ea=W-S+(h+S&0-P)|0}P=c[16056>>2]|0;S=P+ea|0;if(!(ea>>>0>q>>>0&ea>>>0<2147483647)){$=0;break}h=c[16064>>2]|0;if((h|0)!=0){if(S>>>0<=P>>>0|S>>>0>h>>>0){$=0;break}}h=eb(ea|0)|0;S=(h|0)==(U|0);aa=h;ba=ea;ca=S?U:-1;da=S?ea:0;Y=191}}while(0);h:do{if((Y|0)==191){S=0-ba|0;if((ca|0)!=(-1|0)){fa=ca;ga=da;Y=202;break f}do{if((aa|0)!=(-1|0)&ba>>>0<2147483647&ba>>>0<X>>>0){U=c[16104>>2]|0;h=M-ba+U&0-U;if(!(h>>>0<2147483647)){ha=ba;break}if((eb(h|0)|0)==(-1|0)){eb(S|0)|0;$=da;break h}else{ha=h+ba|0;break}}else{ha=ba}}while(0);if((aa|0)==(-1|0)){$=da}else{fa=aa;ga=ha;Y=202;break f}}}while(0);c[16068>>2]=c[16068>>2]|4;ia=$;Y=199}else{ia=0;Y=199}}while(0);do{if((Y|0)==199){if(!(W>>>0<2147483647)){break}$=eb(W|0)|0;ha=eb(0)|0;if(!((ha|0)!=(-1|0)&($|0)!=(-1|0)&$>>>0<ha>>>0)){break}aa=ha-$|0;ha=aa>>>0>(q+40|0)>>>0;if(ha){fa=$;ga=ha?aa:ia;Y=202}}}while(0);do{if((Y|0)==202){ia=(c[16056>>2]|0)+ga|0;c[16056>>2]=ia;if(ia>>>0>(c[16060>>2]|0)>>>0){c[16060>>2]=ia}ia=c[15648>>2]|0;i:do{if((ia|0)==0){W=c[15640>>2]|0;if((W|0)==0|fa>>>0<W>>>0){c[15640>>2]=fa}c[16072>>2]=fa;c[16076>>2]=ga;c[16084>>2]=0;c[15660>>2]=c[4024];c[15656>>2]=-1;W=0;do{aa=W<<1;ha=15664+(aa<<2)|0;c[15664+(aa+3<<2)>>2]=ha;c[15664+(aa+2<<2)>>2]=ha;W=W+1|0;}while((W|0)!=32);W=fa+8|0;if((W&7|0)==0){ja=0}else{ja=0-W&7}W=ga+ -40-ja|0;c[15648>>2]=fa+ja;c[15636>>2]=W;c[fa+(ja+4)>>2]=W|1;c[fa+(ga+ -36)>>2]=40;c[15652>>2]=c[16112>>2]}else{W=16072|0;while(1){ka=c[W>>2]|0;la=W+4|0;ma=c[la>>2]|0;if((fa|0)==(ka+ma|0)){Y=214;break}ha=c[W+8>>2]|0;if((ha|0)==0){break}else{W=ha}}do{if((Y|0)==214){if((c[W+12>>2]&8|0)!=0){break}ha=ia;if(!(ha>>>0>=ka>>>0&ha>>>0<fa>>>0)){break}c[la>>2]=ma+ga;aa=(c[15636>>2]|0)+ga|0;$=ia+8|0;if(($&7|0)==0){na=0}else{na=0-$&7}$=aa-na|0;c[15648>>2]=ha+na;c[15636>>2]=$;c[ha+(na+4)>>2]=$|1;c[ha+(aa+4)>>2]=40;c[15652>>2]=c[16112>>2];break i}}while(0);if(fa>>>0<(c[15640>>2]|0)>>>0){c[15640>>2]=fa}W=fa+ga|0;aa=16072|0;while(1){oa=aa;if((c[oa>>2]|0)==(W|0)){Y=224;break}ha=c[aa+8>>2]|0;if((ha|0)==0){break}else{aa=ha}}do{if((Y|0)==224){if((c[aa+12>>2]&8|0)!=0){break}c[oa>>2]=fa;W=aa+4|0;c[W>>2]=(c[W>>2]|0)+ga;W=fa+8|0;if((W&7|0)==0){pa=0}else{pa=0-W&7}W=fa+(ga+8)|0;if((W&7|0)==0){qa=0}else{qa=0-W&7}W=fa+(qa+ga)|0;ha=W;$=pa+q|0;da=fa+$|0;ba=da;M=W-(fa+pa)-q|0;c[fa+(pa+4)>>2]=q|3;j:do{if((ha|0)==(c[15648>>2]|0)){X=(c[15636>>2]|0)+M|0;c[15636>>2]=X;c[15648>>2]=ba;c[fa+($+4)>>2]=X|1}else{if((ha|0)==(c[15644>>2]|0)){X=(c[15632>>2]|0)+M|0;c[15632>>2]=X;c[15644>>2]=ba;c[fa+($+4)>>2]=X|1;c[fa+(X+$)>>2]=X;break}X=ga+4|0;ca=c[fa+(X+qa)>>2]|0;if((ca&3|0)==1){ea=ca&-8;_=ca>>>3;k:do{if(ca>>>0<256){Z=c[fa+((qa|8)+ga)>>2]|0;V=c[fa+(ga+12+qa)>>2]|0;L=15664+(_<<1<<2)|0;do{if((Z|0)!=(L|0)){if(Z>>>0<(c[15640>>2]|0)>>>0){Sb()}if((c[Z+12>>2]|0)==(ha|0)){break}Sb()}}while(0);if((V|0)==(Z|0)){c[3906]=c[3906]&~(1<<_);break}do{if((V|0)==(L|0)){ra=V+8|0}else{if(V>>>0<(c[15640>>2]|0)>>>0){Sb()}S=V+8|0;if((c[S>>2]|0)==(ha|0)){ra=S;break}Sb()}}while(0);c[Z+12>>2]=V;c[ra>>2]=Z}else{L=W;S=c[fa+((qa|24)+ga)>>2]|0;T=c[fa+(ga+12+qa)>>2]|0;do{if((T|0)==(L|0)){h=qa|16;U=fa+(X+h)|0;P=c[U>>2]|0;if((P|0)==0){Q=fa+(h+ga)|0;h=c[Q>>2]|0;if((h|0)==0){sa=0;break}else{ta=h;ua=Q}}else{ta=P;ua=U}while(1){U=ta+20|0;P=c[U>>2]|0;if((P|0)!=0){ua=U;ta=P;continue}P=ta+16|0;U=c[P>>2]|0;if((U|0)==0){break}else{ta=U;ua=P}}if(ua>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[ua>>2]=0;sa=ta;break}}else{P=c[fa+((qa|8)+ga)>>2]|0;if(P>>>0<(c[15640>>2]|0)>>>0){Sb()}U=P+12|0;if((c[U>>2]|0)!=(L|0)){Sb()}Q=T+8|0;if((c[Q>>2]|0)==(L|0)){c[U>>2]=T;c[Q>>2]=P;sa=T;break}else{Sb()}}}while(0);if((S|0)==0){break}T=c[fa+(ga+28+qa)>>2]|0;Z=15928+(T<<2)|0;do{if((L|0)==(c[Z>>2]|0)){c[Z>>2]=sa;if((sa|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<T);break k}else{if(S>>>0<(c[15640>>2]|0)>>>0){Sb()}V=S+16|0;if((c[V>>2]|0)==(L|0)){c[V>>2]=sa}else{c[S+20>>2]=sa}if((sa|0)==0){break k}}}while(0);if(sa>>>0<(c[15640>>2]|0)>>>0){Sb()}c[sa+24>>2]=S;L=qa|16;T=c[fa+(L+ga)>>2]|0;do{if((T|0)!=0){if(T>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[sa+16>>2]=T;c[T+24>>2]=sa;break}}}while(0);T=c[fa+(X+L)>>2]|0;if((T|0)==0){break}if(T>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[sa+20>>2]=T;c[T+24>>2]=sa;break}}}while(0);va=fa+((ea|qa)+ga)|0;wa=ea+M|0}else{va=ha;wa=M}X=va+4|0;c[X>>2]=c[X>>2]&-2;c[fa+($+4)>>2]=wa|1;c[fa+(wa+$)>>2]=wa;X=wa>>>3;if(wa>>>0<256){_=X<<1;ca=15664+(_<<2)|0;T=c[3906]|0;S=1<<X;do{if((T&S|0)==0){c[3906]=T|S;xa=15664+(_+2<<2)|0;ya=ca}else{X=15664+(_+2<<2)|0;Z=c[X>>2]|0;if(!(Z>>>0<(c[15640>>2]|0)>>>0)){xa=X;ya=Z;break}Sb()}}while(0);c[xa>>2]=ba;c[ya+12>>2]=ba;c[fa+($+8)>>2]=ya;c[fa+($+12)>>2]=ca;break}_=da;S=wa>>>8;do{if((S|0)==0){za=0}else{if(wa>>>0>16777215){za=31;break}T=(S+1048320|0)>>>16&8;ea=S<<T;Z=(ea+520192|0)>>>16&4;X=ea<<Z;ea=(X+245760|0)>>>16&2;V=14-(Z|T|ea)+(X<<ea>>>15)|0;za=wa>>>(V+7|0)&1|V<<1}}while(0);S=15928+(za<<2)|0;c[fa+($+28)>>2]=za;c[fa+($+20)>>2]=0;c[fa+($+16)>>2]=0;ca=c[15628>>2]|0;V=1<<za;if((ca&V|0)==0){c[15628>>2]=ca|V;c[S>>2]=_;c[fa+($+24)>>2]=S;c[fa+($+12)>>2]=_;c[fa+($+8)>>2]=_;break}V=c[S>>2]|0;if((za|0)==31){Aa=0}else{Aa=25-(za>>>1)|0}l:do{if((c[V+4>>2]&-8|0)==(wa|0)){Ba=V}else{S=wa<<Aa;ca=V;while(1){Ca=ca+(S>>>31<<2)+16|0;ea=c[Ca>>2]|0;if((ea|0)==0){break}if((c[ea+4>>2]&-8|0)==(wa|0)){Ba=ea;break l}else{S=S<<1;ca=ea}}if(Ca>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[Ca>>2]=_;c[fa+($+24)>>2]=ca;c[fa+($+12)>>2]=_;c[fa+($+8)>>2]=_;break j}}}while(0);V=Ba+8|0;S=c[V>>2]|0;L=c[15640>>2]|0;if(Ba>>>0<L>>>0){Sb()}if(S>>>0<L>>>0){Sb()}else{c[S+12>>2]=_;c[V>>2]=_;c[fa+($+8)>>2]=S;c[fa+($+12)>>2]=Ba;c[fa+($+24)>>2]=0;break}}}while(0);p=fa+(pa|8)|0;i=b;return p|0}}while(0);aa=ia;$=16072|0;while(1){Da=c[$>>2]|0;if(!(Da>>>0>aa>>>0)){Ea=c[$+4>>2]|0;Fa=Da+Ea|0;if(Fa>>>0>aa>>>0){break}}$=c[$+8>>2]|0}$=Da+(Ea+ -39)|0;if(($&7|0)==0){Ga=0}else{Ga=0-$&7}$=Da+(Ea+ -47+Ga)|0;da=$>>>0<(ia+16|0)>>>0?aa:$;$=da+8|0;ba=$;M=fa+8|0;if((M&7|0)==0){Ha=0}else{Ha=0-M&7}M=ga+ -40-Ha|0;c[15648>>2]=fa+Ha;c[15636>>2]=M;c[fa+(Ha+4)>>2]=M|1;c[fa+(ga+ -36)>>2]=40;c[15652>>2]=c[16112>>2];c[da+4>>2]=27;c[$+0>>2]=c[16072>>2];c[$+4>>2]=c[16076>>2];c[$+8>>2]=c[16080>>2];c[$+12>>2]=c[16084>>2];c[16072>>2]=fa;c[16076>>2]=ga;c[16084>>2]=0;c[16080>>2]=ba;ba=da+28|0;c[ba>>2]=7;if((da+32|0)>>>0<Fa>>>0){$=ba;while(1){ba=$+4|0;c[ba>>2]=7;if(($+8|0)>>>0<Fa>>>0){$=ba}else{break}}}if((da|0)==(aa|0)){break}$=da-ia|0;ba=aa+($+4)|0;c[ba>>2]=c[ba>>2]&-2;c[ia+4>>2]=$|1;c[aa+$>>2]=$;ba=$>>>3;if($>>>0<256){M=ba<<1;ha=15664+(M<<2)|0;W=c[3906]|0;m=1<<ba;do{if((W&m|0)==0){c[3906]=W|m;Ia=15664+(M+2<<2)|0;Ja=ha}else{ba=15664+(M+2<<2)|0;S=c[ba>>2]|0;if(!(S>>>0<(c[15640>>2]|0)>>>0)){Ia=ba;Ja=S;break}Sb()}}while(0);c[Ia>>2]=ia;c[Ja+12>>2]=ia;c[ia+8>>2]=Ja;c[ia+12>>2]=ha;break}M=ia;m=$>>>8;do{if((m|0)==0){Ka=0}else{if($>>>0>16777215){Ka=31;break}W=(m+1048320|0)>>>16&8;aa=m<<W;da=(aa+520192|0)>>>16&4;S=aa<<da;aa=(S+245760|0)>>>16&2;ba=14-(da|W|aa)+(S<<aa>>>15)|0;Ka=$>>>(ba+7|0)&1|ba<<1}}while(0);m=15928+(Ka<<2)|0;c[ia+28>>2]=Ka;c[ia+20>>2]=0;c[ia+16>>2]=0;ha=c[15628>>2]|0;ba=1<<Ka;if((ha&ba|0)==0){c[15628>>2]=ha|ba;c[m>>2]=M;c[ia+24>>2]=m;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}ba=c[m>>2]|0;if((Ka|0)==31){La=0}else{La=25-(Ka>>>1)|0}m:do{if((c[ba+4>>2]&-8|0)==($|0)){Ma=ba}else{m=$<<La;ha=ba;while(1){Na=ha+(m>>>31<<2)+16|0;aa=c[Na>>2]|0;if((aa|0)==0){break}if((c[aa+4>>2]&-8|0)==($|0)){Ma=aa;break m}else{m=m<<1;ha=aa}}if(Na>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[Na>>2]=M;c[ia+24>>2]=ha;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break i}}}while(0);$=Ma+8|0;ba=c[$>>2]|0;m=c[15640>>2]|0;if(Ma>>>0<m>>>0){Sb()}if(ba>>>0<m>>>0){Sb()}else{c[ba+12>>2]=M;c[$>>2]=M;c[ia+8>>2]=ba;c[ia+12>>2]=Ma;c[ia+24>>2]=0;break}}}while(0);ia=c[15636>>2]|0;if(!(ia>>>0>q>>>0)){break}ba=ia-q|0;c[15636>>2]=ba;ia=c[15648>>2]|0;$=ia;c[15648>>2]=$+q;c[$+(q+4)>>2]=ba|1;c[ia+4>>2]=q|3;p=ia+8|0;i=b;return p|0}}while(0);c[(Hb()|0)>>2]=12;p=0;i=b;return p|0}function Im(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,N=0,O=0,P=0,Q=0;b=i;if((a|0)==0){i=b;return}d=a+ -8|0;e=d;f=c[15640>>2]|0;if(d>>>0<f>>>0){Sb()}g=c[a+ -4>>2]|0;h=g&3;if((h|0)==1){Sb()}j=g&-8;k=a+(j+ -8)|0;l=k;a:do{if((g&1|0)==0){m=c[d>>2]|0;if((h|0)==0){i=b;return}n=-8-m|0;o=a+n|0;p=o;q=m+j|0;if(o>>>0<f>>>0){Sb()}if((p|0)==(c[15644>>2]|0)){r=a+(j+ -4)|0;if((c[r>>2]&3|0)!=3){s=p;t=q;break}c[15632>>2]=q;c[r>>2]=c[r>>2]&-2;c[a+(n+4)>>2]=q|1;c[k>>2]=q;i=b;return}r=m>>>3;if(m>>>0<256){m=c[a+(n+8)>>2]|0;u=c[a+(n+12)>>2]|0;v=15664+(r<<1<<2)|0;do{if((m|0)!=(v|0)){if(m>>>0<f>>>0){Sb()}if((c[m+12>>2]|0)==(p|0)){break}Sb()}}while(0);if((u|0)==(m|0)){c[3906]=c[3906]&~(1<<r);s=p;t=q;break}do{if((u|0)==(v|0)){w=u+8|0}else{if(u>>>0<f>>>0){Sb()}x=u+8|0;if((c[x>>2]|0)==(p|0)){w=x;break}Sb()}}while(0);c[m+12>>2]=u;c[w>>2]=m;s=p;t=q;break}v=o;r=c[a+(n+24)>>2]|0;x=c[a+(n+12)>>2]|0;do{if((x|0)==(v|0)){y=a+(n+20)|0;z=c[y>>2]|0;if((z|0)==0){A=a+(n+16)|0;B=c[A>>2]|0;if((B|0)==0){C=0;break}else{D=B;E=A}}else{D=z;E=y}while(1){y=D+20|0;z=c[y>>2]|0;if((z|0)!=0){E=y;D=z;continue}z=D+16|0;y=c[z>>2]|0;if((y|0)==0){break}else{D=y;E=z}}if(E>>>0<f>>>0){Sb()}else{c[E>>2]=0;C=D;break}}else{z=c[a+(n+8)>>2]|0;if(z>>>0<f>>>0){Sb()}y=z+12|0;if((c[y>>2]|0)!=(v|0)){Sb()}A=x+8|0;if((c[A>>2]|0)==(v|0)){c[y>>2]=x;c[A>>2]=z;C=x;break}else{Sb()}}}while(0);if((r|0)==0){s=p;t=q;break}x=c[a+(n+28)>>2]|0;o=15928+(x<<2)|0;do{if((v|0)==(c[o>>2]|0)){c[o>>2]=C;if((C|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<x);s=p;t=q;break a}else{if(r>>>0<(c[15640>>2]|0)>>>0){Sb()}m=r+16|0;if((c[m>>2]|0)==(v|0)){c[m>>2]=C}else{c[r+20>>2]=C}if((C|0)==0){s=p;t=q;break a}}}while(0);if(C>>>0<(c[15640>>2]|0)>>>0){Sb()}c[C+24>>2]=r;v=c[a+(n+16)>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[C+16>>2]=v;c[v+24>>2]=C;break}}}while(0);v=c[a+(n+20)>>2]|0;if((v|0)==0){s=p;t=q;break}if(v>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[C+20>>2]=v;c[v+24>>2]=C;s=p;t=q;break}}else{s=e;t=j}}while(0);e=s;if(!(e>>>0<k>>>0)){Sb()}C=a+(j+ -4)|0;f=c[C>>2]|0;if((f&1|0)==0){Sb()}do{if((f&2|0)==0){if((l|0)==(c[15648>>2]|0)){D=(c[15636>>2]|0)+t|0;c[15636>>2]=D;c[15648>>2]=s;c[s+4>>2]=D|1;if((s|0)!=(c[15644>>2]|0)){i=b;return}c[15644>>2]=0;c[15632>>2]=0;i=b;return}if((l|0)==(c[15644>>2]|0)){D=(c[15632>>2]|0)+t|0;c[15632>>2]=D;c[15644>>2]=s;c[s+4>>2]=D|1;c[e+D>>2]=D;i=b;return}D=(f&-8)+t|0;E=f>>>3;b:do{if(f>>>0<256){w=c[a+j>>2]|0;h=c[a+(j|4)>>2]|0;d=15664+(E<<1<<2)|0;do{if((w|0)!=(d|0)){if(w>>>0<(c[15640>>2]|0)>>>0){Sb()}if((c[w+12>>2]|0)==(l|0)){break}Sb()}}while(0);if((h|0)==(w|0)){c[3906]=c[3906]&~(1<<E);break}do{if((h|0)==(d|0)){F=h+8|0}else{if(h>>>0<(c[15640>>2]|0)>>>0){Sb()}g=h+8|0;if((c[g>>2]|0)==(l|0)){F=g;break}Sb()}}while(0);c[w+12>>2]=h;c[F>>2]=w}else{d=k;g=c[a+(j+16)>>2]|0;v=c[a+(j|4)>>2]|0;do{if((v|0)==(d|0)){r=a+(j+12)|0;x=c[r>>2]|0;if((x|0)==0){o=a+(j+8)|0;m=c[o>>2]|0;if((m|0)==0){G=0;break}else{H=m;I=o}}else{H=x;I=r}while(1){r=H+20|0;x=c[r>>2]|0;if((x|0)!=0){I=r;H=x;continue}x=H+16|0;r=c[x>>2]|0;if((r|0)==0){break}else{H=r;I=x}}if(I>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[I>>2]=0;G=H;break}}else{x=c[a+j>>2]|0;if(x>>>0<(c[15640>>2]|0)>>>0){Sb()}r=x+12|0;if((c[r>>2]|0)!=(d|0)){Sb()}o=v+8|0;if((c[o>>2]|0)==(d|0)){c[r>>2]=v;c[o>>2]=x;G=v;break}else{Sb()}}}while(0);if((g|0)==0){break}v=c[a+(j+20)>>2]|0;w=15928+(v<<2)|0;do{if((d|0)==(c[w>>2]|0)){c[w>>2]=G;if((G|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<v);break b}else{if(g>>>0<(c[15640>>2]|0)>>>0){Sb()}h=g+16|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=G}else{c[g+20>>2]=G}if((G|0)==0){break b}}}while(0);if(G>>>0<(c[15640>>2]|0)>>>0){Sb()}c[G+24>>2]=g;d=c[a+(j+8)>>2]|0;do{if((d|0)!=0){if(d>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[G+16>>2]=d;c[d+24>>2]=G;break}}}while(0);d=c[a+(j+12)>>2]|0;if((d|0)==0){break}if(d>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[G+20>>2]=d;c[d+24>>2]=G;break}}}while(0);c[s+4>>2]=D|1;c[e+D>>2]=D;if((s|0)!=(c[15644>>2]|0)){J=D;break}c[15632>>2]=D;i=b;return}else{c[C>>2]=f&-2;c[s+4>>2]=t|1;c[e+t>>2]=t;J=t}}while(0);t=J>>>3;if(J>>>0<256){e=t<<1;f=15664+(e<<2)|0;C=c[3906]|0;G=1<<t;do{if((C&G|0)==0){c[3906]=C|G;K=15664+(e+2<<2)|0;L=f}else{t=15664+(e+2<<2)|0;j=c[t>>2]|0;if(!(j>>>0<(c[15640>>2]|0)>>>0)){K=t;L=j;break}Sb()}}while(0);c[K>>2]=s;c[L+12>>2]=s;c[s+8>>2]=L;c[s+12>>2]=f;i=b;return}f=s;L=J>>>8;do{if((L|0)==0){M=0}else{if(J>>>0>16777215){M=31;break}K=(L+1048320|0)>>>16&8;e=L<<K;G=(e+520192|0)>>>16&4;C=e<<G;e=(C+245760|0)>>>16&2;j=14-(G|K|e)+(C<<e>>>15)|0;M=J>>>(j+7|0)&1|j<<1}}while(0);L=15928+(M<<2)|0;c[s+28>>2]=M;c[s+20>>2]=0;c[s+16>>2]=0;j=c[15628>>2]|0;e=1<<M;c:do{if((j&e|0)==0){c[15628>>2]=j|e;c[L>>2]=f;c[s+24>>2]=L;c[s+12>>2]=s;c[s+8>>2]=s}else{C=c[L>>2]|0;if((M|0)==31){N=0}else{N=25-(M>>>1)|0}d:do{if((c[C+4>>2]&-8|0)==(J|0)){O=C}else{K=J<<N;G=C;while(1){P=G+(K>>>31<<2)+16|0;t=c[P>>2]|0;if((t|0)==0){break}if((c[t+4>>2]&-8|0)==(J|0)){O=t;break d}else{K=K<<1;G=t}}if(P>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[P>>2]=f;c[s+24>>2]=G;c[s+12>>2]=s;c[s+8>>2]=s;break c}}}while(0);C=O+8|0;D=c[C>>2]|0;K=c[15640>>2]|0;if(O>>>0<K>>>0){Sb()}if(D>>>0<K>>>0){Sb()}else{c[D+12>>2]=f;c[C>>2]=f;c[s+8>>2]=D;c[s+12>>2]=O;c[s+24>>2]=0;break}}}while(0);s=(c[15656>>2]|0)+ -1|0;c[15656>>2]=s;if((s|0)==0){Q=16080|0}else{i=b;return}while(1){s=c[Q>>2]|0;if((s|0)==0){break}else{Q=s+8|0}}c[15656>>2]=-1;i=b;return}function Jm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((a|0)==0){e=Hm(b)|0;i=d;return e|0}if(b>>>0>4294967231){c[(Hb()|0)>>2]=12;e=0;i=d;return e|0}if(b>>>0<11){f=16}else{f=b+11&-8}g=Km(a+ -8|0,f)|0;if((g|0)!=0){e=g+8|0;i=d;return e|0}g=Hm(b)|0;if((g|0)==0){e=0;i=d;return e|0}f=c[a+ -4>>2]|0;h=(f&-8)-((f&3|0)==0?8:4)|0;fn(g|0,a|0,(h>>>0<b>>>0?h:b)|0)|0;Im(a);e=g;i=d;return e|0}function Km(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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=i;e=a+4|0;f=c[e>>2]|0;g=f&-8;h=a;j=h+g|0;k=j;l=c[15640>>2]|0;if(h>>>0<l>>>0){Sb()}m=f&3;if(!((m|0)!=1&h>>>0<j>>>0)){Sb()}n=h+(g|4)|0;o=c[n>>2]|0;if((o&1|0)==0){Sb()}if((m|0)==0){if(b>>>0<256){p=0;i=d;return p|0}do{if(!(g>>>0<(b+4|0)>>>0)){if((g-b|0)>>>0>c[16104>>2]<<1>>>0){break}else{p=a}i=d;return p|0}}while(0);p=0;i=d;return p|0}if(!(g>>>0<b>>>0)){m=g-b|0;if(!(m>>>0>15)){p=a;i=d;return p|0}c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=m|3;c[n>>2]=c[n>>2]|1;Lm(h+b|0,m);p=a;i=d;return p|0}if((k|0)==(c[15648>>2]|0)){m=(c[15636>>2]|0)+g|0;if(!(m>>>0>b>>>0)){p=0;i=d;return p|0}n=m-b|0;c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=n|1;c[15648>>2]=h+b;c[15636>>2]=n;p=a;i=d;return p|0}if((k|0)==(c[15644>>2]|0)){n=(c[15632>>2]|0)+g|0;if(n>>>0<b>>>0){p=0;i=d;return p|0}m=n-b|0;if(m>>>0>15){c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=m|1;c[h+n>>2]=m;q=h+(n+4)|0;c[q>>2]=c[q>>2]&-2;r=h+b|0;s=m}else{c[e>>2]=f&1|n|2;f=h+(n+4)|0;c[f>>2]=c[f>>2]|1;r=0;s=0}c[15632>>2]=s;c[15644>>2]=r;p=a;i=d;return p|0}if((o&2|0)!=0){p=0;i=d;return p|0}r=(o&-8)+g|0;if(r>>>0<b>>>0){p=0;i=d;return p|0}s=r-b|0;f=o>>>3;a:do{if(o>>>0<256){n=c[h+(g+8)>>2]|0;m=c[h+(g+12)>>2]|0;q=15664+(f<<1<<2)|0;do{if((n|0)!=(q|0)){if(n>>>0<l>>>0){Sb()}if((c[n+12>>2]|0)==(k|0)){break}Sb()}}while(0);if((m|0)==(n|0)){c[3906]=c[3906]&~(1<<f);break}do{if((m|0)==(q|0)){t=m+8|0}else{if(m>>>0<l>>>0){Sb()}u=m+8|0;if((c[u>>2]|0)==(k|0)){t=u;break}Sb()}}while(0);c[n+12>>2]=m;c[t>>2]=n}else{q=j;u=c[h+(g+24)>>2]|0;v=c[h+(g+12)>>2]|0;do{if((v|0)==(q|0)){w=h+(g+20)|0;x=c[w>>2]|0;if((x|0)==0){y=h+(g+16)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){C=w;B=x;continue}x=B+16|0;w=c[x>>2]|0;if((w|0)==0){break}else{B=w;C=x}}if(C>>>0<l>>>0){Sb()}else{c[C>>2]=0;A=B;break}}else{x=c[h+(g+8)>>2]|0;if(x>>>0<l>>>0){Sb()}w=x+12|0;if((c[w>>2]|0)!=(q|0)){Sb()}y=v+8|0;if((c[y>>2]|0)==(q|0)){c[w>>2]=v;c[y>>2]=x;A=v;break}else{Sb()}}}while(0);if((u|0)==0){break}v=c[h+(g+28)>>2]|0;n=15928+(v<<2)|0;do{if((q|0)==(c[n>>2]|0)){c[n>>2]=A;if((A|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<v);break a}else{if(u>>>0<(c[15640>>2]|0)>>>0){Sb()}m=u+16|0;if((c[m>>2]|0)==(q|0)){c[m>>2]=A}else{c[u+20>>2]=A}if((A|0)==0){break a}}}while(0);if(A>>>0<(c[15640>>2]|0)>>>0){Sb()}c[A+24>>2]=u;q=c[h+(g+16)>>2]|0;do{if((q|0)!=0){if(q>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[A+16>>2]=q;c[q+24>>2]=A;break}}}while(0);q=c[h+(g+20)>>2]|0;if((q|0)==0){break}if(q>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[A+20>>2]=q;c[q+24>>2]=A;break}}}while(0);if(s>>>0<16){c[e>>2]=r|c[e>>2]&1|2;A=h+(r|4)|0;c[A>>2]=c[A>>2]|1;p=a;i=d;return p|0}else{c[e>>2]=c[e>>2]&1|b|2;c[h+(b+4)>>2]=s|3;e=h+(r|4)|0;c[e>>2]=c[e>>2]|1;Lm(h+b|0,s);p=a;i=d;return p|0}return 0}function Lm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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,N=0;d=i;e=a;f=e+b|0;g=f;h=c[a+4>>2]|0;a:do{if((h&1|0)==0){j=c[a>>2]|0;if((h&3|0)==0){i=d;return}k=e+(0-j)|0;l=k;m=j+b|0;n=c[15640>>2]|0;if(k>>>0<n>>>0){Sb()}if((l|0)==(c[15644>>2]|0)){o=e+(b+4)|0;if((c[o>>2]&3|0)!=3){p=l;q=m;break}c[15632>>2]=m;c[o>>2]=c[o>>2]&-2;c[e+(4-j)>>2]=m|1;c[f>>2]=m;i=d;return}o=j>>>3;if(j>>>0<256){r=c[e+(8-j)>>2]|0;s=c[e+(12-j)>>2]|0;t=15664+(o<<1<<2)|0;do{if((r|0)!=(t|0)){if(r>>>0<n>>>0){Sb()}if((c[r+12>>2]|0)==(l|0)){break}Sb()}}while(0);if((s|0)==(r|0)){c[3906]=c[3906]&~(1<<o);p=l;q=m;break}do{if((s|0)==(t|0)){u=s+8|0}else{if(s>>>0<n>>>0){Sb()}v=s+8|0;if((c[v>>2]|0)==(l|0)){u=v;break}Sb()}}while(0);c[r+12>>2]=s;c[u>>2]=r;p=l;q=m;break}t=k;o=c[e+(24-j)>>2]|0;v=c[e+(12-j)>>2]|0;do{if((v|0)==(t|0)){w=16-j|0;x=e+(w+4)|0;y=c[x>>2]|0;if((y|0)==0){z=e+w|0;w=c[z>>2]|0;if((w|0)==0){A=0;break}else{B=w;C=z}}else{B=y;C=x}while(1){x=B+20|0;y=c[x>>2]|0;if((y|0)!=0){C=x;B=y;continue}y=B+16|0;x=c[y>>2]|0;if((x|0)==0){break}else{B=x;C=y}}if(C>>>0<n>>>0){Sb()}else{c[C>>2]=0;A=B;break}}else{y=c[e+(8-j)>>2]|0;if(y>>>0<n>>>0){Sb()}x=y+12|0;if((c[x>>2]|0)!=(t|0)){Sb()}z=v+8|0;if((c[z>>2]|0)==(t|0)){c[x>>2]=v;c[z>>2]=y;A=v;break}else{Sb()}}}while(0);if((o|0)==0){p=l;q=m;break}v=c[e+(28-j)>>2]|0;n=15928+(v<<2)|0;do{if((t|0)==(c[n>>2]|0)){c[n>>2]=A;if((A|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<v);p=l;q=m;break a}else{if(o>>>0<(c[15640>>2]|0)>>>0){Sb()}k=o+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[o+20>>2]=A}if((A|0)==0){p=l;q=m;break a}}}while(0);if(A>>>0<(c[15640>>2]|0)>>>0){Sb()}c[A+24>>2]=o;t=16-j|0;v=c[e+t>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[A+16>>2]=v;c[v+24>>2]=A;break}}}while(0);v=c[e+(t+4)>>2]|0;if((v|0)==0){p=l;q=m;break}if(v>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[A+20>>2]=v;c[v+24>>2]=A;p=l;q=m;break}}else{p=a;q=b}}while(0);a=c[15640>>2]|0;if(f>>>0<a>>>0){Sb()}A=e+(b+4)|0;B=c[A>>2]|0;do{if((B&2|0)==0){if((g|0)==(c[15648>>2]|0)){C=(c[15636>>2]|0)+q|0;c[15636>>2]=C;c[15648>>2]=p;c[p+4>>2]=C|1;if((p|0)!=(c[15644>>2]|0)){i=d;return}c[15644>>2]=0;c[15632>>2]=0;i=d;return}if((g|0)==(c[15644>>2]|0)){C=(c[15632>>2]|0)+q|0;c[15632>>2]=C;c[15644>>2]=p;c[p+4>>2]=C|1;c[p+C>>2]=C;i=d;return}C=(B&-8)+q|0;u=B>>>3;b:do{if(B>>>0<256){h=c[e+(b+8)>>2]|0;v=c[e+(b+12)>>2]|0;j=15664+(u<<1<<2)|0;do{if((h|0)!=(j|0)){if(h>>>0<a>>>0){Sb()}if((c[h+12>>2]|0)==(g|0)){break}Sb()}}while(0);if((v|0)==(h|0)){c[3906]=c[3906]&~(1<<u);break}do{if((v|0)==(j|0)){D=v+8|0}else{if(v>>>0<a>>>0){Sb()}o=v+8|0;if((c[o>>2]|0)==(g|0)){D=o;break}Sb()}}while(0);c[h+12>>2]=v;c[D>>2]=h}else{j=f;o=c[e+(b+24)>>2]|0;n=c[e+(b+12)>>2]|0;do{if((n|0)==(j|0)){k=e+(b+20)|0;r=c[k>>2]|0;if((r|0)==0){s=e+(b+16)|0;y=c[s>>2]|0;if((y|0)==0){E=0;break}else{F=y;G=s}}else{F=r;G=k}while(1){k=F+20|0;r=c[k>>2]|0;if((r|0)!=0){G=k;F=r;continue}r=F+16|0;k=c[r>>2]|0;if((k|0)==0){break}else{F=k;G=r}}if(G>>>0<a>>>0){Sb()}else{c[G>>2]=0;E=F;break}}else{r=c[e+(b+8)>>2]|0;if(r>>>0<a>>>0){Sb()}k=r+12|0;if((c[k>>2]|0)!=(j|0)){Sb()}s=n+8|0;if((c[s>>2]|0)==(j|0)){c[k>>2]=n;c[s>>2]=r;E=n;break}else{Sb()}}}while(0);if((o|0)==0){break}n=c[e+(b+28)>>2]|0;h=15928+(n<<2)|0;do{if((j|0)==(c[h>>2]|0)){c[h>>2]=E;if((E|0)!=0){break}c[15628>>2]=c[15628>>2]&~(1<<n);break b}else{if(o>>>0<(c[15640>>2]|0)>>>0){Sb()}v=o+16|0;if((c[v>>2]|0)==(j|0)){c[v>>2]=E}else{c[o+20>>2]=E}if((E|0)==0){break b}}}while(0);if(E>>>0<(c[15640>>2]|0)>>>0){Sb()}c[E+24>>2]=o;j=c[e+(b+16)>>2]|0;do{if((j|0)!=0){if(j>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[E+16>>2]=j;c[j+24>>2]=E;break}}}while(0);j=c[e+(b+20)>>2]|0;if((j|0)==0){break}if(j>>>0<(c[15640>>2]|0)>>>0){Sb()}else{c[E+20>>2]=j;c[j+24>>2]=E;break}}}while(0);c[p+4>>2]=C|1;c[p+C>>2]=C;if((p|0)!=(c[15644>>2]|0)){H=C;break}c[15632>>2]=C;i=d;return}else{c[A>>2]=B&-2;c[p+4>>2]=q|1;c[p+q>>2]=q;H=q}}while(0);q=H>>>3;if(H>>>0<256){B=q<<1;A=15664+(B<<2)|0;E=c[3906]|0;b=1<<q;do{if((E&b|0)==0){c[3906]=E|b;I=15664+(B+2<<2)|0;J=A}else{q=15664+(B+2<<2)|0;e=c[q>>2]|0;if(!(e>>>0<(c[15640>>2]|0)>>>0)){I=q;J=e;break}Sb()}}while(0);c[I>>2]=p;c[J+12>>2]=p;c[p+8>>2]=J;c[p+12>>2]=A;i=d;return}A=p;J=H>>>8;do{if((J|0)==0){K=0}else{if(H>>>0>16777215){K=31;break}I=(J+1048320|0)>>>16&8;B=J<<I;b=(B+520192|0)>>>16&4;E=B<<b;B=(E+245760|0)>>>16&2;e=14-(b|I|B)+(E<<B>>>15)|0;K=H>>>(e+7|0)&1|e<<1}}while(0);J=15928+(K<<2)|0;c[p+28>>2]=K;c[p+20>>2]=0;c[p+16>>2]=0;e=c[15628>>2]|0;B=1<<K;if((e&B|0)==0){c[15628>>2]=e|B;c[J>>2]=A;c[p+24>>2]=J;c[p+12>>2]=p;c[p+8>>2]=p;i=d;return}B=c[J>>2]|0;if((K|0)==31){L=0}else{L=25-(K>>>1)|0}c:do{if((c[B+4>>2]&-8|0)==(H|0)){M=B}else{K=H<<L;J=B;while(1){N=J+(K>>>31<<2)+16|0;e=c[N>>2]|0;if((e|0)==0){break}if((c[e+4>>2]&-8|0)==(H|0)){M=e;break c}else{K=K<<1;J=e}}if(N>>>0<(c[15640>>2]|0)>>>0){Sb()}c[N>>2]=A;c[p+24>>2]=J;c[p+12>>2]=p;c[p+8>>2]=p;i=d;return}}while(0);N=M+8|0;H=c[N>>2]|0;B=c[15640>>2]|0;if(M>>>0<B>>>0){Sb()}if(H>>>0<B>>>0){Sb()}c[H+12>>2]=A;c[N>>2]=A;c[p+8>>2]=H;c[p+12>>2]=M;c[p+24>>2]=0;i=d;return}function Mm(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=(a|0)==0?1:a;while(1){e=Hm(d)|0;if((e|0)!=0){f=6;break}a=c[4030]|0;c[4030]=a+0;if((a|0)==0){f=5;break}oc[a&0]()}if((f|0)==5){d=Ta(4)|0;c[d>>2]=16136;Vb(d|0,16184,109)}else if((f|0)==6){i=b;return e|0}return 0}function Nm(a){a=a|0;var b=0,c=0;b=i;c=Mm(a)|0;i=b;return c|0}function Om(a){a=a|0;var b=0;b=i;if((a|0)!=0){Im(a)}i=b;return}function Pm(a){a=a|0;var b=0;b=i;Om(a);i=b;return}function Qm(a){a=a|0;var b=0;b=i;Kb(a|0);Om(a);i=b;return}function Rm(a){a=a|0;var b=0;b=i;Kb(a|0);i=b;return}function Sm(a){a=a|0;i=i;return 16152}function Tm(){var a=0;a=Ta(4)|0;c[a>>2]=16136;Vb(a|0,16184,109)}function Um(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0,fa=0,ga=0.0,ha=0,ia=0.0,ja=0,ka=0.0,la=0.0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0.0,ua=0,va=0.0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0.0,Da=0.0,Ea=0,Fa=0.0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=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,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Ib=0,Jb=0,Kb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0.0,xc=0,yc=0,zc=0.0,Ac=0.0,Bc=0.0,Cc=0.0,Dc=0.0,Ec=0.0,Fc=0,Gc=0,Hc=0.0,Ic=0,Jc=0.0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0;g=i;i=i+512|0;h=g;if((e|0)==1){j=53;k=-1074}else if((e|0)==2){j=53;k=-1074}else if((e|0)==0){j=24;k=-149}else{l=0.0;i=g;return+l}e=b+4|0;m=b+100|0;do{n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;o=d[n]|0}else{o=Xm(b)|0}}while((Na(o|0)|0)!=0);do{if((o|0)==43|(o|0)==45){n=1-(((o|0)==45)<<1)|0;p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;q=d[p]|0;r=n;break}else{q=Xm(b)|0;r=n;break}}else{q=o;r=1}}while(0);o=q;q=0;while(1){if((o|32|0)!=(a[16200+q|0]|0)){s=o;t=q;break}do{if(q>>>0<7){n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;u=d[n]|0;break}else{u=Xm(b)|0;break}}else{u=o}}while(0);n=q+1|0;if(n>>>0<8){o=u;q=n}else{s=u;t=n;break}}do{if((t|0)==3){v=23}else if((t|0)!=8){u=(f|0)==0;if(!(t>>>0<4|u)){if((t|0)==8){break}else{v=23;break}}a:do{if((t|0)==0){q=s;o=0;while(1){if((q|32|0)!=(a[16216+o|0]|0)){w=q;z=o;break a}do{if(o>>>0<2){n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;A=d[n]|0;break}else{A=Xm(b)|0;break}}else{A=q}}while(0);n=o+1|0;if(n>>>0<3){q=A;o=n}else{w=A;z=n;break}}}else{w=s;z=t}}while(0);if((z|0)==0){do{if((w|0)==48){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;B=d[o]|0}else{B=Xm(b)|0}if((B|32|0)!=120){if((c[m>>2]|0)==0){C=48;break}c[e>>2]=(c[e>>2]|0)+ -1;C=48;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0;E=0}else{D=Xm(b)|0;E=0}while(1){if((D|0)==46){v=70;break}else if((D|0)!=48){F=0;G=0;H=0;J=0;K=D;L=E;M=0;N=0;O=1.0;P=0;Q=0.0;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0;E=1;continue}else{D=Xm(b)|0;E=1;continue}}b:do{if((v|0)==70){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;R=d[o]|0}else{R=Xm(b)|0}if((R|0)==48){S=-1;U=-1}else{F=0;G=0;H=0;J=0;K=R;L=E;M=1;N=0;O=1.0;P=0;Q=0.0;break}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;V=d[o]|0}else{V=Xm(b)|0}if((V|0)!=48){F=S;G=U;H=0;J=0;K=V;L=1;M=1;N=0;O=1.0;P=0;Q=0.0;break b}o=en(S|0,U|0,-1,-1)|0;S=o;U=I}}}while(0);c:while(1){o=K+ -48|0;do{if(o>>>0<10){W=o;v=84}else{q=K|32;n=(K|0)==46;if(!((q+ -97|0)>>>0<6|n)){X=K;break c}if(n){if((M|0)==0){Y=H;Z=J;_=H;$=J;aa=L;ba=1;ca=N;da=O;fa=P;ga=Q;break}else{X=46;break c}}else{W=(K|0)>57?q+ -87|0:o;v=84;break}}}while(0);if((v|0)==84){v=0;do{if((J|0)<0|(J|0)==0&H>>>0<8){ha=N;ia=O;ja=W+(P<<4)|0;ka=Q}else{if((J|0)<0|(J|0)==0&H>>>0<14){la=O*.0625;ha=N;ia=la;ja=P;ka=Q+la*+(W|0);break}if(!((W|0)!=0&(N|0)==0)){ha=N;ia=O;ja=P;ka=Q;break}ha=1;ia=O;ja=P;ka=Q+O*.5}}while(0);o=en(H|0,J|0,1,0)|0;Y=F;Z=G;_=o;$=I;aa=1;ba=M;ca=ha;da=ia;fa=ja;ga=ka}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;F=Y;G=Z;H=_;J=$;K=d[o]|0;L=aa;M=ba;N=ca;O=da;P=fa;Q=ga;continue}else{F=Y;G=Z;H=_;J=$;K=Xm(b)|0;L=aa;M=ba;N=ca;O=da;P=fa;Q=ga;continue}}if((L|0)==0){o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)+ -1}do{if(u){Wm(b,0)}else{if(o){break}q=c[e>>2]|0;c[e>>2]=q+ -1;if((M|0)==0){break}c[e>>2]=q+ -2}}while(0);l=+(r|0)*0.0;i=g;return+l}o=(M|0)==0;q=o?H:F;n=o?J:G;if((J|0)<0|(J|0)==0&H>>>0<8){o=H;p=J;ma=P;while(1){na=ma<<4;oa=en(o|0,p|0,1,0)|0;pa=I;if((pa|0)<0|(pa|0)==0&oa>>>0<8){ma=na;p=pa;o=oa}else{qa=na;break}}}else{qa=P}do{if((X|32|0)==112){o=Vm(b,f)|0;p=I;if(!((o|0)==0&(p|0)==-2147483648)){ra=o;sa=p;break}if(u){Wm(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){ra=0;sa=0;break}c[e>>2]=(c[e>>2]|0)+ -1;ra=0;sa=0;break}}else{if((c[m>>2]|0)==0){ra=0;sa=0;break}c[e>>2]=(c[e>>2]|0)+ -1;ra=0;sa=0}}while(0);p=kn(q|0,n|0,2)|0;o=en(p|0,I|0,-32,-1)|0;p=en(o|0,I|0,ra|0,sa|0)|0;o=I;if((qa|0)==0){l=+(r|0)*0.0;i=g;return+l}if((o|0)>0|(o|0)==0&p>>>0>(0-k|0)>>>0){c[(Hb()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}ma=k+ -106|0;na=((ma|0)<0)<<31>>31;if((o|0)<(na|0)|(o|0)==(na|0)&p>>>0<ma>>>0){c[(Hb()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((qa|0)>-1){ma=p;na=o;oa=qa;la=Q;while(1){pa=oa<<1;if(!(la>=.5)){ta=la;ua=pa}else{ta=la+-1.0;ua=pa|1}va=la+ta;pa=en(ma|0,na|0,-1,-1)|0;wa=I;if((ua|0)>-1){ma=pa;na=wa;oa=ua;la=va}else{xa=pa;ya=wa;za=ua;Aa=va;break}}}else{xa=p;ya=o;za=qa;Aa=Q}oa=dn(32,0,k|0,((k|0)<0)<<31>>31|0)|0;na=en(xa|0,ya|0,oa|0,I|0)|0;oa=I;if(0>(oa|0)|0==(oa|0)&j>>>0>na>>>0){Ba=(na|0)<0?0:na}else{Ba=j}do{if((Ba|0)<53){la=+(r|0);va=+Lb(+(+Ym(1.0,84-Ba|0)),+la);if(!((Ba|0)<32&Aa!=0.0)){Ca=la;Da=va;Ea=za;Fa=Aa;break}na=za&1;Ca=la;Da=va;Ea=(na^1)+za|0;Fa=(na|0)==0?0.0:Aa}else{Ca=+(r|0);Da=0.0;Ea=za;Fa=Aa}}while(0);va=Ca*Fa+(Da+Ca*+(Ea>>>0))-Da;if(!(va!=0.0)){c[(Hb()|0)>>2]=34}l=+Zm(va,xa);i=g;return+l}else{C=w}}while(0);o=k+j|0;p=0-o|0;na=C;oa=0;while(1){if((na|0)==46){v=139;break}else if((na|0)!=48){Ga=na;Ha=0;Ia=0;Ja=oa;Ka=0;break}ma=c[e>>2]|0;if(ma>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ma+1;na=d[ma]|0;oa=1;continue}else{na=Xm(b)|0;oa=1;continue}}d:do{if((v|0)==139){na=c[e>>2]|0;if(na>>>0<(c[m>>2]|0)>>>0){c[e>>2]=na+1;Ma=d[na]|0}else{Ma=Xm(b)|0}if((Ma|0)==48){Oa=-1;Pa=-1}else{Ga=Ma;Ha=0;Ia=0;Ja=oa;Ka=1;break}while(1){na=c[e>>2]|0;if(na>>>0<(c[m>>2]|0)>>>0){c[e>>2]=na+1;Qa=d[na]|0}else{Qa=Xm(b)|0}if((Qa|0)!=48){Ga=Qa;Ha=Oa;Ia=Pa;Ja=1;Ka=1;break d}na=en(Oa|0,Pa|0,-1,-1)|0;Oa=na;Pa=I}}}while(0);oa=h;c[oa>>2]=0;na=Ga+ -48|0;ma=(Ga|0)==46;e:do{if(na>>>0<10|ma){n=h+496|0;q=Ga;wa=ma;pa=na;Ra=0;Sa=0;Ta=Ha;Ua=Ia;Va=Ja;Wa=Ka;Xa=0;Ya=0;Za=0;while(1){do{if(wa){if((Wa|0)==0){_a=Ra;$a=Sa;ab=Ra;bb=Sa;cb=Va;db=1;eb=Xa;fb=Ya;gb=Za}else{hb=q;ib=Ra;jb=Sa;kb=Ta;lb=Ua;mb=Va;nb=Xa;ob=Ya;pb=Za;break e}}else{qb=en(Ra|0,Sa|0,1,0)|0;rb=I;sb=(q|0)!=48;if((Ya|0)>=125){if(!sb){_a=Ta;$a=Ua;ab=qb;bb=rb;cb=Va;db=Wa;eb=Xa;fb=Ya;gb=Za;break}c[n>>2]=c[n>>2]|1;_a=Ta;$a=Ua;ab=qb;bb=rb;cb=Va;db=Wa;eb=Xa;fb=Ya;gb=Za;break}tb=h+(Ya<<2)|0;if((Xa|0)==0){ub=pa}else{ub=q+ -48+((c[tb>>2]|0)*10|0)|0}c[tb>>2]=ub;tb=Xa+1|0;vb=(tb|0)==9;_a=Ta;$a=Ua;ab=qb;bb=rb;cb=1;db=Wa;eb=vb?0:tb;fb=(vb&1)+Ya|0;gb=sb?qb:Za}}while(0);qb=c[e>>2]|0;if(qb>>>0<(c[m>>2]|0)>>>0){c[e>>2]=qb+1;wb=d[qb]|0}else{wb=Xm(b)|0}qb=wb+ -48|0;sb=(wb|0)==46;if(qb>>>0<10|sb){q=wb;wa=sb;pa=qb;Ra=ab;Sa=bb;Ta=_a;Ua=$a;Va=cb;Wa=db;Xa=eb;Ya=fb;Za=gb}else{xb=wb;yb=ab;zb=bb;Ab=_a;Bb=$a;Cb=cb;Db=db;Eb=eb;Fb=fb;Gb=gb;v=162;break}}}else{xb=Ga;yb=0;zb=0;Ab=Ha;Bb=Ia;Cb=Ja;Db=Ka;Eb=0;Fb=0;Gb=0;v=162}}while(0);if((v|0)==162){na=(Db|0)==0;hb=xb;ib=yb;jb=zb;kb=na?yb:Ab;lb=na?zb:Bb;mb=Cb;nb=Eb;ob=Fb;pb=Gb}na=(mb|0)!=0;do{if(na){if((hb|32|0)!=101){v=171;break}ma=Vm(b,f)|0;Za=I;do{if((ma|0)==0&(Za|0)==-2147483648){if(u){Wm(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){Ib=0;Jb=0;break}c[e>>2]=(c[e>>2]|0)+ -1;Ib=0;Jb=0;break}}else{Ib=ma;Jb=Za}}while(0);Za=en(Ib|0,Jb|0,kb|0,lb|0)|0;Kb=Za;Mb=I}else{v=171}}while(0);do{if((v|0)==171){if(!((hb|0)>-1)){Kb=kb;Mb=lb;break}if((c[m>>2]|0)==0){Kb=kb;Mb=lb;break}c[e>>2]=(c[e>>2]|0)+ -1;Kb=kb;Mb=lb}}while(0);if(!na){c[(Hb()|0)>>2]=22;Wm(b,0);l=0.0;i=g;return+l}Za=c[oa>>2]|0;if((Za|0)==0){l=+(r|0)*0.0;i=g;return+l}do{if((Kb|0)==(ib|0)&(Mb|0)==(jb|0)&((jb|0)<0|(jb|0)==0&ib>>>0<10)){if(!(j>>>0>30)){if((Za>>>j|0)!=0){break}}l=+(r|0)*+(Za>>>0);i=g;return+l}}while(0);Za=(k|0)/-2|0;na=((Za|0)<0)<<31>>31;if((Mb|0)>(na|0)|(Mb|0)==(na|0)&Kb>>>0>Za>>>0){c[(Hb()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}Za=k+ -106|0;na=((Za|0)<0)<<31>>31;if((Mb|0)<(na|0)|(Mb|0)==(na|0)&Kb>>>0<Za>>>0){c[(Hb()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((nb|0)==0){Nb=ob}else{if((nb|0)<9){Za=h+(ob<<2)|0;na=c[Za>>2]|0;ma=nb;do{na=na*10|0;ma=ma+1|0;}while((ma|0)!=9);c[Za>>2]=na}Nb=ob+1|0}do{if((pb|0)<9){if(!((pb|0)<=(Kb|0)&(Kb|0)<18)){break}if((Kb|0)==9){l=+(r|0)*+((c[oa>>2]|0)>>>0);i=g;return+l}if((Kb|0)<9){l=+(r|0)*+((c[oa>>2]|0)>>>0)/+(c[16232+(8-Kb<<2)>>2]|0);i=g;return+l}ma=j+27+(ea(Kb,-3)|0)|0;Ya=c[oa>>2]|0;if((ma|0)<=30){if((Ya>>>ma|0)!=0){break}}l=+(r|0)*+(Ya>>>0)*+(c[16232+(Kb+ -10<<2)>>2]|0);i=g;return+l}}while(0);oa=(Kb|0)%9|0;if((oa|0)==0){Ob=0;Pb=0;Qb=Kb;Rb=Nb}else{na=(Kb|0)>-1?oa:oa+9|0;oa=c[16232+(8-na<<2)>>2]|0;do{if((Nb|0)==0){Sb=0;Tb=Kb;Ub=0}else{Za=1e9/(oa|0)|0;Ya=0;ma=0;Xa=0;Wa=Kb;while(1){Va=h+(Xa<<2)|0;Ua=c[Va>>2]|0;Ta=((Ua>>>0)/(oa>>>0)|0)+ma|0;c[Va>>2]=Ta;Vb=ea((Ua>>>0)%(oa>>>0)|0,Za)|0;Ua=Xa+1|0;if((Xa|0)==(Ya|0)&(Ta|0)==0){Wb=Ua&127;Xb=Wa+ -9|0}else{Wb=Ya;Xb=Wa}if((Ua|0)==(Nb|0)){break}else{Ya=Wb;Wa=Xb;Xa=Ua;ma=Vb}}if((Vb|0)==0){Sb=Wb;Tb=Xb;Ub=Nb;break}c[h+(Nb<<2)>>2]=Vb;Sb=Wb;Tb=Xb;Ub=Nb+1|0}}while(0);Ob=Sb;Pb=0;Qb=9-na+Tb|0;Rb=Ub}f:while(1){oa=h+(Ob<<2)|0;if((Qb|0)<18){ma=Pb;Xa=Rb;while(1){Wa=0;Ya=Xa+127|0;Za=Xa;while(1){Ua=Ya&127;Ta=h+(Ua<<2)|0;Va=kn(c[Ta>>2]|0,0,29)|0;Sa=en(Va|0,I|0,Wa|0,0)|0;Va=I;if(Va>>>0>0|(Va|0)==0&Sa>>>0>1e9){Ra=sn(Sa|0,Va|0,1e9,0)|0;pa=tn(Sa|0,Va|0,1e9,0)|0;Yb=pa;Zb=Ra}else{Yb=Sa;Zb=0}c[Ta>>2]=Yb;Ta=(Ua|0)==(Ob|0);if((Ua|0)!=(Za+127&127|0)|Ta){_b=Za}else{_b=(Yb|0)==0?Ua:Za}if(Ta){break}else{Wa=Zb;Ya=Ua+ -1|0;Za=_b}}Za=ma+ -29|0;if((Zb|0)==0){ma=Za;Xa=_b}else{$b=Za;ac=Zb;bc=_b;break}}}else{if((Qb|0)==18){cc=Pb;dc=Rb}else{ec=Ob;fc=Pb;gc=Qb;hc=Rb;break}while(1){if(!((c[oa>>2]|0)>>>0<9007199)){ec=Ob;fc=cc;gc=18;hc=dc;break f}Xa=0;ma=dc+127|0;Za=dc;while(1){Ya=ma&127;Wa=h+(Ya<<2)|0;Ua=kn(c[Wa>>2]|0,0,29)|0;Ta=en(Ua|0,I|0,Xa|0,0)|0;Ua=I;if(Ua>>>0>0|(Ua|0)==0&Ta>>>0>1e9){Sa=sn(Ta|0,Ua|0,1e9,0)|0;Ra=tn(Ta|0,Ua|0,1e9,0)|0;ic=Ra;jc=Sa}else{ic=Ta;jc=0}c[Wa>>2]=ic;Wa=(Ya|0)==(Ob|0);if((Ya|0)!=(Za+127&127|0)|Wa){kc=Za}else{kc=(ic|0)==0?Ya:Za}if(Wa){break}else{Xa=jc;ma=Ya+ -1|0;Za=kc}}Za=cc+ -29|0;if((jc|0)==0){cc=Za;dc=kc}else{$b=Za;ac=jc;bc=kc;break}}}oa=Ob+127&127;if((oa|0)==(bc|0)){Za=bc+127&127;ma=h+((bc+126&127)<<2)|0;c[ma>>2]=c[ma>>2]|c[h+(Za<<2)>>2];lc=Za}else{lc=bc}c[h+(oa<<2)>>2]=ac;Ob=oa;Pb=$b;Qb=Qb+9|0;Rb=lc}g:while(1){mc=hc+1&127;na=h+((hc+127&127)<<2)|0;oa=ec;Za=fc;ma=gc;while(1){Xa=(ma|0)==18;Ya=(ma|0)>27?9:1;nc=oa;oc=Za;while(1){Wa=0;while(1){Ta=Wa+nc&127;if((Ta|0)==(hc|0)){pc=2;break}Sa=c[h+(Ta<<2)>>2]|0;Ta=c[16224+(Wa<<2)>>2]|0;if(Sa>>>0<Ta>>>0){pc=2;break}Ra=Wa+1|0;if(Sa>>>0>Ta>>>0){pc=Wa;break}if((Ra|0)<2){Wa=Ra}else{pc=Ra;break}}if((pc|0)==2&Xa){break g}qc=Ya+oc|0;if((nc|0)==(hc|0)){nc=hc;oc=qc}else{break}}Xa=(1<<Ya)+ -1|0;Wa=1e9>>>Ya;rc=nc;sc=0;Ra=nc;tc=ma;do{Ta=h+(Ra<<2)|0;Sa=c[Ta>>2]|0;Ua=(Sa>>>Ya)+sc|0;c[Ta>>2]=Ua;sc=ea(Sa&Xa,Wa)|0;Sa=(Ra|0)==(rc|0)&(Ua|0)==0;Ra=Ra+1&127;tc=Sa?tc+ -9|0:tc;rc=Sa?Ra:rc;}while((Ra|0)!=(hc|0));if((sc|0)==0){oa=rc;Za=qc;ma=tc;continue}if((mc|0)!=(rc|0)){break}c[na>>2]=c[na>>2]|1;oa=rc;Za=qc;ma=tc}c[h+(hc<<2)>>2]=sc;ec=rc;fc=qc;gc=tc;hc=mc}ma=nc&127;if((ma|0)==(hc|0)){c[h+(mc+ -1<<2)>>2]=0;uc=mc}else{uc=hc}va=+((c[h+(ma<<2)>>2]|0)>>>0);ma=nc+1&127;if((ma|0)==(uc|0)){Za=uc+1&127;c[h+(Za+ -1<<2)>>2]=0;vc=Za}else{vc=uc}la=+(r|0);wc=la*(va*1.0e9+ +((c[h+(ma<<2)>>2]|0)>>>0));ma=oc+53|0;Za=ma-k|0;if((Za|0)<(j|0)){xc=(Za|0)<0?0:Za;yc=1}else{xc=j;yc=0}if((xc|0)<53){va=+Lb(+(+Ym(1.0,105-xc|0)),+wc);zc=+La(+wc,+(+Ym(1.0,53-xc|0)));Ac=va;Bc=zc;Cc=va+(wc-zc)}else{Ac=0.0;Bc=0.0;Cc=wc}oa=nc+2&127;do{if((oa|0)==(vc|0)){Dc=Bc}else{na=c[h+(oa<<2)>>2]|0;do{if(na>>>0<5e8){if((na|0)==0){if((nc+3&127|0)==(vc|0)){Ec=Bc;break}}Ec=la*.25+Bc}else{if(na>>>0>5e8){Ec=la*.75+Bc;break}if((nc+3&127|0)==(vc|0)){Ec=la*.5+Bc;break}else{Ec=la*.75+Bc;break}}}while(0);if((53-xc|0)<=1){Dc=Ec;break}if(+La(+Ec,1.0)!=0.0){Dc=Ec;break}Dc=Ec+1.0}}while(0);la=Cc+Dc-Ac;do{if((ma&2147483647|0)>(-2-o|0)){if(!(+T(+la)>=9007199254740992.0)){Fc=yc;Gc=oc;Hc=la}else{Fc=(yc|0)!=0&(xc|0)==(Za|0)?0:yc;Gc=oc+1|0;Hc=la*.5}if((Gc+50|0)<=(p|0)){if(!((Fc|0)!=0&Dc!=0.0)){Ic=Gc;Jc=Hc;break}}c[(Hb()|0)>>2]=34;Ic=Gc;Jc=Hc}else{Ic=oc;Jc=la}}while(0);l=+Zm(Jc,Ic);i=g;return+l}else if((z|0)==3){p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;Kc=d[p]|0}else{Kc=Xm(b)|0}if((Kc|0)==40){Lc=1}else{if((c[m>>2]|0)==0){l=x;i=g;return+l}c[e>>2]=(c[e>>2]|0)+ -1;l=x;i=g;return+l}while(1){p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;Mc=d[p]|0}else{Mc=Xm(b)|0}if(!((Mc+ -48|0)>>>0<10|(Mc+ -65|0)>>>0<26)){if(!((Mc+ -97|0)>>>0<26|(Mc|0)==95)){break}}Lc=Lc+1|0}if((Mc|0)==41){l=x;i=g;return+l}p=(c[m>>2]|0)==0;if(!p){c[e>>2]=(c[e>>2]|0)+ -1}if(u){c[(Hb()|0)>>2]=22;Wm(b,0);l=0.0;i=g;return+l}if((Lc|0)==0|p){l=x;i=g;return+l}else{Nc=Lc}while(1){p=Nc+ -1|0;c[e>>2]=(c[e>>2]|0)+ -1;if((p|0)==0){l=x;break}else{Nc=p}}i=g;return+l}else{if((c[m>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)+ -1}c[(Hb()|0)>>2]=22;Wm(b,0);l=0.0;i=g;return+l}}}while(0);do{if((v|0)==23){b=(c[m>>2]|0)==0;if(!b){c[e>>2]=(c[e>>2]|0)+ -1}if(t>>>0<4|(f|0)==0|b){break}else{Oc=t}do{c[e>>2]=(c[e>>2]|0)+ -1;Oc=Oc+ -1|0;}while(Oc>>>0>3)}}while(0);l=+(r|0)*y;i=g;return+l}function Vm(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=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;e=i;f=a+4|0;g=c[f>>2]|0;h=a+100|0;if(g>>>0<(c[h>>2]|0)>>>0){c[f>>2]=g+1;j=d[g]|0}else{j=Xm(a)|0}do{if((j|0)==43|(j|0)==45){g=(j|0)==45|0;k=c[f>>2]|0;if(k>>>0<(c[h>>2]|0)>>>0){c[f>>2]=k+1;l=d[k]|0}else{l=Xm(a)|0}if((l+ -48|0)>>>0<10|(b|0)==0){m=l;n=g;break}if((c[h>>2]|0)==0){m=l;n=g;break}c[f>>2]=(c[f>>2]|0)+ -1;m=l;n=g}else{m=j;n=0}}while(0);if((m+ -48|0)>>>0>9){if((c[h>>2]|0)==0){o=0;p=-2147483648;I=p;i=e;return o|0}c[f>>2]=(c[f>>2]|0)+ -1;o=0;p=-2147483648;I=p;i=e;return o|0}else{q=m;r=0}while(1){s=q+ -48+r|0;m=c[f>>2]|0;if(m>>>0<(c[h>>2]|0)>>>0){c[f>>2]=m+1;t=d[m]|0}else{t=Xm(a)|0}if(!((t+ -48|0)>>>0<10&(s|0)<214748364)){break}q=t;r=s*10|0}r=((s|0)<0)<<31>>31;if((t+ -48|0)>>>0<10){q=s;m=r;j=t;while(1){l=rn(q|0,m|0,10,0)|0;b=I;g=en(j|0,((j|0)<0)<<31>>31|0,-48,-1)|0;k=en(g|0,I|0,l|0,b|0)|0;b=I;l=c[f>>2]|0;if(l>>>0<(c[h>>2]|0)>>>0){c[f>>2]=l+1;u=d[l]|0}else{u=Xm(a)|0}if((u+ -48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&k>>>0<2061584302)){j=u;m=b;q=k}else{v=k;w=b;x=u;break}}}else{v=s;w=r;x=t}if((x+ -48|0)>>>0<10){do{x=c[f>>2]|0;if(x>>>0<(c[h>>2]|0)>>>0){c[f>>2]=x+1;y=d[x]|0}else{y=Xm(a)|0}}while((y+ -48|0)>>>0<10)}if((c[h>>2]|0)!=0){c[f>>2]=(c[f>>2]|0)+ -1}f=(n|0)!=0;n=dn(0,0,v|0,w|0)|0;o=f?n:v;p=f?I:w;I=p;i=e;return o|0}function Wm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a+104>>2]=b;e=c[a+8>>2]|0;f=c[a+4>>2]|0;g=e-f|0;c[a+108>>2]=g;if((b|0)!=0&(g|0)>(b|0)){c[a+100>>2]=f+b;i=d;return}else{c[a+100>>2]=e;i=d;return}}function Xm(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=b+104|0;g=c[f>>2]|0;if((g|0)==0){h=3}else{if((c[b+108>>2]|0)<(g|0)){h=3}}do{if((h|0)==3){g=$m(b)|0;if((g|0)<0){break}j=c[f>>2]|0;k=c[b+8>>2]|0;do{if((j|0)==0){h=8}else{l=c[b+4>>2]|0;m=j-(c[b+108>>2]|0)+ -1|0;if((k-l|0)<=(m|0)){h=8;break}c[b+100>>2]=l+m}}while(0);if((h|0)==8){c[b+100>>2]=k}j=c[b+4>>2]|0;if((k|0)!=0){m=b+108|0;c[m>>2]=k+1-j+(c[m>>2]|0)}m=j+ -1|0;if((d[m]|0|0)==(g|0)){n=g;i=e;return n|0}a[m]=g;n=g;i=e;return n|0}}while(0);c[b+100>>2]=0;n=-1;i=e;return n|0}function Ym(a,b){a=+a;b=b|0;var d=0,e=0.0,f=0,g=0,j=0.0;d=i;do{if((b|0)>1023){e=a*8.98846567431158e+307;f=b+ -1023|0;if((f|0)<=1023){g=f;j=e;break}f=b+ -2046|0;g=(f|0)>1023?1023:f;j=e*8.98846567431158e+307}else{if(!((b|0)<-1022)){g=b;j=a;break}e=a*2.2250738585072014e-308;f=b+1022|0;if(!((f|0)<-1022)){g=f;j=e;break}f=b+2044|0;g=(f|0)<-1022?-1022:f;j=e*2.2250738585072014e-308}}while(0);b=kn(g+1023|0,0,52)|0;g=I;c[k>>2]=b;c[k+4>>2]=g;a=j*+h[k>>3];i=d;return+a}function Zm(a,b){a=+a;b=b|0;var c=0,d=0.0;c=i;d=+Ym(a,b);i=c;return+d}function _m(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b+74|0;f=a[e]|0;a[e]=f+255|f;f=b+20|0;e=b+44|0;if((c[f>>2]|0)>>>0>(c[e>>2]|0)>>>0){ec[c[b+36>>2]&31](b,0,0)|0}c[b+16>>2]=0;c[b+28>>2]=0;c[f>>2]=0;f=b;g=c[f>>2]|0;if((g&20|0)==0){h=c[e>>2]|0;c[b+8>>2]=h;c[b+4>>2]=h;j=0;i=d;return j|0}if((g&4|0)==0){j=-1;i=d;return j|0}c[f>>2]=g|32;j=-1;i=d;return j|0}function $m(a){a=a|0;var b=0,e=0,f=0,g=0;b=i;i=i+8|0;e=b;if((c[a+8>>2]|0)==0){if((_m(a)|0)==0){f=3}else{g=-1}}else{f=3}do{if((f|0)==3){if((ec[c[a+32>>2]&31](a,e,1)|0)!=1){g=-1;break}g=d[e]|0}}while(0);i=b;return g|0}function an(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0.0,j=0,k=0;d=i;i=i+112|0;e=d;f=e+0|0;g=f+112|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=e+4|0;c[f>>2]=a;g=e+8|0;c[g>>2]=-1;c[e+44>>2]=a;c[e+76>>2]=-1;Wm(e,0);h=+Um(e,2,1);j=(c[f>>2]|0)-(c[g>>2]|0)+(c[e+108>>2]|0)|0;if((b|0)==0){i=d;return+h}if((j|0)==0){k=a}else{k=a+j|0}c[b>>2]=k;i=d;return+h}function bn(){c[1054]=o;c[1080]=o;c[3818]=o;c[4048]=o}function cn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function dn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return(I=e,a-c>>>0|0)|0}function en(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return(I=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function fn(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return kb(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function gn(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]=a[c]|0}b=e}else{fn(b,c,d)|0}return b|0}function hn(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function jn(b){b=b|0;var c=0;c=a[n+(b>>>24)|0]|0;if((c|0)<8)return c|0;c=a[n+(b>>16&255)|0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>8&255)|0]|0;if((c|0)<8)return c+16|0;return(a[n+(b&255)|0]|0)+24|0}function kn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}I=a<<c-32;return 0}function ln(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=0;return b>>>c-32|0}function mn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=(b|0)<0?-1:0;return b>>c-32|0}function nn(b){b=b|0;var c=0;c=a[m+(b&255)|0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)|0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)|0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)|0]|0)+24|0}function on(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=ea(d,c)|0;f=a>>>16;a=(e>>>16)+(ea(d,f)|0)|0;d=b>>>16;b=ea(d,c)|0;return(I=(a>>>16)+(ea(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function pn(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>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=dn(e^a,f^b,e,f)|0;b=I;a=g^e;e=h^f;f=dn((un(i,b,dn(g^c,h^d,g,h)|0,I,0)|0)^a,I^e,a,e)|0;return(I=I,f)|0}function qn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+8|0;g=f|0;h=b>>31|((b|0)<0?-1:0)<<1;j=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;l=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;m=dn(h^a,j^b,h,j)|0;b=I;un(m,b,dn(k^d,l^e,k,l)|0,I,g)|0;l=dn(c[g>>2]^h,c[g+4>>2]^j,h,j)|0;j=I;i=f;return(I=j,l)|0}function rn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=on(e,a)|0;f=I;return(I=(ea(b,a)|0)+(ea(d,e)|0)+f|f&0,c|0|0)|0}function sn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=un(a,b,c,d,0)|0;return(I=I,e)|0}function tn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+8|0;g=f|0;un(a,b,d,e,g)|0;i=f;return(I=c[g+4>>2]|0,c[g>>2]|0)|0}function un(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,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,J=0,K=0,L=0,M=0;g=a;h=b;i=h;j=d;k=e;l=k;if((i|0)==0){m=(f|0)!=0;if((l|0)==0){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return(I=n,o)|0}else{if(!m){n=0;o=0;return(I=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return(I=n,o)|0}}m=(l|0)==0;do{if((j|0)==0){if(m){if((f|0)!=0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return(I=n,o)|0}if((g|0)==0){if((f|0)!=0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return(I=n,o)|0}p=l-1|0;if((p&l|0)==0){if((f|0)!=0){c[f>>2]=a|0;c[f+4>>2]=p&i|b&0}n=0;o=i>>>((nn(l|0)|0)>>>0);return(I=n,o)|0}p=(jn(l|0)|0)-(jn(i|0)|0)|0;if(p>>>0<=30){q=p+1|0;r=31-p|0;s=q;t=i<<r|g>>>(q>>>0);u=i>>>(q>>>0);v=0;w=g<<r;break}if((f|0)==0){n=0;o=0;return(I=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(I=n,o)|0}else{if(!m){r=(jn(l|0)|0)-(jn(i|0)|0)|0;if(r>>>0<=31){q=r+1|0;p=31-r|0;x=r-31>>31;s=q;t=g>>>(q>>>0)&x|i<<p;u=i>>>(q>>>0)&x;v=0;w=g<<p;break}if((f|0)==0){n=0;o=0;return(I=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(I=n,o)|0}p=j-1|0;if((p&j|0)!=0){x=(jn(j|0)|0)+33-(jn(i|0)|0)|0;q=64-x|0;r=32-x|0;y=r>>31;z=x-32|0;A=z>>31;s=x;t=r-1>>31&i>>>(z>>>0)|(i<<r|g>>>(x>>>0))&A;u=A&i>>>(x>>>0);v=g<<q&y;w=(i<<q|g>>>(z>>>0))&y|g<<r&x-33>>31;break}if((f|0)!=0){c[f>>2]=p&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return(I=n,o)|0}else{p=nn(j|0)|0;n=i>>>(p>>>0)|0;o=i<<32-p|g>>>(p>>>0)|0;return(I=n,o)|0}}}while(0);if((s|0)==0){B=w;C=v;D=u;E=t;F=0;G=0}else{g=d|0|0;d=k|e&0;e=en(g,d,-1,-1)|0;k=I;i=w;w=v;v=u;u=t;t=s;s=0;while(1){H=w>>>31|i<<1;J=s|w<<1;j=u<<1|i>>>31|0;a=u>>>31|v<<1|0;dn(e,k,j,a)|0;b=I;h=b>>31|((b|0)<0?-1:0)<<1;K=h&1;L=dn(j,a,h&g,(((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1)&d)|0;M=I;b=t-1|0;if((b|0)==0){break}else{i=H;w=J;v=M;u=L;t=b;s=K}}B=H;C=J;D=M;E=L;F=0;G=K}K=C;C=0;if((f|0)!=0){c[f>>2]=E;c[f+4>>2]=D}n=(K|0)>>>31|(B|C)<<1|(C<<1|K>>>31)&0|F;o=(K<<1|0>>>31)&-2|G;return(I=n,o)|0}function vn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ec[a&31](b|0,c|0,d|0)|0}function wn(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;fc[a&63](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function xn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;gc[a&3](b|0,c|0,d|0,e|0,f|0)}function yn(a,b){a=a|0;b=b|0;hc[a&127](b|0)}function zn(a,b,c){a=a|0;b=b|0;c=c|0;ic[a&63](b|0,c|0)}function An(a,b,c,d,e,f,g,h,i,j){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;jc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function Bn(a,b){a=a|0;b=b|0;return kc[a&63](b|0)|0}function Cn(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;lc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,+h)}function Dn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;mc[a&3](b|0,c|0,d|0)}function En(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;nc[a&7](b|0,c|0,d|0,e|0,f|0,+g)}function Fn(a){a=a|0;oc[a&0]()}function Gn(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 pc[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Hn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return qc[a&7](b|0,c|0,d|0,e|0)|0}function In(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;rc[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function Jn(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;sc[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function Kn(a,b,c){a=a|0;b=b|0;c=c|0;return tc[a&15](b|0,c|0)|0}function Ln(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 uc[a&15](b|0,c|0,d|0,e|0,f|0)|0}function Mn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;vc[a&7](b|0,c|0,d|0,e|0)}function Nn(a,b,c){a=a|0;b=b|0;c=c|0;fa(0);return 0}function On(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;fa(1)}function Pn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fa(2)}function Qn(a){a=a|0;fa(3)}function Rn(a,b){a=a|0;b=b|0;fa(4)}function Sn(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;fa(5)}function Tn(a){a=a|0;fa(6);return 0}function Un(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;fa(7)}function Vn(a,b,c){a=a|0;b=b|0;c=c|0;fa(8)}function Wn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;fa(9)}function Xn(){fa(10)}function Yn(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;fa(11);return 0}function Zn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fa(12);return 0}function _n(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;fa(13)}function $n(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;fa(14)}function ao(a,b){a=a|0;b=b|0;fa(15);return 0}function bo(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fa(16);return 0}function co(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fa(17)}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nvar ec=[Nn,gf,mf,xd,qf,Ue,Ze,Ld,bf,je,ke,Yf,bg,Fj,Kj,pk,rk,uk,ak,fk,hk,kk,wm,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn,Nn];var fc=[On,eg,gg,ig,kg,mg,og,qg,sg,ug,wg,yg,Dg,Fg,Hg,Jg,Lg,Ng,Pg,Rg,Tg,Vg,Xg,kh,mh,yh,Ah,Jh,Kh,Lh,Mh,Nh,Wh,Xh,Yh,Zh,_h,wj,Cj,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On,On];var gc=[Pn,Dm,Cm,Bm];var hc=[Qn,td,ud,Ad,Bd,Hd,Id,Od,Pd,$d,_d,ee,de,ge,pe,oe,Se,Re,ef,df,tf,sf,vf,uf,yf,xf,Af,zf,Df,Cf,Ff,Ef,If,Hf,Kf,Jf,Qf,Pf,Oe,Rf,Of,Sf,Uf,Tf,Zj,_f,Zf,dg,cg,Cg,Bg,eh,dh,th,sh,Hh,Gh,Uh,Th,ei,di,hi,gi,li,ki,wi,vi,Hi,Gi,Si,Ri,bj,aj,lj,kj,sj,rj,yj,xj,Ej,Dj,Jj,Ij,Sj,Rj,nk,mk,Nj,Ek,jl,il,ll,kl,Vf,Yj,$j,wk,Mk,Xk,gl,hl,om,nm,qm,tm,rm,sm,um,vm,Rm,Qm,Mc,sd,_j,Tl,dj,Im,_l,Zl,Yl,Xl,Wl,Vl,ve,Ge,Qn,Qn,Qn];var ic=[Rn,vd,Cd,Jd,Qd,Te,ff,oi,pi,qi,ri,ti,ui,zi,Ai,Bi,Ci,Ei,Fi,Ki,Li,Mi,Ni,Pi,Qi,Vi,Wi,Xi,Yi,_i,$i,Hj,Mj,ql,sl,ul,rl,tl,vl,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn,Rn];var jc=[Sn,Oh,$h,Sn];var kc=[Tn,wd,lf,nf,of,kf,Dd,Ed,Kd,Ye,_e,$e,Xe,Rd,Sd,ae,fe,Mf,Ih,wl,yl,Al,Gl,Il,Cl,El,Vh,xl,zl,Bl,Hl,Jl,Dl,Fl,mi,ni,si,xi,yi,Di,Ii,Ji,Oi,Ti,Ui,Zi,Ik,Jk,Lk,ml,ol,nl,pl,Ak,Bk,Dk,Sk,Tk,Wk,bl,cl,fl,pm,Sm];var lc=[Un,tj,zj,Un];var mc=[Vn,ie,Nf,Vn];var nc=[Wn,nh,qh,Bh,Dh,Wn,Wn,Wn];var oc=[Xn];var pc=[Yn,Fk,Gk,xk,yk,Nk,Pk,Yk,_k,Yn,Yn,Yn,Yn,Yn,Yn,Yn];var qc=[Zn,tk,bk,ck,dk,jk,Zn,Zn];var rc=[_n,fi,ii,cj,gj,mj,oj,_n];var sc=[$n,hf,Ve,fh,gh,lh,rh,uh,vh,zh,Eh,Gj,Lj,Gm,Fm,Em];var tc=[ao,pf,yd,Fd,rf,af,Md,Td,cf,ok,qk,sk,ek,gk,ik,ao];var uc=[bo,Wf,$f,vk,Hk,Kk,lk,zk,Ck,Rk,Uk,al,dl,bo,bo,bo];var vc=[co,jf,We,Xf,ag,xm,ym,zm];return{_i64Subtract:dn,_free:Im,_main:Wc,_realloc:Jm,_i64Add:en,_memmove:gn,_strlen:hn,_memset:cn,_malloc:Hm,_memcpy:fn,_llvm_ctlz_i32:jn,_bitshift64Shl:kn,__GLOBAL__I_a:ld,__GLOBAL__I_a18:Vd,runPostSets:bn,stackAlloc:wc,stackSave:xc,stackRestore:yc,setThrew:zc,setTempRet0:Cc,setTempRet1:Dc,setTempRet2:Ec,setTempRet3:Fc,setTempRet4:Gc,setTempRet5:Hc,setTempRet6:Ic,setTempRet7:Jc,setTempRet8:Kc,setTempRet9:Lc,dynCall_iiii:vn,dynCall_viiiiiii:wn,dynCall_viiiii:xn,dynCall_vi:yn,dynCall_vii:zn,dynCall_viiiiiiiii:An,dynCall_ii:Bn,dynCall_viiiiiid:Cn,dynCall_viii:Dn,dynCall_viiiiid:En,dynCall_v:Fn,dynCall_iiiiiiiii:Gn,dynCall_iiiii:Hn,dynCall_viiiiiiii:In,dynCall_viiiiii:Jn,dynCall_iii:Kn,dynCall_iiiiii:Ln,dynCall_viiii:Mn}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"invoke_iiii\": invoke_iiii, \"invoke_viiiiiii\": invoke_viiiiiii, \"invoke_viiiii\": invoke_viiiii, \"invoke_vi\": invoke_vi, \"invoke_vii\": invoke_vii, \"invoke_viiiiiiiii\": invoke_viiiiiiiii, \"invoke_ii\": invoke_ii, \"invoke_viiiiiid\": invoke_viiiiiid, \"invoke_viii\": invoke_viii, \"invoke_viiiiid\": invoke_viiiiid, \"invoke_v\": invoke_v, \"invoke_iiiiiiiii\": invoke_iiiiiiiii, \"invoke_iiiii\": invoke_iiiii, \"invoke_viiiiiiii\": invoke_viiiiiiii, \"invoke_viiiiii\": invoke_viiiiii, \"invoke_iii\": invoke_iii, \"invoke_iiiiii\": invoke_iiiiii, \"invoke_viiii\": invoke_viiii, \"_fabs\": _fabs, \"_pthread_cond_wait\": _pthread_cond_wait, \"_llvm_lifetime_start\": _llvm_lifetime_start, \"_sprintf\": _sprintf, \"_send\": _send, \"_strtoll_l\": _strtoll_l, \"_vsscanf\": _vsscanf, \"___ctype_b_loc\": ___ctype_b_loc, \"__ZSt9terminatev\": __ZSt9terminatev, \"_fmod\": _fmod, \"___cxa_guard_acquire\": ___cxa_guard_acquire, \"_isspace\": _isspace, \"__reallyNegative\": __reallyNegative, \"___cxa_is_number_type\": ___cxa_is_number_type, \"_ungetc\": _ungetc, \"_fread\": _fread, \"__getFloat\": __getFloat, \"___cxa_allocate_exception\": ___cxa_allocate_exception, \"__ZSt18uncaught_exceptionv\": __ZSt18uncaught_exceptionv, \"_floor\": _floor, \"_isxdigit_l\": _isxdigit_l, \"_strtoll\": _strtoll, \"_fflush\": _fflush, \"___cxa_guard_release\": ___cxa_guard_release, \"__addDays\": __addDays, \"_pwrite\": _pwrite, \"_strerror_r\": _strerror_r, \"_strftime_l\": _strftime_l, \"_pthread_mutex_lock\": _pthread_mutex_lock, \"_sscanf\": _sscanf, \"_sbrk\": _sbrk, \"_uselocale\": _uselocale, \"_catgets\": _catgets, \"_newlocale\": _newlocale, \"_snprintf\": _snprintf, \"___cxa_begin_catch\": ___cxa_begin_catch, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"_asprintf\": _asprintf, \"__scanString\": __scanString, \"___resumeException\": ___resumeException, \"___cxa_find_matching_catch\": ___cxa_find_matching_catch, \"__exit\": __exit, \"_strtoull\": _strtoull, \"_strftime\": _strftime, \"_strtoull_l\": _strtoull_l, \"_freelocale\": _freelocale, \"__arraySum\": __arraySum, \"__formatString\": __formatString, \"___ctype_tolower_loc\": ___ctype_tolower_loc, \"_isdigit_l\": _isdigit_l, \"_fileno\": _fileno, \"_pthread_mutex_unlock\": _pthread_mutex_unlock, \"_pread\": _pread, \"_isxdigit\": _isxdigit, \"___ctype_toupper_loc\": ___ctype_toupper_loc, \"_log\": _log, \"_vasprintf\": _vasprintf, \"_write\": _write, \"__isLeapYear\": __isLeapYear, \"___errno_location\": ___errno_location, \"_recv\": _recv, \"_vsnprintf\": _vsnprintf, \"__ZNSt9exceptionD2Ev\": __ZNSt9exceptionD2Ev, \"_copysign\": _copysign, \"_fgetc\": _fgetc, \"_mkport\": _mkport, \"___cxa_does_inherit\": ___cxa_does_inherit, \"_sysconf\": _sysconf, \"_pthread_cond_broadcast\": _pthread_cond_broadcast, \"__parseInt64\": __parseInt64, \"_abort\": _abort, \"_catclose\": _catclose, \"_fwrite\": _fwrite, \"___cxa_throw\": ___cxa_throw, \"_isdigit\": _isdigit, \"_strerror\": _strerror, \"_llvm_lifetime_end\": _llvm_lifetime_end, \"_atexit\": _atexit, \"_catopen\": _catopen, \"_exit\": _exit, \"_time\": _time, \"_read\": _read, \"___setErrNo\": ___setErrNo, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"cttz_i8\": cttz_i8, \"ctlz_i8\": ctlz_i8, \"NaN\": NaN, \"Infinity\": Infinity, \"__ZTISt9exception\": __ZTISt9exception, \"___dso_handle\": ___dso_handle, \"_stderr\": _stderr, \"_stdin\": _stdin, \"_stdout\": _stdout }, buffer);\nvar _i64Subtract = Module[\"_i64Subtract\"] = asm[\"_i64Subtract\"];\nvar _free = Module[\"_free\"] = asm[\"_free\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _realloc = Module[\"_realloc\"] = asm[\"_realloc\"];\nvar _i64Add = Module[\"_i64Add\"] = asm[\"_i64Add\"];\nvar _memmove = Module[\"_memmove\"] = asm[\"_memmove\"];\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar _malloc = Module[\"_malloc\"] = asm[\"_malloc\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _llvm_ctlz_i32 = Module[\"_llvm_ctlz_i32\"] = asm[\"_llvm_ctlz_i32\"];\nvar _bitshift64Shl = Module[\"_bitshift64Shl\"] = asm[\"_bitshift64Shl\"];\nvar __GLOBAL__I_a = Module[\"__GLOBAL__I_a\"] = asm[\"__GLOBAL__I_a\"];\nvar __GLOBAL__I_a18 = Module[\"__GLOBAL__I_a18\"] = asm[\"__GLOBAL__I_a18\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\nvar dynCall_iiii = Module[\"dynCall_iiii\"] = asm[\"dynCall_iiii\"];\nvar dynCall_viiiiiii = Module[\"dynCall_viiiiiii\"] = asm[\"dynCall_viiiiiii\"];\nvar dynCall_viiiii = Module[\"dynCall_viiiii\"] = asm[\"dynCall_viiiii\"];\nvar dynCall_vi = Module[\"dynCall_vi\"] = asm[\"dynCall_vi\"];\nvar dynCall_vii = Module[\"dynCall_vii\"] = asm[\"dynCall_vii\"];\nvar dynCall_viiiiiiiii = Module[\"dynCall_viiiiiiiii\"] = asm[\"dynCall_viiiiiiiii\"];\nvar dynCall_ii = Module[\"dynCall_ii\"] = asm[\"dynCall_ii\"];\nvar dynCall_viiiiiid = Module[\"dynCall_viiiiiid\"] = asm[\"dynCall_viiiiiid\"];\nvar dynCall_viii = Module[\"dynCall_viii\"] = asm[\"dynCall_viii\"];\nvar dynCall_viiiiid = Module[\"dynCall_viiiiid\"] = asm[\"dynCall_viiiiid\"];\nvar dynCall_v = Module[\"dynCall_v\"] = asm[\"dynCall_v\"];\nvar dynCall_iiiiiiiii = Module[\"dynCall_iiiiiiiii\"] = asm[\"dynCall_iiiiiiiii\"];\nvar dynCall_iiiii = Module[\"dynCall_iiiii\"] = asm[\"dynCall_iiiii\"];\nvar dynCall_viiiiiiii = Module[\"dynCall_viiiiiiii\"] = asm[\"dynCall_viiiiiiii\"];\nvar dynCall_viiiiii = Module[\"dynCall_viiiiii\"] = asm[\"dynCall_viiiiii\"];\nvar dynCall_iii = Module[\"dynCall_iii\"] = asm[\"dynCall_iii\"];\nvar dynCall_iiiiii = Module[\"dynCall_iiiiii\"] = asm[\"dynCall_iiiiii\"];\nvar dynCall_viiii = Module[\"dynCall_viiii\"] = asm[\"dynCall_viiii\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// TODO: strip out parts of this we do not need\n\n//======= begin closure i64 code =======\n\n// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\n * implementation is derived from LongLib in GWT.\n *\n */\n\nvar i64Math = (function() { // Emscripten wrapper\n  var goog = { math: {} };\n\n\n  /**\n   * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\n   * values as *signed* integers.  See the from* functions below for more\n   * convenient ways of constructing Longs.\n   *\n   * The internal representation of a long is the two given signed, 32-bit values.\n   * We use 32-bit pieces because these are the size of integers on which\n   * Javascript performs bit-operations.  For operations like addition and\n   * multiplication, we split each number into 16-bit pieces, which can easily be\n   * multiplied within Javascript's floating-point representation without overflow\n   * or change in sign.\n   *\n   * In the algorithms below, we frequently reduce the negative case to the\n   * positive case by negating the input(s) and then post-processing the result.\n   * Note that we must ALWAYS check specially whether those values are MIN_VALUE\n   * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n   * a positive number, it overflows back into a negative).  Not handling this\n   * case would often result in infinite recursion.\n   *\n   * @param {number} low  The low (signed) 32 bits of the long.\n   * @param {number} high  The high (signed) 32 bits of the long.\n   * @constructor\n   */\n  goog.math.Long = function(low, high) {\n    /**\n     * @type {number}\n     * @private\n     */\n    this.low_ = low | 0;  // force into 32 signed bits.\n\n    /**\n     * @type {number}\n     * @private\n     */\n    this.high_ = high | 0;  // force into 32 signed bits.\n  };\n\n\n  // NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\n  // from* methods on which they depend.\n\n\n  /**\n   * A cache of the Long representations of small integer values.\n   * @type {!Object}\n   * @private\n   */\n  goog.math.Long.IntCache_ = {};\n\n\n  /**\n   * Returns a Long representing the given (32-bit) integer value.\n   * @param {number} value The 32-bit integer in question.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromInt = function(value) {\n    if (-128 <= value && value < 128) {\n      var cachedObj = goog.math.Long.IntCache_[value];\n      if (cachedObj) {\n        return cachedObj;\n      }\n    }\n\n    var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\n    if (-128 <= value && value < 128) {\n      goog.math.Long.IntCache_[value] = obj;\n    }\n    return obj;\n  };\n\n\n  /**\n   * Returns a Long representing the given value, provided that it is a finite\n   * number.  Otherwise, zero is returned.\n   * @param {number} value The number in question.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromNumber = function(value) {\n    if (isNaN(value) || !isFinite(value)) {\n      return goog.math.Long.ZERO;\n    } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\n      return goog.math.Long.MIN_VALUE;\n    } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\n      return goog.math.Long.MAX_VALUE;\n    } else if (value < 0) {\n      return goog.math.Long.fromNumber(-value).negate();\n    } else {\n      return new goog.math.Long(\n          (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\n          (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\n    }\n  };\n\n\n  /**\n   * Returns a Long representing the 64-bit integer that comes by concatenating\n   * the given high and low bits.  Each is assumed to use 32 bits.\n   * @param {number} lowBits The low 32-bits.\n   * @param {number} highBits The high 32-bits.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromBits = function(lowBits, highBits) {\n    return new goog.math.Long(lowBits, highBits);\n  };\n\n\n  /**\n   * Returns a Long representation of the given string, written using the given\n   * radix.\n   * @param {string} str The textual representation of the Long.\n   * @param {number=} opt_radix The radix in which the text is written.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromString = function(str, opt_radix) {\n    if (str.length == 0) {\n      throw Error('number format error: empty string');\n    }\n\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw Error('radix out of range: ' + radix);\n    }\n\n    if (str.charAt(0) == '-') {\n      return goog.math.Long.fromString(str.substring(1), radix).negate();\n    } else if (str.indexOf('-') >= 0) {\n      throw Error('number format error: interior \"-\" character: ' + str);\n    }\n\n    // Do several (8) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\n\n    var result = goog.math.Long.ZERO;\n    for (var i = 0; i < str.length; i += 8) {\n      var size = Math.min(8, str.length - i);\n      var value = parseInt(str.substring(i, i + size), radix);\n      if (size < 8) {\n        var power = goog.math.Long.fromNumber(Math.pow(radix, size));\n        result = result.multiply(power).add(goog.math.Long.fromNumber(value));\n      } else {\n        result = result.multiply(radixToPower);\n        result = result.add(goog.math.Long.fromNumber(value));\n      }\n    }\n    return result;\n  };\n\n\n  // NOTE: the compiler should inline these constant values below and then remove\n  // these variables, so there should be no runtime penalty for these.\n\n\n  /**\n   * Number used repeated below in calculations.  This must appear before the\n   * first call to any from* function below.\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_32_DBL_ =\n      goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_31_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ / 2;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_48_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_64_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_63_DBL_ =\n      goog.math.Long.TWO_PWR_64_DBL_ / 2;\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.ZERO = goog.math.Long.fromInt(0);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.ONE = goog.math.Long.fromInt(1);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.MAX_VALUE =\n      goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\n\n\n  /**\n   * @type {!goog.math.Long}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\n\n\n  /** @return {number} The value, assuming it is a 32-bit integer. */\n  goog.math.Long.prototype.toInt = function() {\n    return this.low_;\n  };\n\n\n  /** @return {number} The closest floating-point representation to this value. */\n  goog.math.Long.prototype.toNumber = function() {\n    return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\n           this.getLowBitsUnsigned();\n  };\n\n\n  /**\n   * @param {number=} opt_radix The radix in which the text should be written.\n   * @return {string} The textual representation of this value.\n   */\n  goog.math.Long.prototype.toString = function(opt_radix) {\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw Error('radix out of range: ' + radix);\n    }\n\n    if (this.isZero()) {\n      return '0';\n    }\n\n    if (this.isNegative()) {\n      if (this.equals(goog.math.Long.MIN_VALUE)) {\n        // We need to change the Long value before it can be negated, so we remove\n        // the bottom-most digit in this base and then recurse to do the rest.\n        var radixLong = goog.math.Long.fromNumber(radix);\n        var div = this.div(radixLong);\n        var rem = div.multiply(radixLong).subtract(this);\n        return div.toString(radix) + rem.toInt().toString(radix);\n      } else {\n        return '-' + this.negate().toString(radix);\n      }\n    }\n\n    // Do several (6) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\n\n    var rem = this;\n    var result = '';\n    while (true) {\n      var remDiv = rem.div(radixToPower);\n      var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\n      var digits = intval.toString(radix);\n\n      rem = remDiv;\n      if (rem.isZero()) {\n        return digits + result;\n      } else {\n        while (digits.length < 6) {\n          digits = '0' + digits;\n        }\n        result = '' + digits + result;\n      }\n    }\n  };\n\n\n  /** @return {number} The high 32-bits as a signed value. */\n  goog.math.Long.prototype.getHighBits = function() {\n    return this.high_;\n  };\n\n\n  /** @return {number} The low 32-bits as a signed value. */\n  goog.math.Long.prototype.getLowBits = function() {\n    return this.low_;\n  };\n\n\n  /** @return {number} The low 32-bits as an unsigned value. */\n  goog.math.Long.prototype.getLowBitsUnsigned = function() {\n    return (this.low_ >= 0) ?\n        this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\n  };\n\n\n  /**\n   * @return {number} Returns the number of bits needed to represent the absolute\n   *     value of this Long.\n   */\n  goog.math.Long.prototype.getNumBitsAbs = function() {\n    if (this.isNegative()) {\n      if (this.equals(goog.math.Long.MIN_VALUE)) {\n        return 64;\n      } else {\n        return this.negate().getNumBitsAbs();\n      }\n    } else {\n      var val = this.high_ != 0 ? this.high_ : this.low_;\n      for (var bit = 31; bit > 0; bit--) {\n        if ((val & (1 << bit)) != 0) {\n          break;\n        }\n      }\n      return this.high_ != 0 ? bit + 33 : bit + 1;\n    }\n  };\n\n\n  /** @return {boolean} Whether this value is zero. */\n  goog.math.Long.prototype.isZero = function() {\n    return this.high_ == 0 && this.low_ == 0;\n  };\n\n\n  /** @return {boolean} Whether this value is negative. */\n  goog.math.Long.prototype.isNegative = function() {\n    return this.high_ < 0;\n  };\n\n\n  /** @return {boolean} Whether this value is odd. */\n  goog.math.Long.prototype.isOdd = function() {\n    return (this.low_ & 1) == 1;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long equals the other.\n   */\n  goog.math.Long.prototype.equals = function(other) {\n    return (this.high_ == other.high_) && (this.low_ == other.low_);\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long does not equal the other.\n   */\n  goog.math.Long.prototype.notEquals = function(other) {\n    return (this.high_ != other.high_) || (this.low_ != other.low_);\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than the other.\n   */\n  goog.math.Long.prototype.lessThan = function(other) {\n    return this.compare(other) < 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than or equal to the other.\n   */\n  goog.math.Long.prototype.lessThanOrEqual = function(other) {\n    return this.compare(other) <= 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than the other.\n   */\n  goog.math.Long.prototype.greaterThan = function(other) {\n    return this.compare(other) > 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than or equal to the other.\n   */\n  goog.math.Long.prototype.greaterThanOrEqual = function(other) {\n    return this.compare(other) >= 0;\n  };\n\n\n  /**\n   * Compares this Long with the given one.\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {number} 0 if they are the same, 1 if the this is greater, and -1\n   *     if the given one is greater.\n   */\n  goog.math.Long.prototype.compare = function(other) {\n    if (this.equals(other)) {\n      return 0;\n    }\n\n    var thisNeg = this.isNegative();\n    var otherNeg = other.isNegative();\n    if (thisNeg && !otherNeg) {\n      return -1;\n    }\n    if (!thisNeg && otherNeg) {\n      return 1;\n    }\n\n    // at this point, the signs are the same, so subtraction will not overflow\n    if (this.subtract(other).isNegative()) {\n      return -1;\n    } else {\n      return 1;\n    }\n  };\n\n\n  /** @return {!goog.math.Long} The negation of this value. */\n  goog.math.Long.prototype.negate = function() {\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.MIN_VALUE;\n    } else {\n      return this.not().add(goog.math.Long.ONE);\n    }\n  };\n\n\n  /**\n   * Returns the sum of this and the given Long.\n   * @param {goog.math.Long} other Long to add to this one.\n   * @return {!goog.math.Long} The sum of this and the given Long.\n   */\n  goog.math.Long.prototype.add = function(other) {\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 + b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 + b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 + b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 + b48;\n    c48 &= 0xFFFF;\n    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  };\n\n\n  /**\n   * Returns the difference of this and the given Long.\n   * @param {goog.math.Long} other Long to subtract from this.\n   * @return {!goog.math.Long} The difference of this and the given Long.\n   */\n  goog.math.Long.prototype.subtract = function(other) {\n    return this.add(other.negate());\n  };\n\n\n  /**\n   * Returns the product of this and the given long.\n   * @param {goog.math.Long} other Long to multiply with this.\n   * @return {!goog.math.Long} The product of this and the other.\n   */\n  goog.math.Long.prototype.multiply = function(other) {\n    if (this.isZero()) {\n      return goog.math.Long.ZERO;\n    } else if (other.isZero()) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n    }\n\n    if (this.isNegative()) {\n      if (other.isNegative()) {\n        return this.negate().multiply(other.negate());\n      } else {\n        return this.negate().multiply(other).negate();\n      }\n    } else if (other.isNegative()) {\n      return this.multiply(other.negate()).negate();\n    }\n\n    // If both longs are small, use float multiplication\n    if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\n        other.lessThan(goog.math.Long.TWO_PWR_24_)) {\n      return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\n    }\n\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n    // We can skip products that would overflow.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 * b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 * b00;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c16 += a00 * b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 * b00;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a16 * b16;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a00 * b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n    c48 &= 0xFFFF;\n    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  };\n\n\n  /**\n   * Returns this Long divided by the given one.\n   * @param {goog.math.Long} other Long by which to divide.\n   * @return {!goog.math.Long} This Long divided by the given one.\n   */\n  goog.math.Long.prototype.div = function(other) {\n    if (other.isZero()) {\n      throw Error('division by zero');\n    } else if (this.isZero()) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      if (other.equals(goog.math.Long.ONE) ||\n          other.equals(goog.math.Long.NEG_ONE)) {\n        return goog.math.Long.MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\n      } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n        return goog.math.Long.ONE;\n      } else {\n        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n        var halfThis = this.shiftRight(1);\n        var approx = halfThis.div(other).shiftLeft(1);\n        if (approx.equals(goog.math.Long.ZERO)) {\n          return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\n        } else {\n          var rem = this.subtract(other.multiply(approx));\n          var result = approx.add(rem.div(other));\n          return result;\n        }\n      }\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.isNegative()) {\n      if (other.isNegative()) {\n        return this.negate().div(other.negate());\n      } else {\n        return this.negate().div(other).negate();\n      }\n    } else if (other.isNegative()) {\n      return this.div(other.negate()).negate();\n    }\n\n    // Repeat the following until the remainder is less than other:  find a\n    // floating-point that approximates remainder / other *from below*, add this\n    // into the result, and subtract it from the remainder.  It is critical that\n    // the approximate value is less than or equal to the real value so that the\n    // remainder never becomes negative.\n    var res = goog.math.Long.ZERO;\n    var rem = this;\n    while (rem.greaterThanOrEqual(other)) {\n      // Approximate the result of division. This may be a little greater or\n      // smaller than the actual value.\n      var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\n\n      // We will tweak the approximate result by changing it in the 48-th digit or\n      // the smallest non-fractional digit, whichever is larger.\n      var log2 = Math.ceil(Math.log(approx) / Math.LN2);\n      var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\n\n      // Decrease the approximation until it is smaller than the remainder.  Note\n      // that if it is too large, the product overflows and is negative.\n      var approxRes = goog.math.Long.fromNumber(approx);\n      var approxRem = approxRes.multiply(other);\n      while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\n        approx -= delta;\n        approxRes = goog.math.Long.fromNumber(approx);\n        approxRem = approxRes.multiply(other);\n      }\n\n      // We know the answer can't be zero... and actually, zero would cause\n      // infinite recursion since we would make no progress.\n      if (approxRes.isZero()) {\n        approxRes = goog.math.Long.ONE;\n      }\n\n      res = res.add(approxRes);\n      rem = rem.subtract(approxRem);\n    }\n    return res;\n  };\n\n\n  /**\n   * Returns this Long modulo the given one.\n   * @param {goog.math.Long} other Long by which to mod.\n   * @return {!goog.math.Long} This Long modulo the given one.\n   */\n  goog.math.Long.prototype.modulo = function(other) {\n    return this.subtract(this.div(other).multiply(other));\n  };\n\n\n  /** @return {!goog.math.Long} The bitwise-NOT of this value. */\n  goog.math.Long.prototype.not = function() {\n    return goog.math.Long.fromBits(~this.low_, ~this.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-AND of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to AND.\n   * @return {!goog.math.Long} The bitwise-AND of this and the other.\n   */\n  goog.math.Long.prototype.and = function(other) {\n    return goog.math.Long.fromBits(this.low_ & other.low_,\n                                   this.high_ & other.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-OR of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to OR.\n   * @return {!goog.math.Long} The bitwise-OR of this and the other.\n   */\n  goog.math.Long.prototype.or = function(other) {\n    return goog.math.Long.fromBits(this.low_ | other.low_,\n                                   this.high_ | other.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-XOR of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to XOR.\n   * @return {!goog.math.Long} The bitwise-XOR of this and the other.\n   */\n  goog.math.Long.prototype.xor = function(other) {\n    return goog.math.Long.fromBits(this.low_ ^ other.low_,\n                                   this.high_ ^ other.high_);\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the left by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the left by the given amount.\n   */\n  goog.math.Long.prototype.shiftLeft = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var low = this.low_;\n      if (numBits < 32) {\n        var high = this.high_;\n        return goog.math.Long.fromBits(\n            low << numBits,\n            (high << numBits) | (low >>> (32 - numBits)));\n      } else {\n        return goog.math.Long.fromBits(0, low << (numBits - 32));\n      }\n    }\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the right by the given amount.\n   */\n  goog.math.Long.prototype.shiftRight = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return goog.math.Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)),\n            high >> numBits);\n      } else {\n        return goog.math.Long.fromBits(\n            high >> (numBits - 32),\n            high >= 0 ? 0 : -1);\n      }\n    }\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount, with\n   * the new top bits matching the current sign bit.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the right by the given amount, with\n   *     zeros placed into the new leading bits.\n   */\n  goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return goog.math.Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)),\n            high >>> numBits);\n      } else if (numBits == 32) {\n        return goog.math.Long.fromBits(high, 0);\n      } else {\n        return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\n      }\n    }\n  };\n\n  //======= begin jsbn =======\n\n  var navigator = { appName: 'Modern Browser' }; // polyfill a little\n\n  // Copyright (c) 2005  Tom Wu\n  // All Rights Reserved.\n  // http://www-cs-students.stanford.edu/~tjw/jsbn/\n\n  /*\n   * Copyright (c) 2003-2005  Tom Wu\n   * All Rights Reserved.\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining\n   * a copy of this software and associated documentation files (the\n   * \"Software\"), to deal in the Software without restriction, including\n   * without limitation the rights to use, copy, modify, merge, publish,\n   * distribute, sublicense, and/or sell copies of the Software, and to\n   * permit persons to whom the Software is furnished to do so, subject to\n   * the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be\n   * included in all copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND, \n   * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY \n   * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  \n   *\n   * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n   * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n   * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n   * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n   * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n   *\n   * In addition, the following condition applies:\n   *\n   * All redistributions must retain an intact copy of this copyright notice\n   * and disclaimer.\n   */\n\n  // Basic JavaScript BN library - subset useful for RSA encryption.\n\n  // Bits per digit\n  var dbits;\n\n  // JavaScript engine analysis\n  var canary = 0xdeadbeefcafe;\n  var j_lm = ((canary&0xffffff)==0xefcafe);\n\n  // (public) Constructor\n  function BigInteger(a,b,c) {\n    if(a != null)\n      if(\"number\" == typeof a) this.fromNumber(a,b,c);\n      else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n      else this.fromString(a,b);\n  }\n\n  // return new, unset BigInteger\n  function nbi() { return new BigInteger(null); }\n\n  // am: Compute w_j += (x*this_i), propagate carries,\n  // c is initial carry, returns final carry.\n  // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n  // We need to select the fastest one that works in this environment.\n\n  // am1: use a single mult and divide to get the high bits,\n  // max digit bits should be 26 because\n  // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n  function am1(i,x,w,j,c,n) {\n    while(--n >= 0) {\n      var v = x*this[i++]+w[j]+c;\n      c = Math.floor(v/0x4000000);\n      w[j++] = v&0x3ffffff;\n    }\n    return c;\n  }\n  // am2 avoids a big mult-and-extract completely.\n  // Max digit bits should be <= 30 because we do bitwise ops\n  // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n  function am2(i,x,w,j,c,n) {\n    var xl = x&0x7fff, xh = x>>15;\n    while(--n >= 0) {\n      var l = this[i]&0x7fff;\n      var h = this[i++]>>15;\n      var m = xh*l+h*xl;\n      l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n      c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n      w[j++] = l&0x3fffffff;\n    }\n    return c;\n  }\n  // Alternately, set max digit bits to 28 since some\n  // browsers slow down when dealing with 32-bit numbers.\n  function am3(i,x,w,j,c,n) {\n    var xl = x&0x3fff, xh = x>>14;\n    while(--n >= 0) {\n      var l = this[i]&0x3fff;\n      var h = this[i++]>>14;\n      var m = xh*l+h*xl;\n      l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n      c = (l>>28)+(m>>14)+xh*h;\n      w[j++] = l&0xfffffff;\n    }\n    return c;\n  }\n  if(j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n    BigInteger.prototype.am = am2;\n    dbits = 30;\n  }\n  else if(j_lm && (navigator.appName != \"Netscape\")) {\n    BigInteger.prototype.am = am1;\n    dbits = 26;\n  }\n  else { // Mozilla/Netscape seems to prefer am3\n    BigInteger.prototype.am = am3;\n    dbits = 28;\n  }\n\n  BigInteger.prototype.DB = dbits;\n  BigInteger.prototype.DM = ((1<<dbits)-1);\n  BigInteger.prototype.DV = (1<<dbits);\n\n  var BI_FP = 52;\n  BigInteger.prototype.FV = Math.pow(2,BI_FP);\n  BigInteger.prototype.F1 = BI_FP-dbits;\n  BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n  // Digit conversions\n  var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n  var BI_RC = new Array();\n  var rr,vv;\n  rr = \"0\".charCodeAt(0);\n  for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n  rr = \"a\".charCodeAt(0);\n  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n  rr = \"A\".charCodeAt(0);\n  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n  function int2char(n) { return BI_RM.charAt(n); }\n  function intAt(s,i) {\n    var c = BI_RC[s.charCodeAt(i)];\n    return (c==null)?-1:c;\n  }\n\n  // (protected) copy this to r\n  function bnpCopyTo(r) {\n    for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n    r.t = this.t;\n    r.s = this.s;\n  }\n\n  // (protected) set from integer value x, -DV <= x < DV\n  function bnpFromInt(x) {\n    this.t = 1;\n    this.s = (x<0)?-1:0;\n    if(x > 0) this[0] = x;\n    else if(x < -1) this[0] = x+DV;\n    else this.t = 0;\n  }\n\n  // return bigint initialized to value\n  function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n  // (protected) set from string and radix\n  function bnpFromString(s,b) {\n    var k;\n    if(b == 16) k = 4;\n    else if(b == 8) k = 3;\n    else if(b == 256) k = 8; // byte array\n    else if(b == 2) k = 1;\n    else if(b == 32) k = 5;\n    else if(b == 4) k = 2;\n    else { this.fromRadix(s,b); return; }\n    this.t = 0;\n    this.s = 0;\n    var i = s.length, mi = false, sh = 0;\n    while(--i >= 0) {\n      var x = (k==8)?s[i]&0xff:intAt(s,i);\n      if(x < 0) {\n        if(s.charAt(i) == \"-\") mi = true;\n        continue;\n      }\n      mi = false;\n      if(sh == 0)\n        this[this.t++] = x;\n      else if(sh+k > this.DB) {\n        this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n        this[this.t++] = (x>>(this.DB-sh));\n      }\n      else\n        this[this.t-1] |= x<<sh;\n      sh += k;\n      if(sh >= this.DB) sh -= this.DB;\n    }\n    if(k == 8 && (s[0]&0x80) != 0) {\n      this.s = -1;\n      if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n    }\n    this.clamp();\n    if(mi) BigInteger.ZERO.subTo(this,this);\n  }\n\n  // (protected) clamp off excess high words\n  function bnpClamp() {\n    var c = this.s&this.DM;\n    while(this.t > 0 && this[this.t-1] == c) --this.t;\n  }\n\n  // (public) return string representation in given radix\n  function bnToString(b) {\n    if(this.s < 0) return \"-\"+this.negate().toString(b);\n    var k;\n    if(b == 16) k = 4;\n    else if(b == 8) k = 3;\n    else if(b == 2) k = 1;\n    else if(b == 32) k = 5;\n    else if(b == 4) k = 2;\n    else return this.toRadix(b);\n    var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n    var p = this.DB-(i*this.DB)%k;\n    if(i-- > 0) {\n      if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n      while(i >= 0) {\n        if(p < k) {\n          d = (this[i]&((1<<p)-1))<<(k-p);\n          d |= this[--i]>>(p+=this.DB-k);\n        }\n        else {\n          d = (this[i]>>(p-=k))&km;\n          if(p <= 0) { p += this.DB; --i; }\n        }\n        if(d > 0) m = true;\n        if(m) r += int2char(d);\n      }\n    }\n    return m?r:\"0\";\n  }\n\n  // (public) -this\n  function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n  // (public) |this|\n  function bnAbs() { return (this.s<0)?this.negate():this; }\n\n  // (public) return + if this > a, - if this < a, 0 if equal\n  function bnCompareTo(a) {\n    var r = this.s-a.s;\n    if(r != 0) return r;\n    var i = this.t;\n    r = i-a.t;\n    if(r != 0) return (this.s<0)?-r:r;\n    while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n    return 0;\n  }\n\n  // returns bit length of the integer x\n  function nbits(x) {\n    var r = 1, t;\n    if((t=x>>>16) != 0) { x = t; r += 16; }\n    if((t=x>>8) != 0) { x = t; r += 8; }\n    if((t=x>>4) != 0) { x = t; r += 4; }\n    if((t=x>>2) != 0) { x = t; r += 2; }\n    if((t=x>>1) != 0) { x = t; r += 1; }\n    return r;\n  }\n\n  // (public) return the number of bits in \"this\"\n  function bnBitLength() {\n    if(this.t <= 0) return 0;\n    return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n  }\n\n  // (protected) r = this << n*DB\n  function bnpDLShiftTo(n,r) {\n    var i;\n    for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n    for(i = n-1; i >= 0; --i) r[i] = 0;\n    r.t = this.t+n;\n    r.s = this.s;\n  }\n\n  // (protected) r = this >> n*DB\n  function bnpDRShiftTo(n,r) {\n    for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n    r.t = Math.max(this.t-n,0);\n    r.s = this.s;\n  }\n\n  // (protected) r = this << n\n  function bnpLShiftTo(n,r) {\n    var bs = n%this.DB;\n    var cbs = this.DB-bs;\n    var bm = (1<<cbs)-1;\n    var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n    for(i = this.t-1; i >= 0; --i) {\n      r[i+ds+1] = (this[i]>>cbs)|c;\n      c = (this[i]&bm)<<bs;\n    }\n    for(i = ds-1; i >= 0; --i) r[i] = 0;\n    r[ds] = c;\n    r.t = this.t+ds+1;\n    r.s = this.s;\n    r.clamp();\n  }\n\n  // (protected) r = this >> n\n  function bnpRShiftTo(n,r) {\n    r.s = this.s;\n    var ds = Math.floor(n/this.DB);\n    if(ds >= this.t) { r.t = 0; return; }\n    var bs = n%this.DB;\n    var cbs = this.DB-bs;\n    var bm = (1<<bs)-1;\n    r[0] = this[ds]>>bs;\n    for(var i = ds+1; i < this.t; ++i) {\n      r[i-ds-1] |= (this[i]&bm)<<cbs;\n      r[i-ds] = this[i]>>bs;\n    }\n    if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n    r.t = this.t-ds;\n    r.clamp();\n  }\n\n  // (protected) r = this - a\n  function bnpSubTo(a,r) {\n    var i = 0, c = 0, m = Math.min(a.t,this.t);\n    while(i < m) {\n      c += this[i]-a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    if(a.t < this.t) {\n      c -= a.s;\n      while(i < this.t) {\n        c += this[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += this.s;\n    }\n    else {\n      c += this.s;\n      while(i < a.t) {\n        c -= a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c -= a.s;\n    }\n    r.s = (c<0)?-1:0;\n    if(c < -1) r[i++] = this.DV+c;\n    else if(c > 0) r[i++] = c;\n    r.t = i;\n    r.clamp();\n  }\n\n  // (protected) r = this * a, r != this,a (HAC 14.12)\n  // \"this\" should be the larger one if appropriate.\n  function bnpMultiplyTo(a,r) {\n    var x = this.abs(), y = a.abs();\n    var i = x.t;\n    r.t = i+y.t;\n    while(--i >= 0) r[i] = 0;\n    for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n    r.s = 0;\n    r.clamp();\n    if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n  }\n\n  // (protected) r = this^2, r != this (HAC 14.16)\n  function bnpSquareTo(r) {\n    var x = this.abs();\n    var i = r.t = 2*x.t;\n    while(--i >= 0) r[i] = 0;\n    for(i = 0; i < x.t-1; ++i) {\n      var c = x.am(i,x[i],r,2*i,0,1);\n      if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n        r[i+x.t] -= x.DV;\n        r[i+x.t+1] = 1;\n      }\n    }\n    if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n    r.s = 0;\n    r.clamp();\n  }\n\n  // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n  // r != q, this != m.  q or r may be null.\n  function bnpDivRemTo(m,q,r) {\n    var pm = m.abs();\n    if(pm.t <= 0) return;\n    var pt = this.abs();\n    if(pt.t < pm.t) {\n      if(q != null) q.fromInt(0);\n      if(r != null) this.copyTo(r);\n      return;\n    }\n    if(r == null) r = nbi();\n    var y = nbi(), ts = this.s, ms = m.s;\n    var nsh = this.DB-nbits(pm[pm.t-1]);\t// normalize modulus\n    if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n    else { pm.copyTo(y); pt.copyTo(r); }\n    var ys = y.t;\n    var y0 = y[ys-1];\n    if(y0 == 0) return;\n    var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n    var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n    var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n    y.dlShiftTo(j,t);\n    if(r.compareTo(t) >= 0) {\n      r[r.t++] = 1;\n      r.subTo(t,r);\n    }\n    BigInteger.ONE.dlShiftTo(ys,t);\n    t.subTo(y,y);\t// \"negative\" y so we can replace sub with am later\n    while(y.t < ys) y[y.t++] = 0;\n    while(--j >= 0) {\n      // Estimate quotient digit\n      var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n      if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {\t// Try it out\n        y.dlShiftTo(j,t);\n        r.subTo(t,r);\n        while(r[i] < --qd) r.subTo(t,r);\n      }\n    }\n    if(q != null) {\n      r.drShiftTo(ys,q);\n      if(ts != ms) BigInteger.ZERO.subTo(q,q);\n    }\n    r.t = ys;\n    r.clamp();\n    if(nsh > 0) r.rShiftTo(nsh,r);\t// Denormalize remainder\n    if(ts < 0) BigInteger.ZERO.subTo(r,r);\n  }\n\n  // (public) this mod a\n  function bnMod(a) {\n    var r = nbi();\n    this.abs().divRemTo(a,null,r);\n    if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n    return r;\n  }\n\n  // Modular reduction using \"classic\" algorithm\n  function Classic(m) { this.m = m; }\n  function cConvert(x) {\n    if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n    else return x;\n  }\n  function cRevert(x) { return x; }\n  function cReduce(x) { x.divRemTo(this.m,null,x); }\n  function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n  function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n  Classic.prototype.convert = cConvert;\n  Classic.prototype.revert = cRevert;\n  Classic.prototype.reduce = cReduce;\n  Classic.prototype.mulTo = cMulTo;\n  Classic.prototype.sqrTo = cSqrTo;\n\n  // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n  // justification:\n  //         xy == 1 (mod m)\n  //         xy =  1+km\n  //   xy(2-xy) = (1+km)(1-km)\n  // x[y(2-xy)] = 1-k^2m^2\n  // x[y(2-xy)] == 1 (mod m^2)\n  // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n  // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n  // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n  function bnpInvDigit() {\n    if(this.t < 1) return 0;\n    var x = this[0];\n    if((x&1) == 0) return 0;\n    var y = x&3;\t\t// y == 1/x mod 2^2\n    y = (y*(2-(x&0xf)*y))&0xf;\t// y == 1/x mod 2^4\n    y = (y*(2-(x&0xff)*y))&0xff;\t// y == 1/x mod 2^8\n    y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;\t// y == 1/x mod 2^16\n    // last step - calculate inverse mod DV directly;\n    // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n    y = (y*(2-x*y%this.DV))%this.DV;\t\t// y == 1/x mod 2^dbits\n    // we really want the negative inverse, and -DV < y < DV\n    return (y>0)?this.DV-y:-y;\n  }\n\n  // Montgomery reduction\n  function Montgomery(m) {\n    this.m = m;\n    this.mp = m.invDigit();\n    this.mpl = this.mp&0x7fff;\n    this.mph = this.mp>>15;\n    this.um = (1<<(m.DB-15))-1;\n    this.mt2 = 2*m.t;\n  }\n\n  // xR mod m\n  function montConvert(x) {\n    var r = nbi();\n    x.abs().dlShiftTo(this.m.t,r);\n    r.divRemTo(this.m,null,r);\n    if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n    return r;\n  }\n\n  // x/R mod m\n  function montRevert(x) {\n    var r = nbi();\n    x.copyTo(r);\n    this.reduce(r);\n    return r;\n  }\n\n  // x = x/R mod m (HAC 14.32)\n  function montReduce(x) {\n    while(x.t <= this.mt2)\t// pad x so am has enough room later\n      x[x.t++] = 0;\n    for(var i = 0; i < this.m.t; ++i) {\n      // faster way of calculating u0 = x[i]*mp mod DV\n      var j = x[i]&0x7fff;\n      var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n      // use am to combine the multiply-shift-add into one call\n      j = i+this.m.t;\n      x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n      // propagate carry\n      while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n    }\n    x.clamp();\n    x.drShiftTo(this.m.t,x);\n    if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n  }\n\n  // r = \"x^2/R mod m\"; x != r\n  function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n  // r = \"xy/R mod m\"; x,y != r\n  function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n  Montgomery.prototype.convert = montConvert;\n  Montgomery.prototype.revert = montRevert;\n  Montgomery.prototype.reduce = montReduce;\n  Montgomery.prototype.mulTo = montMulTo;\n  Montgomery.prototype.sqrTo = montSqrTo;\n\n  // (protected) true iff this is even\n  function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n  // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n  function bnpExp(e,z) {\n    if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n    var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n    g.copyTo(r);\n    while(--i >= 0) {\n      z.sqrTo(r,r2);\n      if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n      else { var t = r; r = r2; r2 = t; }\n    }\n    return z.revert(r);\n  }\n\n  // (public) this^e % m, 0 <= e < 2^32\n  function bnModPowInt(e,m) {\n    var z;\n    if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n    return this.exp(e,z);\n  }\n\n  // protected\n  BigInteger.prototype.copyTo = bnpCopyTo;\n  BigInteger.prototype.fromInt = bnpFromInt;\n  BigInteger.prototype.fromString = bnpFromString;\n  BigInteger.prototype.clamp = bnpClamp;\n  BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n  BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n  BigInteger.prototype.lShiftTo = bnpLShiftTo;\n  BigInteger.prototype.rShiftTo = bnpRShiftTo;\n  BigInteger.prototype.subTo = bnpSubTo;\n  BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n  BigInteger.prototype.squareTo = bnpSquareTo;\n  BigInteger.prototype.divRemTo = bnpDivRemTo;\n  BigInteger.prototype.invDigit = bnpInvDigit;\n  BigInteger.prototype.isEven = bnpIsEven;\n  BigInteger.prototype.exp = bnpExp;\n\n  // public\n  BigInteger.prototype.toString = bnToString;\n  BigInteger.prototype.negate = bnNegate;\n  BigInteger.prototype.abs = bnAbs;\n  BigInteger.prototype.compareTo = bnCompareTo;\n  BigInteger.prototype.bitLength = bnBitLength;\n  BigInteger.prototype.mod = bnMod;\n  BigInteger.prototype.modPowInt = bnModPowInt;\n\n  // \"constants\"\n  BigInteger.ZERO = nbv(0);\n  BigInteger.ONE = nbv(1);\n\n  // jsbn2 stuff\n\n  // (protected) convert from radix string\n  function bnpFromRadix(s,b) {\n    this.fromInt(0);\n    if(b == null) b = 10;\n    var cs = this.chunkSize(b);\n    var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n    for(var i = 0; i < s.length; ++i) {\n      var x = intAt(s,i);\n      if(x < 0) {\n        if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n        continue;\n      }\n      w = b*w+x;\n      if(++j >= cs) {\n        this.dMultiply(d);\n        this.dAddOffset(w,0);\n        j = 0;\n        w = 0;\n      }\n    }\n    if(j > 0) {\n      this.dMultiply(Math.pow(b,j));\n      this.dAddOffset(w,0);\n    }\n    if(mi) BigInteger.ZERO.subTo(this,this);\n  }\n\n  // (protected) return x s.t. r^x < DV\n  function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n  // (public) 0 if this == 0, 1 if this > 0\n  function bnSigNum() {\n    if(this.s < 0) return -1;\n    else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n    else return 1;\n  }\n\n  // (protected) this *= n, this >= 0, 1 < n < DV\n  function bnpDMultiply(n) {\n    this[this.t] = this.am(0,n-1,this,0,0,this.t);\n    ++this.t;\n    this.clamp();\n  }\n\n  // (protected) this += n << w words, this >= 0\n  function bnpDAddOffset(n,w) {\n    if(n == 0) return;\n    while(this.t <= w) this[this.t++] = 0;\n    this[w] += n;\n    while(this[w] >= this.DV) {\n      this[w] -= this.DV;\n      if(++w >= this.t) this[this.t++] = 0;\n      ++this[w];\n    }\n  }\n\n  // (protected) convert to radix string\n  function bnpToRadix(b) {\n    if(b == null) b = 10;\n    if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n    var cs = this.chunkSize(b);\n    var a = Math.pow(b,cs);\n    var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n    this.divRemTo(d,y,z);\n    while(y.signum() > 0) {\n      r = (a+z.intValue()).toString(b).substr(1) + r;\n      y.divRemTo(d,y,z);\n    }\n    return z.intValue().toString(b) + r;\n  }\n\n  // (public) return value as integer\n  function bnIntValue() {\n    if(this.s < 0) {\n      if(this.t == 1) return this[0]-this.DV;\n      else if(this.t == 0) return -1;\n    }\n    else if(this.t == 1) return this[0];\n    else if(this.t == 0) return 0;\n    // assumes 16 < DB < 32\n    return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n  }\n\n  // (protected) r = this + a\n  function bnpAddTo(a,r) {\n    var i = 0, c = 0, m = Math.min(a.t,this.t);\n    while(i < m) {\n      c += this[i]+a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    if(a.t < this.t) {\n      c += a.s;\n      while(i < this.t) {\n        c += this[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += this.s;\n    }\n    else {\n      c += this.s;\n      while(i < a.t) {\n        c += a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += a.s;\n    }\n    r.s = (c<0)?-1:0;\n    if(c > 0) r[i++] = c;\n    else if(c < -1) r[i++] = this.DV+c;\n    r.t = i;\n    r.clamp();\n  }\n\n  BigInteger.prototype.fromRadix = bnpFromRadix;\n  BigInteger.prototype.chunkSize = bnpChunkSize;\n  BigInteger.prototype.signum = bnSigNum;\n  BigInteger.prototype.dMultiply = bnpDMultiply;\n  BigInteger.prototype.dAddOffset = bnpDAddOffset;\n  BigInteger.prototype.toRadix = bnpToRadix;\n  BigInteger.prototype.intValue = bnIntValue;\n  BigInteger.prototype.addTo = bnpAddTo;\n\n  //======= end jsbn =======\n\n  // Emscripten wrapper\n  var Wrapper = {\n    abs: function(l, h) {\n      var x = new goog.math.Long(l, h);\n      var ret;\n      if (x.isNegative()) {\n        ret = x.negate();\n      } else {\n        ret = x;\n      }\n      HEAP32[tempDoublePtr>>2] = ret.low_;\n      HEAP32[tempDoublePtr+4>>2] = ret.high_;\n    },\n    ensureTemps: function() {\n      if (Wrapper.ensuredTemps) return;\n      Wrapper.ensuredTemps = true;\n      Wrapper.two32 = new BigInteger();\n      Wrapper.two32.fromString('4294967296', 10);\n      Wrapper.two64 = new BigInteger();\n      Wrapper.two64.fromString('18446744073709551616', 10);\n      Wrapper.temp1 = new BigInteger();\n      Wrapper.temp2 = new BigInteger();\n    },\n    lh2bignum: function(l, h) {\n      var a = new BigInteger();\n      a.fromString(h.toString(), 10);\n      var b = new BigInteger();\n      a.multiplyTo(Wrapper.two32, b);\n      var c = new BigInteger();\n      c.fromString(l.toString(), 10);\n      var d = new BigInteger();\n      c.addTo(b, d);\n      return d;\n    },\n    stringify: function(l, h, unsigned) {\n      var ret = new goog.math.Long(l, h).toString();\n      if (unsigned && ret[0] == '-') {\n        // unsign slowly using jsbn bignums\n        Wrapper.ensureTemps();\n        var bignum = new BigInteger();\n        bignum.fromString(ret, 10);\n        ret = new BigInteger();\n        Wrapper.two64.addTo(bignum, ret);\n        ret = ret.toString(10);\n      }\n      return ret;\n    },\n    fromString: function(str, base, min, max, unsigned) {\n      Wrapper.ensureTemps();\n      var bignum = new BigInteger();\n      bignum.fromString(str, base);\n      var bigmin = new BigInteger();\n      bigmin.fromString(min, 10);\n      var bigmax = new BigInteger();\n      bigmax.fromString(max, 10);\n      if (unsigned && bignum.compareTo(BigInteger.ZERO) < 0) {\n        var temp = new BigInteger();\n        bignum.addTo(Wrapper.two64, temp);\n        bignum = temp;\n      }\n      var error = false;\n      if (bignum.compareTo(bigmin) < 0) {\n        bignum = bigmin;\n        error = true;\n      } else if (bignum.compareTo(bigmax) > 0) {\n        bignum = bigmax;\n        error = true;\n      }\n      var ret = goog.math.Long.fromString(bignum.toString()); // min-max checks should have clamped this to a range goog.math.Long can handle well\n      HEAP32[tempDoublePtr>>2] = ret.low_;\n      HEAP32[tempDoublePtr+4>>2] = ret.high_;\n      if (error) throw 'range error';\n    }\n  };\n  return Wrapper;\n})();\n\n//======= end closure i64 code =======\n\n\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "dry.c", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\n\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(11195);\n/* global initializers */ __ATINIT__.push();\n\n\n/* memory initializer */ allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,72,82,89,83,84,79,78,69,32,80,82,79,71,82,65,77,44,32,83,79,77,69,32,83,84,82,73,78,71], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  \n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;\n\n  function _sbrk(bytes) {\n      // Implement a Linux-like 'memory area' for our 'process'.\n      // Changes the size of the memory area by |bytes|; returns the\n      // address of the previous top ('break') of the memory area\n      // We control the \"dynamic\" memory - DYNAMIC_BASE to DYNAMICTOP\n      var self = _sbrk;\n      if (!self.called) {\n        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned\n        self.called = true;\n        assert(Runtime.dynamicAlloc);\n        self.alloc = Runtime.dynamicAlloc;\n        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };\n      }\n      var ret = DYNAMICTOP;\n      if (bytes != 0) self.alloc(bytes);\n      return ret;  // Previous break location.\n    }\n\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  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 _sysconf(name) {\n      // long sysconf(int name);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html\n      switch(name) {\n        case 30: return PAGE_SIZE;\n        case 132:\n        case 133:\n        case 12:\n        case 137:\n        case 138:\n        case 15:\n        case 235:\n        case 16:\n        case 17:\n        case 18:\n        case 19:\n        case 20:\n        case 149:\n        case 13:\n        case 10:\n        case 236:\n        case 153:\n        case 9:\n        case 21:\n        case 22:\n        case 159:\n        case 154:\n        case 14:\n        case 77:\n        case 78:\n        case 139:\n        case 80:\n        case 81:\n        case 79:\n        case 82:\n        case 68:\n        case 67:\n        case 164:\n        case 11:\n        case 29:\n        case 47:\n        case 48:\n        case 95:\n        case 52:\n        case 51:\n        case 46:\n          return 200809;\n        case 27:\n        case 246:\n        case 127:\n        case 128:\n        case 23:\n        case 24:\n        case 160:\n        case 161:\n        case 181:\n        case 182:\n        case 242:\n        case 183:\n        case 184:\n        case 243:\n        case 244:\n        case 245:\n        case 165:\n        case 178:\n        case 179:\n        case 49:\n        case 50:\n        case 168:\n        case 169:\n        case 175:\n        case 170:\n        case 171:\n        case 172:\n        case 97:\n        case 76:\n        case 32:\n        case 173:\n        case 35:\n          return -1;\n        case 176:\n        case 177:\n        case 7:\n        case 155:\n        case 8:\n        case 157:\n        case 125:\n        case 126:\n        case 92:\n        case 93:\n        case 129:\n        case 130:\n        case 131:\n        case 94:\n        case 91:\n          return 1;\n        case 74:\n        case 60:\n        case 69:\n        case 70:\n        case 4:\n          return 1024;\n        case 31:\n        case 42:\n        case 72:\n          return 32;\n        case 87:\n        case 26:\n        case 33:\n          return 2147483647;\n        case 34:\n        case 1:\n          return 47839;\n        case 38:\n        case 36:\n          return 99;\n        case 43:\n        case 37:\n          return 2048;\n        case 0: return 2097152;\n        case 3: return 65536;\n        case 28: return 32768;\n        case 44: return 32767;\n        case 75: return 16384;\n        case 39: return 1000;\n        case 89: return 700;\n        case 71: return 256;\n        case 40: return 255;\n        case 2: return 100;\n        case 180: return 64;\n        case 25: return 20;\n        case 5: return 16;\n        case 6: return 6;\n        case 73: return 4;\n        case 84: return 1;\n      }\n      ___setErrNo(ERRNO_CODES.EINVAL);\n      return -1;\n    }\n\n  function _clock() {\n      if (_clock.start === undefined) _clock.start = Date.now();\n      return Math.floor((Date.now() - _clock.start) * (1000000/1000));\n    }\n\n   \n  Module[\"_memset\"] = _memset;\n\n  function ___errno_location() {\n      return ___errno_state;\n    }\n\n  function _abort() {\n      Module['abort']();\n    }\n\n  \n  \n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  function _time(ptr) {\n      var ret = Math.floor(Date.now()/1000);\n      if (ptr) {\n        HEAP32[((ptr)>>2)]=ret;\n      }\n      return ret;\n    }\n\n   \n  Module[\"_strlen\"] = _strlen;\n\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n\nvar Math_min = Math.min;\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=0;var n=0;var o=0;var p=0;var q=+env.NaN,r=+env.Infinity;var s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0;var B=0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=global.Math.floor;var M=global.Math.abs;var N=global.Math.sqrt;var O=global.Math.pow;var P=global.Math.cos;var Q=global.Math.sin;var R=global.Math.tan;var S=global.Math.acos;var T=global.Math.asin;var U=global.Math.atan;var V=global.Math.atan2;var W=global.Math.exp;var X=global.Math.log;var Y=global.Math.ceil;var Z=global.Math.imul;var _=env.abort;var $=env.assert;var aa=env.asmPrintInt;var ba=env.asmPrintFloat;var ca=env.min;var da=env._clock;var ea=env._fflush;var fa=env._abort;var ga=env.___setErrNo;var ha=env._sbrk;var ia=env._time;var ja=env._emscripten_memcpy_big;var ka=env._sysconf;var la=env.___errno_location;var ma=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction na(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function oa(){return i|0}function pa(a){a=a|0;i=a}function qa(a,b){a=a|0;b=b|0;if((m|0)==0){m=a;n=b}}function ra(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function sa(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function ta(a){a=a|0;B=a}function ua(a){a=a|0;C=a}function va(a){a=a|0;D=a}function wa(a){a=a|0;E=a}function xa(a){a=a|0;F=a}function ya(a){a=a|0;G=a}function za(a){a=a|0;H=a}function Aa(a){a=a|0;I=a}function Ba(a){a=a|0;J=a}function Ca(a){a=a|0;K=a}function Da(){var b=0,d=0,e=0,f=0;b=i;da()|0;da()|0;d=Ea(48)|0;c[2]=d;e=Ea(48)|0;c[4]=e;c[e>>2]=d;c[e+4>>2]=0;c[e+8>>2]=10001;c[e+12>>2]=40;d=e+16|0;e=24|0;f=d+31|0;do{a[d]=a[e]|0;d=d+1|0;e=e+1|0}while((d|0)<(f|0));c[1716>>2]=10;da()|0;e=0;do{a[10688]=65;a[10680]=66;c[2616]=1;c[10504>>2]=7;c[10508>>2]=7;c[10624>>2]=8;c[1720>>2]=8;c[1724>>2]=8;c[1716>>2]=(c[1716>>2]|0)+1;c[5800>>2]=7;c[2674]=5;d=c[4]|0;c[d+12>>2]=5;f=c[d>>2]|0;c[f+12>>2]=5;c[f>>2]=f;f=a[10680]|0;if(!(f<<24>>24<65)){d=65;do{d=d+1<<24>>24;}while(!(d<<24>>24>f<<24>>24))}e=e+1|0;}while((e|0)!=1e8);i=b;return 0}function Ea(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,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,ga=0,ja=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;b=i;do{if(a>>>0<245){if(a>>>0<11){d=16}else{d=a+11&-8}e=d>>>3;f=c[2676]|0;g=f>>>e;if((g&3|0)!=0){h=(g&1^1)+e|0;j=h<<1;k=10744+(j<<2)|0;l=10744+(j+2<<2)|0;j=c[l>>2]|0;m=j+8|0;n=c[m>>2]|0;do{if((k|0)==(n|0)){c[2676]=f&~(1<<h)}else{if(n>>>0<(c[10720>>2]|0)>>>0){fa()}o=n+12|0;if((c[o>>2]|0)==(j|0)){c[o>>2]=k;c[l>>2]=n;break}else{fa()}}}while(0);n=h<<3;c[j+4>>2]=n|3;l=j+(n|4)|0;c[l>>2]=c[l>>2]|1;p=m;i=b;return p|0}if(!(d>>>0>(c[10712>>2]|0)>>>0)){q=d;break}if((g|0)!=0){l=2<<e;n=g<<e&(l|0-l);l=(n&0-n)+ -1|0;n=l>>>12&16;k=l>>>n;l=k>>>5&8;o=k>>>l;k=o>>>2&4;r=o>>>k;o=r>>>1&2;s=r>>>o;r=s>>>1&1;t=(l|n|k|o|r)+(s>>>r)|0;r=t<<1;s=10744+(r<<2)|0;o=10744+(r+2<<2)|0;r=c[o>>2]|0;k=r+8|0;n=c[k>>2]|0;do{if((s|0)==(n|0)){c[2676]=f&~(1<<t)}else{if(n>>>0<(c[10720>>2]|0)>>>0){fa()}l=n+12|0;if((c[l>>2]|0)==(r|0)){c[l>>2]=s;c[o>>2]=n;break}else{fa()}}}while(0);n=t<<3;o=n-d|0;c[r+4>>2]=d|3;s=r;f=s+d|0;c[s+(d|4)>>2]=o|1;c[s+n>>2]=o;n=c[10712>>2]|0;if((n|0)!=0){s=c[10724>>2]|0;e=n>>>3;n=e<<1;g=10744+(n<<2)|0;m=c[2676]|0;j=1<<e;do{if((m&j|0)==0){c[2676]=m|j;u=10744+(n+2<<2)|0;v=g}else{e=10744+(n+2<<2)|0;h=c[e>>2]|0;if(!(h>>>0<(c[10720>>2]|0)>>>0)){u=e;v=h;break}fa()}}while(0);c[u>>2]=s;c[v+12>>2]=s;c[s+8>>2]=v;c[s+12>>2]=g}c[10712>>2]=o;c[10724>>2]=f;p=k;i=b;return p|0}n=c[10708>>2]|0;if((n|0)==0){q=d;break}j=(n&0-n)+ -1|0;n=j>>>12&16;m=j>>>n;j=m>>>5&8;r=m>>>j;m=r>>>2&4;t=r>>>m;r=t>>>1&2;h=t>>>r;t=h>>>1&1;e=c[11008+((j|n|m|r|t)+(h>>>t)<<2)>>2]|0;t=(c[e+4>>2]&-8)-d|0;h=e;r=e;while(1){e=c[h+16>>2]|0;if((e|0)==0){m=c[h+20>>2]|0;if((m|0)==0){break}else{w=m}}else{w=e}e=(c[w+4>>2]&-8)-d|0;m=e>>>0<t>>>0;t=m?e:t;h=w;r=m?w:r}h=r;k=c[10720>>2]|0;if(h>>>0<k>>>0){fa()}f=h+d|0;o=f;if(!(h>>>0<f>>>0)){fa()}f=c[r+24>>2]|0;g=c[r+12>>2]|0;do{if((g|0)==(r|0)){s=r+20|0;m=c[s>>2]|0;if((m|0)==0){e=r+16|0;n=c[e>>2]|0;if((n|0)==0){x=0;break}else{y=n;z=e}}else{y=m;z=s}while(1){s=y+20|0;m=c[s>>2]|0;if((m|0)!=0){z=s;y=m;continue}m=y+16|0;s=c[m>>2]|0;if((s|0)==0){break}else{y=s;z=m}}if(z>>>0<k>>>0){fa()}else{c[z>>2]=0;x=y;break}}else{m=c[r+8>>2]|0;if(m>>>0<k>>>0){fa()}s=m+12|0;if((c[s>>2]|0)!=(r|0)){fa()}e=g+8|0;if((c[e>>2]|0)==(r|0)){c[s>>2]=g;c[e>>2]=m;x=g;break}else{fa()}}}while(0);a:do{if((f|0)!=0){g=c[r+28>>2]|0;k=11008+(g<<2)|0;do{if((r|0)==(c[k>>2]|0)){c[k>>2]=x;if((x|0)!=0){break}c[10708>>2]=c[10708>>2]&~(1<<g);break a}else{if(f>>>0<(c[10720>>2]|0)>>>0){fa()}m=f+16|0;if((c[m>>2]|0)==(r|0)){c[m>>2]=x}else{c[f+20>>2]=x}if((x|0)==0){break a}}}while(0);if(x>>>0<(c[10720>>2]|0)>>>0){fa()}c[x+24>>2]=f;g=c[r+16>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[x+16>>2]=g;c[g+24>>2]=x;break}}}while(0);g=c[r+20>>2]|0;if((g|0)==0){break}if(g>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[x+20>>2]=g;c[g+24>>2]=x;break}}}while(0);if(t>>>0<16){f=t+d|0;c[r+4>>2]=f|3;g=h+(f+4)|0;c[g>>2]=c[g>>2]|1}else{c[r+4>>2]=d|3;c[h+(d|4)>>2]=t|1;c[h+(t+d)>>2]=t;g=c[10712>>2]|0;if((g|0)!=0){f=c[10724>>2]|0;k=g>>>3;g=k<<1;m=10744+(g<<2)|0;e=c[2676]|0;s=1<<k;do{if((e&s|0)==0){c[2676]=e|s;A=10744+(g+2<<2)|0;B=m}else{k=10744+(g+2<<2)|0;n=c[k>>2]|0;if(!(n>>>0<(c[10720>>2]|0)>>>0)){A=k;B=n;break}fa()}}while(0);c[A>>2]=f;c[B+12>>2]=f;c[f+8>>2]=B;c[f+12>>2]=m}c[10712>>2]=t;c[10724>>2]=o}p=r+8|0;i=b;return p|0}else{if(a>>>0>4294967231){q=-1;break}g=a+11|0;s=g&-8;e=c[10708>>2]|0;if((e|0)==0){q=s;break}h=0-s|0;n=g>>>8;do{if((n|0)==0){C=0}else{if(s>>>0>16777215){C=31;break}g=(n+1048320|0)>>>16&8;k=n<<g;j=(k+520192|0)>>>16&4;l=k<<j;k=(l+245760|0)>>>16&2;D=14-(j|g|k)+(l<<k>>>15)|0;C=s>>>(D+7|0)&1|D<<1}}while(0);n=c[11008+(C<<2)>>2]|0;b:do{if((n|0)==0){E=h;F=0;G=0}else{if((C|0)==31){H=0}else{H=25-(C>>>1)|0}r=h;o=0;t=s<<H;m=n;f=0;while(1){D=c[m+4>>2]&-8;k=D-s|0;if(k>>>0<r>>>0){if((D|0)==(s|0)){E=k;F=m;G=m;break b}else{I=k;J=m}}else{I=r;J=f}k=c[m+20>>2]|0;D=c[m+(t>>>31<<2)+16>>2]|0;l=(k|0)==0|(k|0)==(D|0)?o:k;if((D|0)==0){E=I;F=l;G=J;break}else{r=I;o=l;t=t<<1;m=D;f=J}}}}while(0);if((F|0)==0&(G|0)==0){n=2<<C;h=e&(n|0-n);if((h|0)==0){q=s;break}n=(h&0-h)+ -1|0;h=n>>>12&16;f=n>>>h;n=f>>>5&8;m=f>>>n;f=m>>>2&4;t=m>>>f;m=t>>>1&2;o=t>>>m;t=o>>>1&1;K=c[11008+((n|h|f|m|t)+(o>>>t)<<2)>>2]|0}else{K=F}if((K|0)==0){L=E;M=G}else{t=E;o=K;m=G;while(1){f=(c[o+4>>2]&-8)-s|0;h=f>>>0<t>>>0;n=h?f:t;f=h?o:m;h=c[o+16>>2]|0;if((h|0)!=0){N=f;O=n;m=N;o=h;t=O;continue}h=c[o+20>>2]|0;if((h|0)==0){L=n;M=f;break}else{N=f;O=n;o=h;m=N;t=O}}}if((M|0)==0){q=s;break}if(!(L>>>0<((c[10712>>2]|0)-s|0)>>>0)){q=s;break}t=M;m=c[10720>>2]|0;if(t>>>0<m>>>0){fa()}o=t+s|0;e=o;if(!(t>>>0<o>>>0)){fa()}h=c[M+24>>2]|0;n=c[M+12>>2]|0;do{if((n|0)==(M|0)){f=M+20|0;r=c[f>>2]|0;if((r|0)==0){D=M+16|0;l=c[D>>2]|0;if((l|0)==0){P=0;break}else{Q=l;R=D}}else{Q=r;R=f}while(1){f=Q+20|0;r=c[f>>2]|0;if((r|0)!=0){R=f;Q=r;continue}r=Q+16|0;f=c[r>>2]|0;if((f|0)==0){break}else{Q=f;R=r}}if(R>>>0<m>>>0){fa()}else{c[R>>2]=0;P=Q;break}}else{r=c[M+8>>2]|0;if(r>>>0<m>>>0){fa()}f=r+12|0;if((c[f>>2]|0)!=(M|0)){fa()}D=n+8|0;if((c[D>>2]|0)==(M|0)){c[f>>2]=n;c[D>>2]=r;P=n;break}else{fa()}}}while(0);c:do{if((h|0)!=0){n=c[M+28>>2]|0;m=11008+(n<<2)|0;do{if((M|0)==(c[m>>2]|0)){c[m>>2]=P;if((P|0)!=0){break}c[10708>>2]=c[10708>>2]&~(1<<n);break c}else{if(h>>>0<(c[10720>>2]|0)>>>0){fa()}r=h+16|0;if((c[r>>2]|0)==(M|0)){c[r>>2]=P}else{c[h+20>>2]=P}if((P|0)==0){break c}}}while(0);if(P>>>0<(c[10720>>2]|0)>>>0){fa()}c[P+24>>2]=h;n=c[M+16>>2]|0;do{if((n|0)!=0){if(n>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[P+16>>2]=n;c[n+24>>2]=P;break}}}while(0);n=c[M+20>>2]|0;if((n|0)==0){break}if(n>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[P+20>>2]=n;c[n+24>>2]=P;break}}}while(0);d:do{if(L>>>0<16){h=L+s|0;c[M+4>>2]=h|3;n=t+(h+4)|0;c[n>>2]=c[n>>2]|1}else{c[M+4>>2]=s|3;c[t+(s|4)>>2]=L|1;c[t+(L+s)>>2]=L;n=L>>>3;if(L>>>0<256){h=n<<1;m=10744+(h<<2)|0;r=c[2676]|0;D=1<<n;do{if((r&D|0)==0){c[2676]=r|D;S=10744+(h+2<<2)|0;T=m}else{n=10744+(h+2<<2)|0;f=c[n>>2]|0;if(!(f>>>0<(c[10720>>2]|0)>>>0)){S=n;T=f;break}fa()}}while(0);c[S>>2]=e;c[T+12>>2]=e;c[t+(s+8)>>2]=T;c[t+(s+12)>>2]=m;break}h=o;D=L>>>8;do{if((D|0)==0){U=0}else{if(L>>>0>16777215){U=31;break}r=(D+1048320|0)>>>16&8;f=D<<r;n=(f+520192|0)>>>16&4;l=f<<n;f=(l+245760|0)>>>16&2;k=14-(n|r|f)+(l<<f>>>15)|0;U=L>>>(k+7|0)&1|k<<1}}while(0);D=11008+(U<<2)|0;c[t+(s+28)>>2]=U;c[t+(s+20)>>2]=0;c[t+(s+16)>>2]=0;m=c[10708>>2]|0;k=1<<U;if((m&k|0)==0){c[10708>>2]=m|k;c[D>>2]=h;c[t+(s+24)>>2]=D;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break}k=c[D>>2]|0;if((U|0)==31){V=0}else{V=25-(U>>>1)|0}e:do{if((c[k+4>>2]&-8|0)==(L|0)){W=k}else{D=L<<V;m=k;while(1){X=m+(D>>>31<<2)+16|0;f=c[X>>2]|0;if((f|0)==0){break}if((c[f+4>>2]&-8|0)==(L|0)){W=f;break e}else{D=D<<1;m=f}}if(X>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[X>>2]=h;c[t+(s+24)>>2]=m;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break d}}}while(0);k=W+8|0;D=c[k>>2]|0;f=c[10720>>2]|0;if(W>>>0<f>>>0){fa()}if(D>>>0<f>>>0){fa()}else{c[D+12>>2]=h;c[k>>2]=h;c[t+(s+8)>>2]=D;c[t+(s+12)>>2]=W;c[t+(s+24)>>2]=0;break}}}while(0);p=M+8|0;i=b;return p|0}}while(0);M=c[10712>>2]|0;if(!(q>>>0>M>>>0)){W=M-q|0;X=c[10724>>2]|0;if(W>>>0>15){L=X;c[10724>>2]=L+q;c[10712>>2]=W;c[L+(q+4)>>2]=W|1;c[L+M>>2]=W;c[X+4>>2]=q|3}else{c[10712>>2]=0;c[10724>>2]=0;c[X+4>>2]=M|3;W=X+(M+4)|0;c[W>>2]=c[W>>2]|1}p=X+8|0;i=b;return p|0}X=c[10716>>2]|0;if(q>>>0<X>>>0){W=X-q|0;c[10716>>2]=W;X=c[10728>>2]|0;M=X;c[10728>>2]=M+q;c[M+(q+4)>>2]=W|1;c[X+4>>2]=q|3;p=X+8|0;i=b;return p|0}do{if((c[2794]|0)==0){X=ka(30)|0;if((X+ -1&X|0)==0){c[11184>>2]=X;c[11180>>2]=X;c[11188>>2]=-1;c[11192>>2]=-1;c[11196>>2]=0;c[11148>>2]=0;c[2794]=(ia(0)|0)&-16^1431655768;break}else{fa()}}}while(0);X=q+48|0;W=c[11184>>2]|0;M=q+47|0;L=W+M|0;V=0-W|0;W=L&V;if(!(W>>>0>q>>>0)){p=0;i=b;return p|0}U=c[11144>>2]|0;do{if((U|0)!=0){T=c[11136>>2]|0;S=T+W|0;if(S>>>0<=T>>>0|S>>>0>U>>>0){p=0}else{break}i=b;return p|0}}while(0);f:do{if((c[11148>>2]&4|0)==0){U=c[10728>>2]|0;g:do{if((U|0)==0){Y=182}else{S=U;T=11152|0;while(1){Z=T;P=c[Z>>2]|0;if(!(P>>>0>S>>>0)){_=T+4|0;if((P+(c[_>>2]|0)|0)>>>0>S>>>0){break}}P=c[T+8>>2]|0;if((P|0)==0){Y=182;break g}else{T=P}}if((T|0)==0){Y=182;break}S=L-(c[10716>>2]|0)&V;if(!(S>>>0<2147483647)){$=0;break}h=ha(S|0)|0;P=(h|0)==((c[Z>>2]|0)+(c[_>>2]|0)|0);aa=h;ba=S;ca=P?h:-1;da=P?S:0;Y=191}}while(0);do{if((Y|0)==182){U=ha(0)|0;if((U|0)==(-1|0)){$=0;break}S=U;P=c[11180>>2]|0;h=P+ -1|0;if((h&S|0)==0){ea=W}else{ea=W-S+(h+S&0-P)|0}P=c[11136>>2]|0;S=P+ea|0;if(!(ea>>>0>q>>>0&ea>>>0<2147483647)){$=0;break}h=c[11144>>2]|0;if((h|0)!=0){if(S>>>0<=P>>>0|S>>>0>h>>>0){$=0;break}}h=ha(ea|0)|0;S=(h|0)==(U|0);aa=h;ba=ea;ca=S?U:-1;da=S?ea:0;Y=191}}while(0);h:do{if((Y|0)==191){S=0-ba|0;if((ca|0)!=(-1|0)){ga=ca;ja=da;Y=202;break f}do{if((aa|0)!=(-1|0)&ba>>>0<2147483647&ba>>>0<X>>>0){U=c[11184>>2]|0;h=M-ba+U&0-U;if(!(h>>>0<2147483647)){ma=ba;break}if((ha(h|0)|0)==(-1|0)){ha(S|0)|0;$=da;break h}else{ma=h+ba|0;break}}else{ma=ba}}while(0);if((aa|0)==(-1|0)){$=da}else{ga=aa;ja=ma;Y=202;break f}}}while(0);c[11148>>2]=c[11148>>2]|4;na=$;Y=199}else{na=0;Y=199}}while(0);do{if((Y|0)==199){if(!(W>>>0<2147483647)){break}$=ha(W|0)|0;ma=ha(0)|0;if(!((ma|0)!=(-1|0)&($|0)!=(-1|0)&$>>>0<ma>>>0)){break}aa=ma-$|0;ma=aa>>>0>(q+40|0)>>>0;if(ma){ga=$;ja=ma?aa:na;Y=202}}}while(0);do{if((Y|0)==202){na=(c[11136>>2]|0)+ja|0;c[11136>>2]=na;if(na>>>0>(c[11140>>2]|0)>>>0){c[11140>>2]=na}na=c[10728>>2]|0;i:do{if((na|0)==0){W=c[10720>>2]|0;if((W|0)==0|ga>>>0<W>>>0){c[10720>>2]=ga}c[11152>>2]=ga;c[11156>>2]=ja;c[11164>>2]=0;c[10740>>2]=c[2794];c[10736>>2]=-1;W=0;do{aa=W<<1;ma=10744+(aa<<2)|0;c[10744+(aa+3<<2)>>2]=ma;c[10744+(aa+2<<2)>>2]=ma;W=W+1|0;}while((W|0)!=32);W=ga+8|0;if((W&7|0)==0){oa=0}else{oa=0-W&7}W=ja+ -40-oa|0;c[10728>>2]=ga+oa;c[10716>>2]=W;c[ga+(oa+4)>>2]=W|1;c[ga+(ja+ -36)>>2]=40;c[10732>>2]=c[11192>>2]}else{W=11152|0;while(1){pa=c[W>>2]|0;qa=W+4|0;ra=c[qa>>2]|0;if((ga|0)==(pa+ra|0)){Y=214;break}ma=c[W+8>>2]|0;if((ma|0)==0){break}else{W=ma}}do{if((Y|0)==214){if((c[W+12>>2]&8|0)!=0){break}ma=na;if(!(ma>>>0>=pa>>>0&ma>>>0<ga>>>0)){break}c[qa>>2]=ra+ja;aa=(c[10716>>2]|0)+ja|0;$=na+8|0;if(($&7|0)==0){sa=0}else{sa=0-$&7}$=aa-sa|0;c[10728>>2]=ma+sa;c[10716>>2]=$;c[ma+(sa+4)>>2]=$|1;c[ma+(aa+4)>>2]=40;c[10732>>2]=c[11192>>2];break i}}while(0);if(ga>>>0<(c[10720>>2]|0)>>>0){c[10720>>2]=ga}W=ga+ja|0;aa=11152|0;while(1){ta=aa;if((c[ta>>2]|0)==(W|0)){Y=224;break}ma=c[aa+8>>2]|0;if((ma|0)==0){break}else{aa=ma}}do{if((Y|0)==224){if((c[aa+12>>2]&8|0)!=0){break}c[ta>>2]=ga;W=aa+4|0;c[W>>2]=(c[W>>2]|0)+ja;W=ga+8|0;if((W&7|0)==0){ua=0}else{ua=0-W&7}W=ga+(ja+8)|0;if((W&7|0)==0){va=0}else{va=0-W&7}W=ga+(va+ja)|0;ma=W;$=ua+q|0;da=ga+$|0;ba=da;M=W-(ga+ua)-q|0;c[ga+(ua+4)>>2]=q|3;j:do{if((ma|0)==(c[10728>>2]|0)){X=(c[10716>>2]|0)+M|0;c[10716>>2]=X;c[10728>>2]=ba;c[ga+($+4)>>2]=X|1}else{if((ma|0)==(c[10724>>2]|0)){X=(c[10712>>2]|0)+M|0;c[10712>>2]=X;c[10724>>2]=ba;c[ga+($+4)>>2]=X|1;c[ga+(X+$)>>2]=X;break}X=ja+4|0;ca=c[ga+(X+va)>>2]|0;if((ca&3|0)==1){ea=ca&-8;_=ca>>>3;k:do{if(ca>>>0<256){Z=c[ga+((va|8)+ja)>>2]|0;V=c[ga+(ja+12+va)>>2]|0;L=10744+(_<<1<<2)|0;do{if((Z|0)!=(L|0)){if(Z>>>0<(c[10720>>2]|0)>>>0){fa()}if((c[Z+12>>2]|0)==(ma|0)){break}fa()}}while(0);if((V|0)==(Z|0)){c[2676]=c[2676]&~(1<<_);break}do{if((V|0)==(L|0)){wa=V+8|0}else{if(V>>>0<(c[10720>>2]|0)>>>0){fa()}S=V+8|0;if((c[S>>2]|0)==(ma|0)){wa=S;break}fa()}}while(0);c[Z+12>>2]=V;c[wa>>2]=Z}else{L=W;S=c[ga+((va|24)+ja)>>2]|0;T=c[ga+(ja+12+va)>>2]|0;do{if((T|0)==(L|0)){h=va|16;U=ga+(X+h)|0;P=c[U>>2]|0;if((P|0)==0){Q=ga+(h+ja)|0;h=c[Q>>2]|0;if((h|0)==0){xa=0;break}else{ya=h;za=Q}}else{ya=P;za=U}while(1){U=ya+20|0;P=c[U>>2]|0;if((P|0)!=0){za=U;ya=P;continue}P=ya+16|0;U=c[P>>2]|0;if((U|0)==0){break}else{ya=U;za=P}}if(za>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[za>>2]=0;xa=ya;break}}else{P=c[ga+((va|8)+ja)>>2]|0;if(P>>>0<(c[10720>>2]|0)>>>0){fa()}U=P+12|0;if((c[U>>2]|0)!=(L|0)){fa()}Q=T+8|0;if((c[Q>>2]|0)==(L|0)){c[U>>2]=T;c[Q>>2]=P;xa=T;break}else{fa()}}}while(0);if((S|0)==0){break}T=c[ga+(ja+28+va)>>2]|0;Z=11008+(T<<2)|0;do{if((L|0)==(c[Z>>2]|0)){c[Z>>2]=xa;if((xa|0)!=0){break}c[10708>>2]=c[10708>>2]&~(1<<T);break k}else{if(S>>>0<(c[10720>>2]|0)>>>0){fa()}V=S+16|0;if((c[V>>2]|0)==(L|0)){c[V>>2]=xa}else{c[S+20>>2]=xa}if((xa|0)==0){break k}}}while(0);if(xa>>>0<(c[10720>>2]|0)>>>0){fa()}c[xa+24>>2]=S;L=va|16;T=c[ga+(L+ja)>>2]|0;do{if((T|0)!=0){if(T>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[xa+16>>2]=T;c[T+24>>2]=xa;break}}}while(0);T=c[ga+(X+L)>>2]|0;if((T|0)==0){break}if(T>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[xa+20>>2]=T;c[T+24>>2]=xa;break}}}while(0);Aa=ga+((ea|va)+ja)|0;Ba=ea+M|0}else{Aa=ma;Ba=M}X=Aa+4|0;c[X>>2]=c[X>>2]&-2;c[ga+($+4)>>2]=Ba|1;c[ga+(Ba+$)>>2]=Ba;X=Ba>>>3;if(Ba>>>0<256){_=X<<1;ca=10744+(_<<2)|0;T=c[2676]|0;S=1<<X;do{if((T&S|0)==0){c[2676]=T|S;Ca=10744+(_+2<<2)|0;Da=ca}else{X=10744+(_+2<<2)|0;Z=c[X>>2]|0;if(!(Z>>>0<(c[10720>>2]|0)>>>0)){Ca=X;Da=Z;break}fa()}}while(0);c[Ca>>2]=ba;c[Da+12>>2]=ba;c[ga+($+8)>>2]=Da;c[ga+($+12)>>2]=ca;break}_=da;S=Ba>>>8;do{if((S|0)==0){Ea=0}else{if(Ba>>>0>16777215){Ea=31;break}T=(S+1048320|0)>>>16&8;ea=S<<T;Z=(ea+520192|0)>>>16&4;X=ea<<Z;ea=(X+245760|0)>>>16&2;V=14-(Z|T|ea)+(X<<ea>>>15)|0;Ea=Ba>>>(V+7|0)&1|V<<1}}while(0);S=11008+(Ea<<2)|0;c[ga+($+28)>>2]=Ea;c[ga+($+20)>>2]=0;c[ga+($+16)>>2]=0;ca=c[10708>>2]|0;V=1<<Ea;if((ca&V|0)==0){c[10708>>2]=ca|V;c[S>>2]=_;c[ga+($+24)>>2]=S;c[ga+($+12)>>2]=_;c[ga+($+8)>>2]=_;break}V=c[S>>2]|0;if((Ea|0)==31){Fa=0}else{Fa=25-(Ea>>>1)|0}l:do{if((c[V+4>>2]&-8|0)==(Ba|0)){Ga=V}else{S=Ba<<Fa;ca=V;while(1){Ha=ca+(S>>>31<<2)+16|0;ea=c[Ha>>2]|0;if((ea|0)==0){break}if((c[ea+4>>2]&-8|0)==(Ba|0)){Ga=ea;break l}else{S=S<<1;ca=ea}}if(Ha>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[Ha>>2]=_;c[ga+($+24)>>2]=ca;c[ga+($+12)>>2]=_;c[ga+($+8)>>2]=_;break j}}}while(0);V=Ga+8|0;S=c[V>>2]|0;L=c[10720>>2]|0;if(Ga>>>0<L>>>0){fa()}if(S>>>0<L>>>0){fa()}else{c[S+12>>2]=_;c[V>>2]=_;c[ga+($+8)>>2]=S;c[ga+($+12)>>2]=Ga;c[ga+($+24)>>2]=0;break}}}while(0);p=ga+(ua|8)|0;i=b;return p|0}}while(0);aa=na;$=11152|0;while(1){Ia=c[$>>2]|0;if(!(Ia>>>0>aa>>>0)){Ja=c[$+4>>2]|0;Ka=Ia+Ja|0;if(Ka>>>0>aa>>>0){break}}$=c[$+8>>2]|0}$=Ia+(Ja+ -39)|0;if(($&7|0)==0){La=0}else{La=0-$&7}$=Ia+(Ja+ -47+La)|0;da=$>>>0<(na+16|0)>>>0?aa:$;$=da+8|0;ba=$;M=ga+8|0;if((M&7|0)==0){Ma=0}else{Ma=0-M&7}M=ja+ -40-Ma|0;c[10728>>2]=ga+Ma;c[10716>>2]=M;c[ga+(Ma+4)>>2]=M|1;c[ga+(ja+ -36)>>2]=40;c[10732>>2]=c[11192>>2];c[da+4>>2]=27;c[$+0>>2]=c[11152>>2];c[$+4>>2]=c[11156>>2];c[$+8>>2]=c[11160>>2];c[$+12>>2]=c[11164>>2];c[11152>>2]=ga;c[11156>>2]=ja;c[11164>>2]=0;c[11160>>2]=ba;ba=da+28|0;c[ba>>2]=7;if((da+32|0)>>>0<Ka>>>0){$=ba;while(1){ba=$+4|0;c[ba>>2]=7;if(($+8|0)>>>0<Ka>>>0){$=ba}else{break}}}if((da|0)==(aa|0)){break}$=da-na|0;ba=aa+($+4)|0;c[ba>>2]=c[ba>>2]&-2;c[na+4>>2]=$|1;c[aa+$>>2]=$;ba=$>>>3;if($>>>0<256){M=ba<<1;ma=10744+(M<<2)|0;W=c[2676]|0;m=1<<ba;do{if((W&m|0)==0){c[2676]=W|m;Na=10744+(M+2<<2)|0;Oa=ma}else{ba=10744+(M+2<<2)|0;S=c[ba>>2]|0;if(!(S>>>0<(c[10720>>2]|0)>>>0)){Na=ba;Oa=S;break}fa()}}while(0);c[Na>>2]=na;c[Oa+12>>2]=na;c[na+8>>2]=Oa;c[na+12>>2]=ma;break}M=na;m=$>>>8;do{if((m|0)==0){Pa=0}else{if($>>>0>16777215){Pa=31;break}W=(m+1048320|0)>>>16&8;aa=m<<W;da=(aa+520192|0)>>>16&4;S=aa<<da;aa=(S+245760|0)>>>16&2;ba=14-(da|W|aa)+(S<<aa>>>15)|0;Pa=$>>>(ba+7|0)&1|ba<<1}}while(0);m=11008+(Pa<<2)|0;c[na+28>>2]=Pa;c[na+20>>2]=0;c[na+16>>2]=0;ma=c[10708>>2]|0;ba=1<<Pa;if((ma&ba|0)==0){c[10708>>2]=ma|ba;c[m>>2]=M;c[na+24>>2]=m;c[na+12>>2]=na;c[na+8>>2]=na;break}ba=c[m>>2]|0;if((Pa|0)==31){Qa=0}else{Qa=25-(Pa>>>1)|0}m:do{if((c[ba+4>>2]&-8|0)==($|0)){Ra=ba}else{m=$<<Qa;ma=ba;while(1){Sa=ma+(m>>>31<<2)+16|0;aa=c[Sa>>2]|0;if((aa|0)==0){break}if((c[aa+4>>2]&-8|0)==($|0)){Ra=aa;break m}else{m=m<<1;ma=aa}}if(Sa>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[Sa>>2]=M;c[na+24>>2]=ma;c[na+12>>2]=na;c[na+8>>2]=na;break i}}}while(0);$=Ra+8|0;ba=c[$>>2]|0;m=c[10720>>2]|0;if(Ra>>>0<m>>>0){fa()}if(ba>>>0<m>>>0){fa()}else{c[ba+12>>2]=M;c[$>>2]=M;c[na+8>>2]=ba;c[na+12>>2]=Ra;c[na+24>>2]=0;break}}}while(0);na=c[10716>>2]|0;if(!(na>>>0>q>>>0)){break}ba=na-q|0;c[10716>>2]=ba;na=c[10728>>2]|0;$=na;c[10728>>2]=$+q;c[$+(q+4)>>2]=ba|1;c[na+4>>2]=q|3;p=na+8|0;i=b;return p|0}}while(0);c[(la()|0)>>2]=12;p=0;i=b;return p|0}function Fa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,N=0,O=0,P=0,Q=0;b=i;if((a|0)==0){i=b;return}d=a+ -8|0;e=d;f=c[10720>>2]|0;if(d>>>0<f>>>0){fa()}g=c[a+ -4>>2]|0;h=g&3;if((h|0)==1){fa()}j=g&-8;k=a+(j+ -8)|0;l=k;a:do{if((g&1|0)==0){m=c[d>>2]|0;if((h|0)==0){i=b;return}n=-8-m|0;o=a+n|0;p=o;q=m+j|0;if(o>>>0<f>>>0){fa()}if((p|0)==(c[10724>>2]|0)){r=a+(j+ -4)|0;if((c[r>>2]&3|0)!=3){s=p;t=q;break}c[10712>>2]=q;c[r>>2]=c[r>>2]&-2;c[a+(n+4)>>2]=q|1;c[k>>2]=q;i=b;return}r=m>>>3;if(m>>>0<256){m=c[a+(n+8)>>2]|0;u=c[a+(n+12)>>2]|0;v=10744+(r<<1<<2)|0;do{if((m|0)!=(v|0)){if(m>>>0<f>>>0){fa()}if((c[m+12>>2]|0)==(p|0)){break}fa()}}while(0);if((u|0)==(m|0)){c[2676]=c[2676]&~(1<<r);s=p;t=q;break}do{if((u|0)==(v|0)){w=u+8|0}else{if(u>>>0<f>>>0){fa()}x=u+8|0;if((c[x>>2]|0)==(p|0)){w=x;break}fa()}}while(0);c[m+12>>2]=u;c[w>>2]=m;s=p;t=q;break}v=o;r=c[a+(n+24)>>2]|0;x=c[a+(n+12)>>2]|0;do{if((x|0)==(v|0)){y=a+(n+20)|0;z=c[y>>2]|0;if((z|0)==0){A=a+(n+16)|0;B=c[A>>2]|0;if((B|0)==0){C=0;break}else{D=B;E=A}}else{D=z;E=y}while(1){y=D+20|0;z=c[y>>2]|0;if((z|0)!=0){E=y;D=z;continue}z=D+16|0;y=c[z>>2]|0;if((y|0)==0){break}else{D=y;E=z}}if(E>>>0<f>>>0){fa()}else{c[E>>2]=0;C=D;break}}else{z=c[a+(n+8)>>2]|0;if(z>>>0<f>>>0){fa()}y=z+12|0;if((c[y>>2]|0)!=(v|0)){fa()}A=x+8|0;if((c[A>>2]|0)==(v|0)){c[y>>2]=x;c[A>>2]=z;C=x;break}else{fa()}}}while(0);if((r|0)==0){s=p;t=q;break}x=c[a+(n+28)>>2]|0;o=11008+(x<<2)|0;do{if((v|0)==(c[o>>2]|0)){c[o>>2]=C;if((C|0)!=0){break}c[10708>>2]=c[10708>>2]&~(1<<x);s=p;t=q;break a}else{if(r>>>0<(c[10720>>2]|0)>>>0){fa()}m=r+16|0;if((c[m>>2]|0)==(v|0)){c[m>>2]=C}else{c[r+20>>2]=C}if((C|0)==0){s=p;t=q;break a}}}while(0);if(C>>>0<(c[10720>>2]|0)>>>0){fa()}c[C+24>>2]=r;v=c[a+(n+16)>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[C+16>>2]=v;c[v+24>>2]=C;break}}}while(0);v=c[a+(n+20)>>2]|0;if((v|0)==0){s=p;t=q;break}if(v>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[C+20>>2]=v;c[v+24>>2]=C;s=p;t=q;break}}else{s=e;t=j}}while(0);e=s;if(!(e>>>0<k>>>0)){fa()}C=a+(j+ -4)|0;f=c[C>>2]|0;if((f&1|0)==0){fa()}do{if((f&2|0)==0){if((l|0)==(c[10728>>2]|0)){D=(c[10716>>2]|0)+t|0;c[10716>>2]=D;c[10728>>2]=s;c[s+4>>2]=D|1;if((s|0)!=(c[10724>>2]|0)){i=b;return}c[10724>>2]=0;c[10712>>2]=0;i=b;return}if((l|0)==(c[10724>>2]|0)){D=(c[10712>>2]|0)+t|0;c[10712>>2]=D;c[10724>>2]=s;c[s+4>>2]=D|1;c[e+D>>2]=D;i=b;return}D=(f&-8)+t|0;E=f>>>3;b:do{if(f>>>0<256){w=c[a+j>>2]|0;h=c[a+(j|4)>>2]|0;d=10744+(E<<1<<2)|0;do{if((w|0)!=(d|0)){if(w>>>0<(c[10720>>2]|0)>>>0){fa()}if((c[w+12>>2]|0)==(l|0)){break}fa()}}while(0);if((h|0)==(w|0)){c[2676]=c[2676]&~(1<<E);break}do{if((h|0)==(d|0)){F=h+8|0}else{if(h>>>0<(c[10720>>2]|0)>>>0){fa()}g=h+8|0;if((c[g>>2]|0)==(l|0)){F=g;break}fa()}}while(0);c[w+12>>2]=h;c[F>>2]=w}else{d=k;g=c[a+(j+16)>>2]|0;v=c[a+(j|4)>>2]|0;do{if((v|0)==(d|0)){r=a+(j+12)|0;x=c[r>>2]|0;if((x|0)==0){o=a+(j+8)|0;m=c[o>>2]|0;if((m|0)==0){G=0;break}else{H=m;I=o}}else{H=x;I=r}while(1){r=H+20|0;x=c[r>>2]|0;if((x|0)!=0){I=r;H=x;continue}x=H+16|0;r=c[x>>2]|0;if((r|0)==0){break}else{H=r;I=x}}if(I>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[I>>2]=0;G=H;break}}else{x=c[a+j>>2]|0;if(x>>>0<(c[10720>>2]|0)>>>0){fa()}r=x+12|0;if((c[r>>2]|0)!=(d|0)){fa()}o=v+8|0;if((c[o>>2]|0)==(d|0)){c[r>>2]=v;c[o>>2]=x;G=v;break}else{fa()}}}while(0);if((g|0)==0){break}v=c[a+(j+20)>>2]|0;w=11008+(v<<2)|0;do{if((d|0)==(c[w>>2]|0)){c[w>>2]=G;if((G|0)!=0){break}c[10708>>2]=c[10708>>2]&~(1<<v);break b}else{if(g>>>0<(c[10720>>2]|0)>>>0){fa()}h=g+16|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=G}else{c[g+20>>2]=G}if((G|0)==0){break b}}}while(0);if(G>>>0<(c[10720>>2]|0)>>>0){fa()}c[G+24>>2]=g;d=c[a+(j+8)>>2]|0;do{if((d|0)!=0){if(d>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[G+16>>2]=d;c[d+24>>2]=G;break}}}while(0);d=c[a+(j+12)>>2]|0;if((d|0)==0){break}if(d>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[G+20>>2]=d;c[d+24>>2]=G;break}}}while(0);c[s+4>>2]=D|1;c[e+D>>2]=D;if((s|0)!=(c[10724>>2]|0)){J=D;break}c[10712>>2]=D;i=b;return}else{c[C>>2]=f&-2;c[s+4>>2]=t|1;c[e+t>>2]=t;J=t}}while(0);t=J>>>3;if(J>>>0<256){e=t<<1;f=10744+(e<<2)|0;C=c[2676]|0;G=1<<t;do{if((C&G|0)==0){c[2676]=C|G;K=10744+(e+2<<2)|0;L=f}else{t=10744+(e+2<<2)|0;j=c[t>>2]|0;if(!(j>>>0<(c[10720>>2]|0)>>>0)){K=t;L=j;break}fa()}}while(0);c[K>>2]=s;c[L+12>>2]=s;c[s+8>>2]=L;c[s+12>>2]=f;i=b;return}f=s;L=J>>>8;do{if((L|0)==0){M=0}else{if(J>>>0>16777215){M=31;break}K=(L+1048320|0)>>>16&8;e=L<<K;G=(e+520192|0)>>>16&4;C=e<<G;e=(C+245760|0)>>>16&2;j=14-(G|K|e)+(C<<e>>>15)|0;M=J>>>(j+7|0)&1|j<<1}}while(0);L=11008+(M<<2)|0;c[s+28>>2]=M;c[s+20>>2]=0;c[s+16>>2]=0;j=c[10708>>2]|0;e=1<<M;c:do{if((j&e|0)==0){c[10708>>2]=j|e;c[L>>2]=f;c[s+24>>2]=L;c[s+12>>2]=s;c[s+8>>2]=s}else{C=c[L>>2]|0;if((M|0)==31){N=0}else{N=25-(M>>>1)|0}d:do{if((c[C+4>>2]&-8|0)==(J|0)){O=C}else{K=J<<N;G=C;while(1){P=G+(K>>>31<<2)+16|0;t=c[P>>2]|0;if((t|0)==0){break}if((c[t+4>>2]&-8|0)==(J|0)){O=t;break d}else{K=K<<1;G=t}}if(P>>>0<(c[10720>>2]|0)>>>0){fa()}else{c[P>>2]=f;c[s+24>>2]=G;c[s+12>>2]=s;c[s+8>>2]=s;break c}}}while(0);C=O+8|0;D=c[C>>2]|0;K=c[10720>>2]|0;if(O>>>0<K>>>0){fa()}if(D>>>0<K>>>0){fa()}else{c[D+12>>2]=f;c[C>>2]=f;c[s+8>>2]=D;c[s+12>>2]=O;c[s+24>>2]=0;break}}}while(0);s=(c[10736>>2]|0)+ -1|0;c[10736>>2]=s;if((s|0)==0){Q=11160|0}else{i=b;return}while(1){s=c[Q>>2]|0;if((s|0)==0){break}else{Q=s+8|0}}c[10736>>2]=-1;i=b;return}function Ga(){}function Ha(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return ja(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function Ia(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function Ja(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nreturn{_strlen:Ja,_free:Fa,_main:Da,_memset:Ia,_malloc:Ea,_memcpy:Ha,runPostSets:Ga,stackAlloc:na,stackSave:oa,stackRestore:pa,setThrew:qa,setTempRet0:ta,setTempRet1:ua,setTempRet2:va,setTempRet3:wa,setTempRet4:xa,setTempRet5:ya,setTempRet6:za,setTempRet7:Aa,setTempRet8:Ba,setTempRet9:Ca}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"_clock\": _clock, \"_fflush\": _fflush, \"_abort\": _abort, \"___setErrNo\": ___setErrNo, \"_sbrk\": _sbrk, \"_time\": _time, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"_sysconf\": _sysconf, \"___errno_location\": ___errno_location, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"NaN\": NaN, \"Infinity\": Infinity }, buffer);\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _free = Module[\"_free\"] = asm[\"_free\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar _malloc = Module[\"_malloc\"] = asm[\"_malloc\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included\nvar i64Math = null;\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "float-mm.c", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\n\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(20195);\n/* global initializers */ __ATINIT__.push();\n\n\n/* memory initializer */ allocate([], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;\n\n  \n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n   \n  Module[\"_memset\"] = _memset;\n\n   \n  Module[\"_strlen\"] = _strlen;\n\n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;\n\n  function _free() {\n  }\n  Module[\"_free\"] = _free;\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n\nvar Math_min = Math.min;\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=0;var n=0;var o=0;var p=0;var q=+env.NaN,r=+env.Infinity;var s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0;var B=0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=global.Math.floor;var M=global.Math.abs;var N=global.Math.sqrt;var O=global.Math.pow;var P=global.Math.cos;var Q=global.Math.sin;var R=global.Math.tan;var S=global.Math.acos;var T=global.Math.asin;var U=global.Math.atan;var V=global.Math.atan2;var W=global.Math.exp;var X=global.Math.log;var Y=global.Math.ceil;var Z=global.Math.imul;var _=env.abort;var $=env.assert;var aa=env.asmPrintInt;var ba=env.asmPrintFloat;var ca=env.min;var da=env._malloc;var ea=env._fflush;var fa=env._free;var ga=env._emscripten_memcpy_big;var ha=env.___setErrNo;var ia=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ja(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function ka(){return i|0}function la(a){a=a|0;i=a}function ma(a,b){a=a|0;b=b|0;if((m|0)==0){m=a;n=b}}function na(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function oa(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function pa(a){a=a|0;B=a}function qa(a){a=a|0;C=a}function ra(a){a=a|0;D=a}function sa(a){a=a|0;E=a}function ta(a){a=a|0;F=a}function ua(a){a=a|0;G=a}function va(a){a=a|0;H=a}function wa(a){a=a|0;I=a}function xa(a){a=a|0;J=a}function ya(a){a=a|0;K=a}function za(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0.0;a=i;c[2]=74755;b=74755;d=1;while(1){e=b;f=1;do{e=(e*1309|0)+13849&65535;g[16+(d*164|0)+(f<<2)>>2]=+(((e>>>0)%120|0)+ -60|0)/3.0;f=f+1|0;}while((f|0)!=41);f=d+1|0;if((f|0)==41){break}else{b=e;d=f}}c[2]=e;d=e;e=1;while(1){h=d;b=1;do{h=(h*1309|0)+13849&65535;g[6744+(e*164|0)+(b<<2)>>2]=+(((h>>>0)%120|0)+ -60|0)/3.0;b=b+1|0;}while((b|0)!=41);b=e+1|0;if((b|0)==41){break}else{d=h;e=b}}c[2]=h;h=1;do{e=1;do{d=13472+(h*164|0)+(e<<2)|0;g[d>>2]=0.0;j=0.0;b=1;do{j=j+ +g[16+(h*164|0)+(b<<2)>>2]*+g[6744+(b*164|0)+(e<<2)>>2];b=b+1|0;}while((b|0)!=41);g[d>>2]=j;e=e+1|0;}while((e|0)!=41);h=h+1|0;}while((h|0)!=41);i=a;return}function Aa(){var a=0,b=0;a=i;b=0;do{za(0);b=b+1|0;}while((b|0)!=5e3);i=a;return 0}function Ba(){}function Ca(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function Da(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function Ea(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return ga(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nreturn{_strlen:Da,_memcpy:Ea,_main:Aa,_memset:Ca,runPostSets:Ba,stackAlloc:ja,stackSave:ka,stackRestore:la,setThrew:ma,setTempRet0:pa,setTempRet1:qa,setTempRet2:ra,setTempRet3:sa,setTempRet4:ta,setTempRet5:ua,setTempRet6:va,setTempRet7:wa,setTempRet8:xa,setTempRet9:ya}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"_malloc\": _malloc, \"_fflush\": _fflush, \"_free\": _free, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"___setErrNo\": ___setErrNo, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"NaN\": NaN, \"Infinity\": Infinity }, buffer);\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included\nvar i64Math = null;\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "gcc-loops.cpp", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\nvar __ZTVN10__cxxabiv117__class_type_infoE = 238440;\nvar __ZTVN10__cxxabiv120__si_class_type_infoE = 238480;\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(239307);\n/* global initializers */ __ATINIT__.push({ func: function() { __GLOBAL__I_a() } });\n\n\n/* memory initializer */ allocate([], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n/* memory initializer */ allocate([69,120,97,109,112,108,101,49,0,0,0,0,0,0,0,0,69,120,97,109,112,108,101,50,97,0,0,0,0,0,0,0,69,120,97,109,112,108,101,50,98,0,0,0,0,0,0,0,69,120,97,109,112,108,101,51,0,0,0,0,0,0,0,0,69,120,97,109,112,108,101,52,97,0,0,0,0,0,0,0,69,120,97,109,112,108,101,52,98,0,0,0,0,0,0,0,69,120,97,109,112,108,101,52,99,0,0,0,0,0,0,0,69,120,97,109,112,108,101,55,0,0,0,0,0,0,0,0,69,120,97,109,112,108,101,56,0,0,0,0,0,0,0,0,69,120,97,109,112,108,101,57,0,0,0,0,0,0,0,0,69,120,97,109,112,108,101,49,48,97,0,0,0,0,0,0,69,120,97,109,112,108,101,49,48,98,0,0,0,0,0,0,69,120,97,109,112,108,101,49,49,0,0,0,0,0,0,0,69,120,97,109,112,108,101,49,50,0,0,0,0,0,0,0,69,120,97,109,112,108,101,50,51,0,0,0,0,0,0,0,69,120,97,109,112,108,101,50,52,0,0,0,0,0,0,0,69,120,97,109,112,108,101,50,53,0,0,0,0,0,0,0,82,101,115,117,108,116,115,58,32,40,0,0,0,0,0,0,41,58,0,0,0,0,0,0,32,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,44,32,0,0,0,0,0,0,44,32,109,115,101,99,10], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+225280);\n/* memory initializer */ allocate([216,117,3,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,119,69,69,0,0,0,0,0,0,0,0,152,163,3,0,184,117,3,0,8,124,3,0,0,0,0,0,0,0,0,0,64,118,3,0,3,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,6,0,0,0,7,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,119,69,69,0,152,163,3,0,40,118,3,0,8,124,3,0,0,0,0,0,117,110,115,117,112,112,111,114,116,101,100,32,108,111,99,97,108,101,32,102,111,114,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,0,0,0,0,0,0,0,216,118,3,0,5,0,0,0,6,0,0,0,3,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,8,0,0,0,9,0,0,0,6,0,0,0,10,0,0,0,11,0,0,0,5,0,0,0,7,0,0,0,6,0,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,99,69,69,0,0,0,0,0,0,0,0,152,163,3,0,184,118,3,0,200,123,3,0,0,0,0,0,0,0,0,0,64,119,3,0,7,0,0,0,8,0,0,0,4,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,12,0,0,0,9,0,0,0,6,0,0,0,13,0,0,0,14,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,99,69,69,0,152,163,3,0,40,119,3,0,200,123,3,0,0,0,0,0,78,83,116,51,95,95,49,49,52,95,95,115,104,97,114,101,100,95,99,111,117,110,116,69,0,0,0,0,0,0,0,0,112,163,3,0,80,119,3,0,0,0,0,0,184,119,3,0,9,0,0,0,10,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,32,120,3,0,11,0,0,0,12,0,0,0,16,0,0,0,0,0,0,0,83,116,49,49,108,111,103,105,99,95,101,114,114,111,114,0,152,163,3,0,168,119,3,0,0,0,0,0,0,0,0,0,0,0,0,0,248,119,3,0,9,0,0,0,13,0,0,0,15,0,0,0,0,0,0,0,83,116,49,50,108,101,110,103,116,104,95,101,114,114,111,114,0,0,0,0,0,0,0,0,152,163,3,0,224,119,3,0,184,119,3,0,0,0,0,0,83,116,49,51,114,117,110,116,105,109,101,95,101,114,114,111,114,0,0,0,0,0,0,0,152,163,3,0,8,120,3,0,0,0,0,0,0,0,0,0,58,32,0,0,0,0,0,0,0,0,0,0,104,120,3,0,14,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,50,115,121,115,116,101,109,95,101,114,114,111,114,69,0,0,152,163,3,0,80,120,3,0,32,120,3,0,0,0,0,0,78,83,116,51,95,95,49,49,52,101,114,114,111,114,95,99,97,116,101,103,111,114,121,69,0,0,0,0,0,0,0,0,112,163,3,0,120,120,3,0,78,83,116,51,95,95,49,49,50,95,95,100,111,95,109,101,115,115,97,103,101,69,0,0,152,163,3,0,160,120,3,0,152,120,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,97,115,105,99,95,115,116,114,105,110,103,0,0,0,0,0,0,0,0,200,123,3,0,16,0,0,0,17,0,0,0,5,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,12,0,0,0,9,0,0,0,6,0,0,0,10,0,0,0,11,0,0,0,5,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,8,124,3,0,18,0,0,0,19,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,5,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,4,0,0,0,8,0,0,0,0,0,0,0,64,124,3,0,20,0,0,0,21,0,0,0,248,255,255,255,248,255,255,255,64,124,3,0,22,0,0,0,23,0,0,0,8,0,0,0,0,0,0,0,136,124,3,0,24,0,0,0,25,0,0,0,248,255,255,255,248,255,255,255,136,124,3,0,26,0,0,0,27,0,0,0,4,0,0,0,0,0,0,0,208,124,3,0,28,0,0,0,29,0,0,0,252,255,255,255,252,255,255,255,208,124,3,0,30,0,0,0,31,0,0,0,4,0,0,0,0,0,0,0,24,125,3,0,32,0,0,0,33,0,0,0,252,255,255,255,252,255,255,255,24,125,3,0,34,0,0,0,35,0,0,0,105,111,115,116,114,101,97,109,0,0,0,0,0,0,0,0,117,110,115,112,101,99,105,102,105,101,100,32,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,32,101,114,114,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,122,3,0,36,0,0,0,37,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,8,123,3,0,38,0,0,0,39,0,0,0,105,111,115,95,98,97,115,101,58,58,99,108,101,97,114,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,55,102,97,105,108,117,114,101,69,0,0,0,0,0,0,0,152,163,3,0,192,122,3,0,104,120,3,0,0,0,0,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,69,0,0,0,0,0,0,0,112,163,3,0,240,122,3,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,0,0,0,0,0,152,163,3,0,16,123,3,0,8,123,3,0,0,0,0,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,0,0,0,0,0,152,163,3,0,80,123,3,0,8,123,3,0,0,0,0,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,0,0,0,0,0,0,112,163,3,0,144,123,3,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,0,0,0,0,0,0,112,163,3,0,208,123,3,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,248,163,3,0,16,124,3,0,0,0,0,0,1,0,0,0,64,123,3,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,248,163,3,0,88,124,3,0,0,0,0,0,1,0,0,0,128,123,3,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,0,248,163,3,0,160,124,3,0,0,0,0,0,1,0,0,0,64,123,3,0,3,244,255,255,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,0,248,163,3,0,232,124,3,0,0,0,0,0,1,0,0,0,128,123,3,0,3,244,255,255,0,0,0,0,120,125,3,0,40,0,0,0,41,0,0,0,17,0,0,0,1,0,0,0,9,0,0,0,10,0,0,0,2,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,57,95,95,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,69,0,0,0,152,163,3,0,88,125,3,0,184,120,3,0,0,0,0,0,0,0,0,0,160,139,3,0,42,0,0,0,43,0,0,0,44,0,0,0,1,0,0,0,3,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,139,3,0,45,0,0,0,46,0,0,0,44,0,0,0,2,0,0,0,4,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,144,3,0,47,0,0,0,48,0,0,0,44,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102,65,66,67,68,69,70,120,88,43,45,112,80,105,73,110,78,0,0,0,0,0,0,0,0,37,112,0,0,0,0,0,0,0,0,0,0,16,145,3,0,49,0,0,0,50,0,0,0,44,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,145,3,0,51,0,0,0,52,0,0,0,44,0,0,0,3,0,0,0,4,0,0,0,23,0,0,0,5,0,0,0,24,0,0,0,1,0,0,0,2,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,146,3,0,53,0,0,0,54,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,25,0,0,0,9,0,0,0,26,0,0,0,3,0,0,0,4,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,37,112,0,0,0,0,0,0,0,0,0,0,144,141,3,0,55,0,0,0,56,0,0,0,44,0,0,0,18,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,1,0,0,0,248,255,255,255,144,141,3,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,58,37,77,58,37,83,37,109,47,37,100,47,37,121,37,89,45,37,109,45,37,100,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,37,72,58,37,77,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,48,142,3,0,57,0,0,0,58,0,0,0,44,0,0,0,26,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,2,0,0,0,248,255,255,255,48,142,3,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,37,0,0,0,89,0,0,0,45,0,0,0,37,0,0,0,109,0,0,0,45,0,0,0,37,0,0,0,100,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,192,142,3,0,59,0,0,0,60,0,0,0,44,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,143,3,0,61,0,0,0,62,0,0,0,44,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,140,3,0,63,0,0,0,64,0,0,0,44,0,0,0,34,0,0,0,35,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,36,0,0,0,11,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,140,3,0,65,0,0,0,66,0,0,0,44,0,0,0,37,0,0,0,38,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,39,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,140,3,0,67,0,0,0,68,0,0,0,44,0,0,0,40,0,0,0,41,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,42,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,140,3,0,69,0,0,0,70,0,0,0,44,0,0,0,43,0,0,0,44,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,45,0,0,0,29,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,146,3,0,71,0,0,0,72,0,0,0,44,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,0,0,0,0,0,37,76,102,0,0,0,0,0,109,111,110,101,121,95,103,101,116,32,101,114,114,111,114,0,0,0,0,0,136,147,3,0,73,0,0,0,74,0,0,0,44,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,0,0,0,0,0,0,0,0,0,0,24,148,3,0,75,0,0,0,76,0,0,0,44,0,0,0,1,0,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,46,48,76,102,0,0,0,0,0,0,0,168,148,3,0,77,0,0,0,78,0,0,0,44,0,0,0,2,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,143,3,0,79,0,0,0,80,0,0,0,44,0,0,0,13,0,0,0,11,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,143,3,0,81,0,0,0,82,0,0,0,44,0,0,0,14,0,0,0,12,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,118,101,99,116,111,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,120,139,3,0,83,0,0,0,84,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,136,3,0,85,0,0,0,86,0,0,0,44,0,0,0,9,0,0,0,15,0,0,0,10,0,0,0,16,0,0,0,11,0,0,0,1,0,0,0,17,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,137,3,0,87,0,0,0,88,0,0,0,44,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,46,0,0,0,47,0,0,0,5,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,139,3,0,89,0,0,0,90,0,0,0,44,0,0,0,49,0,0,0,50,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,0,0,0,0,80,139,3,0,91,0,0,0,92,0,0,0,44,0,0,0,51,0,0,0,52,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,116,114,117,101,0,0,0,0,116,0,0,0,114,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,102,0,0,0,97,0,0,0,108,0,0,0,115,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,109,47,37,100,47,37,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,97,32,37,98,32,37,100,32,37,72,58,37,77,58,37,83,32,37,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,97,0,0,0,32,0,0,0,37,0,0,0,98,0,0,0,32,0,0,0,37,0,0,0,100,0,0,0,32,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,108,111,99,97,108,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,0,0,0,0,0,0,0,136,135,3,0,93,0,0,0,94,0,0,0,44,0,0,0,0,0,0,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,102,97,99,101,116,69,0,0,0,152,163,3,0,112,135,3,0,112,119,3,0,0,0,0,0,0,0,0,0,24,136,3,0,93,0,0,0,95,0,0,0,44,0,0,0,18,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,12,0,0,0,19,0,0,0,13,0,0,0,20,0,0,0,14,0,0,0,5,0,0,0,21,0,0,0,6,0,0,0,0,0,0,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,119,69,69,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,48,99,116,121,112,101,95,98,97,115,101,69,0,0,0,0,112,163,3,0,248,135,3,0,248,163,3,0,224,135,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,136,3,0,2,0,0,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,99,69,69,0,0,0,0,0,0,0,248,163,3,0,56,136,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,136,3,0,2,0,0,0,0,0,0,0,232,136,3,0,93,0,0,0,96,0,0,0,44,0,0,0,3,0,0,0,4,0,0,0,7,0,0,0,53,0,0,0,54,0,0,0,8,0,0,0,55,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,99,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,0,78,83,116,51,95,95,49,49,50,99,111,100,101,99,118,116,95,98,97,115,101,69,0,0,112,163,3,0,200,136,3,0,248,163,3,0,160,136,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,224,136,3,0,2,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,119,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,0,248,163,3,0,8,137,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,224,136,3,0,2,0,0,0,0,0,0,0,168,137,3,0,93,0,0,0,97,0,0,0,44,0,0,0,5,0,0,0,6,0,0,0,9,0,0,0,56,0,0,0,57,0,0,0,10,0,0,0,58,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,115,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,248,163,3,0,128,137,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,224,136,3,0,2,0,0,0,0,0,0,0,32,138,3,0,93,0,0,0,98,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,59,0,0,0,60,0,0,0,12,0,0,0,61,0,0,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,105,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,0,0,0,0,0,248,163,3,0,248,137,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,224,136,3,0,2,0,0,0,0,0,0,0,152,138,3,0,93,0,0,0,99,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,59,0,0,0,60,0,0,0,12,0,0,0,61,0,0,0,78,83,116,51,95,95,49,49,54,95,95,110,97,114,114,111,119,95,116,111,95,117,116,102,56,73,76,106,51,50,69,69,69,0,0,0,0,0,0,0,152,163,3,0,112,138,3,0,32,138,3,0,0,0,0,0,0,0,0,0,0,139,3,0,93,0,0,0,100,0,0,0,44,0,0,0,7,0,0,0,8,0,0,0,11,0,0,0,59,0,0,0,60,0,0,0,12,0,0,0,61,0,0,0,78,83,116,51,95,95,49,49,55,95,95,119,105,100,101,110,95,102,114,111,109,95,117,116,102,56,73,76,106,51,50,69,69,69,0,0,0,0,0,0,152,163,3,0,216,138,3,0,32,138,3,0,0,0,0,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,99,69,69,0,0,0,0,152,163,3,0,16,139,3,0,136,135,3,0,0,0,0,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,119,69,69,0,0,0,0,152,163,3,0,56,139,3,0,136,135,3,0,0,0,0,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,95,95,105,109,112,69,0,0,0,152,163,3,0,96,139,3,0,136,135,3,0,0,0,0,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,99,69,69,0,0,0,0,0,152,163,3,0,136,139,3,0,136,135,3,0,0,0,0,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,119,69,69,0,0,0,0,0,152,163,3,0,176,139,3,0,136,135,3,0,0,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,48,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,95,98,97,115,101,69,0,0,0,0,112,163,3,0,248,139,3,0,248,163,3,0,216,139,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,140,3,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,49,69,69,69,0,0,0,0,0,248,163,3,0,56,140,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,140,3,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,48,69,69,69,0,0,0,0,0,248,163,3,0,120,140,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,140,3,0,2,0,0,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,49,69,69,69,0,0,0,0,0,248,163,3,0,184,140,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,140,3,0,2,0,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,57,116,105,109,101,95,98,97,115,101,69,0,0,0,0,0,0,112,163,3,0,64,141,3,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,99,69,69,0,0,0,0,0,0,0,112,163,3,0,96,141,3,0,248,163,3,0,248,140,3,0,0,0,0,0,3,0,0,0,136,135,3,0,2,0,0,0,88,141,3,0,2,0,0,0,136,141,3,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,119,69,69,0,0,0,0,0,0,0,112,163,3,0,0,142,3,0,248,163,3,0,184,141,3,0,0,0,0,0,3,0,0,0,136,135,3,0,2,0,0,0,88,141,3,0,2,0,0,0,40,142,3,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,78,83,116,51,95,95,49,49,48,95,95,116,105,109,101,95,112,117,116,69,0,0,0,0,112,163,3,0,160,142,3,0,248,163,3,0,88,142,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,184,142,3,0,0,8,0,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,248,163,3,0,224,142,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,184,142,3,0,0,8,0,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,99,69,69,0,0,0,0,78,83,116,51,95,95,49,49,51,109,101,115,115,97,103,101,115,95,98,97,115,101,69,0,112,163,3,0,96,143,3,0,248,163,3,0,72,143,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,120,143,3,0,2,0,0,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,119,69,69,0,0,0,0,248,163,3,0,160,143,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,120,143,3,0,2,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,99,69,69,0,0,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,103,101,116,95,98,97,115,101,69,0,0,0,0,0,0,0,0,112,163,3,0,56,144,3,0,248,163,3,0,32,144,3,0,0,0,0,0,1,0,0,0,88,144,3,0,0,0,0,0,248,163,3,0,216,143,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,96,144,3,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,119,69,69,0,0,0,248,163,3,0,224,144,3,0,0,0,0,0,1,0,0,0,88,144,3,0,0,0,0,0,248,163,3,0,152,144,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,248,144,3,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,99,69,69,0,0,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,112,117,116,95,98,97,115,101,69,0,0,0,0,0,0,0,0,112,163,3,0,144,145,3,0,248,163,3,0,120,145,3,0,0,0,0,0,1,0,0,0,176,145,3,0,0,0,0,0,248,163,3,0,48,145,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,184,145,3,0,0,0,0,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,0,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,119,69,69,0,0,0,248,163,3,0,56,146,3,0,0,0,0,0,1,0,0,0,176,145,3,0,0,0,0,0,248,163,3,0,240,145,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,80,146,3,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,99,69,69,0,0,0,0,0,0,0,0,112,163,3,0,208,146,3,0,248,163,3,0,136,146,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,240,146,3,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,119,69,69,0,0,0,0,0,0,0,0,112,163,3,0,96,147,3,0,248,163,3,0,24,147,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,128,147,3,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,99,69,69,0,0,0,0,0,0,0,0,112,163,3,0,240,147,3,0,248,163,3,0,168,147,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,16,148,3,0,0,0,0,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,0,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,119,69,69,0,0,0,0,0,0,0,0,112,163,3,0,128,148,3,0,248,163,3,0,56,148,3,0,0,0,0,0,2,0,0,0,136,135,3,0,2,0,0,0,160,148,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,77,0,0,0,0,0,0,80,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,114,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,99,0,0,0,104,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,105,0,0,0,108,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,117,0,0,0,115,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,116,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,111,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+226676);\n/* memory initializer */ allocate([74,97,110,117,97,114,121,0,70,101,98,114,117,97,114,121,0,0,0,0,0,0,0,0,77,97,114,99,104,0,0,0,65,112,114,105,108,0,0,0,77,97,121,0,0,0,0,0,74,117,110,101,0,0,0,0,74,117,108,121,0,0,0,0,65,117,103,117,115,116,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,78,111,118,101,109,98,101,114,0,0,0,0,0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,0,0,0,0,74,97,110,0,0,0,0,0,70,101,98,0,0,0,0,0,77,97,114,0,0,0,0,0,65,112,114,0,0,0,0,0,74,117,110,0,0,0,0,0,74,117,108,0,0,0,0,0,65,117,103,0,0,0,0,0,83,101,112,0,0,0,0,0,79,99,116,0,0,0,0,0,78,111,118,0,0,0,0,0,68,101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,110,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,114,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,117,0,0,0,114,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,117,110,100,97,121,0,0,77,111,110,100,97,121,0,0,84,117,101,115,100,97,121,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,0,0,0,0,70,114,105,100,97,121,0,0,83,97,116,117,114,100,97,121,0,0,0,0,0,0,0,0,83,117,110,0,0,0,0,0,77,111,110,0,0,0,0,0,84,117,101,0,0,0,0,0,87,101,100,0,0,0,0,0,84,104,117,0,0,0,0,0,70,114,105,0,0,0,0,0,83,97,116,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,162,3,0,101,0,0,0,102,0,0,0,62,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,99,97,115,116,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,112,163,3,0,192,162,3,0,83,116,56,98,97,100,95,99,97,115,116,0,0,0,0,0,152,163,3,0,216,162,3,0,0,0,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,152,163,3,0,248,162,3,0,208,162,3,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,152,163,3,0,48,163,3,0,32,163,3,0,0,0,0,0,0,0,0,0,88,163,3,0,103,0,0,0,104,0,0,0,105,0,0,0,106,0,0,0,22,0,0,0,13,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,224,163,3,0,103,0,0,0,107,0,0,0,105,0,0,0,106,0,0,0,22,0,0,0,14,0,0,0,2,0,0,0,6,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,152,163,3,0,184,163,3,0,88,163,3,0,0,0,0,0,0,0,0,0,64,164,3,0,103,0,0,0,108,0,0,0,105,0,0,0,106,0,0,0,22,0,0,0,15,0,0,0,3,0,0,0,7,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,152,163,3,0,24,164,3,0,88,163,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,166,3,0,109,0,0,0,110,0,0,0,63,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,152,163,3,0,112,166,3,0,0,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,110,97,110,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+236936);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  function _llvm_lifetime_end() {}\n\n  \n  function _atexit(func, arg) {\n      __ATEXIT__.unshift({ func: func, arg: arg });\n    }var ___cxa_atexit=_atexit;\n\n  \n   \n  Module[\"_memset\"] = _memset;var _llvm_memset_p0i8_i32=_memset;\n\n   \n  Module[\"_i64Subtract\"] = _i64Subtract;\n\n   \n  Module[\"_i64Add\"] = _i64Add;\n\n  \n  function __ZSt18uncaught_exceptionv() { // std::uncaught_exception()\n      return !!__ZSt18uncaught_exceptionv.uncaught_exception;\n    }\n  \n  \n  \n  function ___cxa_is_number_type(type) {\n      var isNumber = false;\n      try { if (type == __ZTIi) isNumber = true } catch(e){}\n      try { if (type == __ZTIj) isNumber = true } catch(e){}\n      try { if (type == __ZTIl) isNumber = true } catch(e){}\n      try { if (type == __ZTIm) isNumber = true } catch(e){}\n      try { if (type == __ZTIx) isNumber = true } catch(e){}\n      try { if (type == __ZTIy) isNumber = true } catch(e){}\n      try { if (type == __ZTIf) isNumber = true } catch(e){}\n      try { if (type == __ZTId) isNumber = true } catch(e){}\n      try { if (type == __ZTIe) isNumber = true } catch(e){}\n      try { if (type == __ZTIc) isNumber = true } catch(e){}\n      try { if (type == __ZTIa) isNumber = true } catch(e){}\n      try { if (type == __ZTIh) isNumber = true } catch(e){}\n      try { if (type == __ZTIs) isNumber = true } catch(e){}\n      try { if (type == __ZTIt) isNumber = true } catch(e){}\n      return isNumber;\n    }function ___cxa_does_inherit(definiteType, possibilityType, possibility) {\n      if (possibility == 0) return false;\n      if (possibilityType == 0 || possibilityType == definiteType)\n        return true;\n      var possibility_type_info;\n      if (___cxa_is_number_type(possibilityType)) {\n        possibility_type_info = possibilityType;\n      } else {\n        var possibility_type_infoAddr = HEAP32[((possibilityType)>>2)] - 8;\n        possibility_type_info = HEAP32[((possibility_type_infoAddr)>>2)];\n      }\n      switch (possibility_type_info) {\n      case 0: // possibility is a pointer\n        // See if definite type is a pointer\n        var definite_type_infoAddr = HEAP32[((definiteType)>>2)] - 8;\n        var definite_type_info = HEAP32[((definite_type_infoAddr)>>2)];\n        if (definite_type_info == 0) {\n          // Also a pointer; compare base types of pointers\n          var defPointerBaseAddr = definiteType+8;\n          var defPointerBaseType = HEAP32[((defPointerBaseAddr)>>2)];\n          var possPointerBaseAddr = possibilityType+8;\n          var possPointerBaseType = HEAP32[((possPointerBaseAddr)>>2)];\n          return ___cxa_does_inherit(defPointerBaseType, possPointerBaseType, possibility);\n        } else\n          return false; // one pointer and one non-pointer\n      case 1: // class with no base class\n        return false;\n      case 2: // class with base class\n        var parentTypeAddr = possibilityType + 8;\n        var parentType = HEAP32[((parentTypeAddr)>>2)];\n        return ___cxa_does_inherit(definiteType, parentType, possibility);\n      default:\n        return false; // some unencountered type\n      }\n    }\n  \n  \n  \n  var ___cxa_last_thrown_exception=0;function ___resumeException(ptr) {\n      if (!___cxa_last_thrown_exception) { ___cxa_last_thrown_exception = ptr; }\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n  \n  var ___cxa_exception_header_size=8;function ___cxa_find_matching_catch(thrown, throwntype) {\n      if (thrown == -1) thrown = ___cxa_last_thrown_exception;\n      header = thrown - ___cxa_exception_header_size;\n      if (throwntype == -1) throwntype = HEAP32[((header)>>2)];\n      var typeArray = Array.prototype.slice.call(arguments, 2);\n  \n      // If throwntype is a pointer, this means a pointer has been\n      // thrown. When a pointer is thrown, actually what's thrown\n      // is a pointer to the pointer. We'll dereference it.\n      if (throwntype != 0 && !___cxa_is_number_type(throwntype)) {\n        var throwntypeInfoAddr= HEAP32[((throwntype)>>2)] - 8;\n        var throwntypeInfo= HEAP32[((throwntypeInfoAddr)>>2)];\n        if (throwntypeInfo == 0)\n          thrown = HEAP32[((thrown)>>2)];\n      }\n      // The different catch blocks are denoted by different types.\n      // Due to inheritance, those types may not precisely match the\n      // type of the thrown object. Find one which matches, and\n      // return the type of the catch block which should be called.\n      for (var i = 0; i < typeArray.length; i++) {\n        if (___cxa_does_inherit(typeArray[i], throwntype, thrown))\n          return ((asm[\"setTempRet0\"](typeArray[i]),thrown)|0);\n      }\n      // Shouldn't happen unless we have bogus data in typeArray\n      // or encounter a type for which emscripten doesn't have suitable\n      // typeinfo defined. Best-efforts match just in case.\n      return ((asm[\"setTempRet0\"](throwntype),thrown)|0);\n    }function ___cxa_throw(ptr, type, destructor) {\n      if (!___cxa_throw.initialized) {\n        try {\n          HEAP32[((__ZTVN10__cxxabiv119__pointer_type_infoE)>>2)]=0; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        try {\n          HEAP32[((__ZTVN10__cxxabiv117__class_type_infoE)>>2)]=1; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        try {\n          HEAP32[((__ZTVN10__cxxabiv120__si_class_type_infoE)>>2)]=2; // Workaround for libcxxabi integration bug\n        } catch(e){}\n        ___cxa_throw.initialized = true;\n      }\n      var header = ptr - ___cxa_exception_header_size;\n      HEAP32[((header)>>2)]=type;\n      HEAP32[(((header)+(4))>>2)]=destructor;\n      ___cxa_last_thrown_exception = ptr;\n      if (!(\"uncaught_exception\" in __ZSt18uncaught_exceptionv)) {\n        __ZSt18uncaught_exceptionv.uncaught_exception = 1;\n      } else {\n        __ZSt18uncaught_exceptionv.uncaught_exception++;\n      }\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n\n  function _pthread_mutex_lock() {}\n\n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }\n\n  \n  \n  \n  function _isspace(chr) {\n      return (chr == 32) || (chr >= 9 && chr <= 13);\n    }\n  function __parseInt64(str, endptr, base, min, max, unsign) {\n      var isNegative = false;\n      // Skip space.\n      while (_isspace(HEAP8[(str)])) str++;\n  \n      // Check for a plus/minus sign.\n      if (HEAP8[(str)] == 45) {\n        str++;\n        isNegative = true;\n      } else if (HEAP8[(str)] == 43) {\n        str++;\n      }\n  \n      // Find base.\n      var ok = false;\n      var finalBase = base;\n      if (!finalBase) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            finalBase = 16;\n            str += 2;\n          } else {\n            finalBase = 8;\n            ok = true; // we saw an initial zero, perhaps the entire thing is just \"0\"\n          }\n        }\n      } else if (finalBase==16) {\n        if (HEAP8[(str)] == 48) {\n          if (HEAP8[((str+1)|0)] == 120 ||\n              HEAP8[((str+1)|0)] == 88) {\n            str += 2;\n          }\n        }\n      }\n      if (!finalBase) finalBase = 10;\n      var start = str;\n  \n      // Get digits.\n      var chr;\n      while ((chr = HEAP8[(str)]) != 0) {\n        var digit = parseInt(String.fromCharCode(chr), finalBase);\n        if (isNaN(digit)) {\n          break;\n        } else {\n          str++;\n          ok = true;\n        }\n      }\n  \n      if (!ok) {\n        ___setErrNo(ERRNO_CODES.EINVAL);\n        return ((asm[\"setTempRet0\"](0),0)|0);\n      }\n  \n      // Set end pointer.\n      if (endptr) {\n        HEAP32[((endptr)>>2)]=str;\n      }\n  \n      try {\n        var numberString = isNegative ? '-'+Pointer_stringify(start, str - start) : Pointer_stringify(start, str - start);\n        i64Math.fromString(numberString, finalBase, min, max, unsign);\n      } catch(e) {\n        ___setErrNo(ERRNO_CODES.ERANGE); // not quite correct\n      }\n  \n      return ((asm[\"setTempRet0\"](((HEAP32[(((tempDoublePtr)+(4))>>2)])|0)),((HEAP32[((tempDoublePtr)>>2)])|0))|0);\n    }function _strtoull(str, endptr, base) {\n      return __parseInt64(str, endptr, base, 0, '18446744073709551615', true);  // ULONG_MAX.\n    }function _strtoull_l(str, endptr, base) {\n      return _strtoull(str, endptr, base); // no locale support yet\n    }\n\n  function _sysconf(name) {\n      // long sysconf(int name);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html\n      switch(name) {\n        case 30: return PAGE_SIZE;\n        case 132:\n        case 133:\n        case 12:\n        case 137:\n        case 138:\n        case 15:\n        case 235:\n        case 16:\n        case 17:\n        case 18:\n        case 19:\n        case 20:\n        case 149:\n        case 13:\n        case 10:\n        case 236:\n        case 153:\n        case 9:\n        case 21:\n        case 22:\n        case 159:\n        case 154:\n        case 14:\n        case 77:\n        case 78:\n        case 139:\n        case 80:\n        case 81:\n        case 79:\n        case 82:\n        case 68:\n        case 67:\n        case 164:\n        case 11:\n        case 29:\n        case 47:\n        case 48:\n        case 95:\n        case 52:\n        case 51:\n        case 46:\n          return 200809;\n        case 27:\n        case 246:\n        case 127:\n        case 128:\n        case 23:\n        case 24:\n        case 160:\n        case 161:\n        case 181:\n        case 182:\n        case 242:\n        case 183:\n        case 184:\n        case 243:\n        case 244:\n        case 245:\n        case 165:\n        case 178:\n        case 179:\n        case 49:\n        case 50:\n        case 168:\n        case 169:\n        case 175:\n        case 170:\n        case 171:\n        case 172:\n        case 97:\n        case 76:\n        case 32:\n        case 173:\n        case 35:\n          return -1;\n        case 176:\n        case 177:\n        case 7:\n        case 155:\n        case 8:\n        case 157:\n        case 125:\n        case 126:\n        case 92:\n        case 93:\n        case 129:\n        case 130:\n        case 131:\n        case 94:\n        case 91:\n          return 1;\n        case 74:\n        case 60:\n        case 69:\n        case 70:\n        case 4:\n          return 1024;\n        case 31:\n        case 42:\n        case 72:\n          return 32;\n        case 87:\n        case 26:\n        case 33:\n          return 2147483647;\n        case 34:\n        case 1:\n          return 47839;\n        case 38:\n        case 36:\n          return 99;\n        case 43:\n        case 37:\n          return 2048;\n        case 0: return 2097152;\n        case 3: return 65536;\n        case 28: return 32768;\n        case 44: return 32767;\n        case 75: return 16384;\n        case 39: return 1000;\n        case 89: return 700;\n        case 71: return 256;\n        case 40: return 255;\n        case 2: return 100;\n        case 180: return 64;\n        case 25: return 20;\n        case 5: return 16;\n        case 6: return 6;\n        case 73: return 4;\n        case 84: return 1;\n      }\n      ___setErrNo(ERRNO_CODES.EINVAL);\n      return -1;\n    }\n\n  \n  \n  \n  \n  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {\n        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createSocket:function (family, type, protocol) {\n        var streaming = type == 1;\n        if (protocol) {\n          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp\n        }\n  \n        // create our internal socket structure\n        var sock = {\n          family: family,\n          type: type,\n          protocol: protocol,\n          server: null,\n          peers: {},\n          pending: [],\n          recv_queue: [],\n          sock_ops: SOCKFS.websocket_sock_ops\n        };\n  \n        // create the filesystem node to store the socket structure\n        var name = SOCKFS.nextname();\n        var node = FS.createNode(SOCKFS.root, name, 49152, 0);\n        node.sock = sock;\n  \n        // and the wrapping stream that enables library functions such\n        // as read and write to indirectly interact with the socket\n        var stream = FS.createStream({\n          path: name,\n          node: node,\n          flags: FS.modeStringToFlags('r+'),\n          seekable: false,\n          stream_ops: SOCKFS.stream_ops\n        });\n  \n        // map the new stream to the socket structure (sockets have a 1:1\n        // relationship with a stream)\n        sock.stream = stream;\n  \n        return sock;\n      },getSocket:function (fd) {\n        var stream = FS.getStream(fd);\n        if (!stream || !FS.isSocket(stream.node.mode)) {\n          return null;\n        }\n        return stream.node.sock;\n      },stream_ops:{poll:function (stream) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.poll(sock);\n        },ioctl:function (stream, request, varargs) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.ioctl(sock, request, varargs);\n        },read:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          var msg = sock.sock_ops.recvmsg(sock, length);\n          if (!msg) {\n            // socket is closed\n            return 0;\n          }\n          buffer.set(msg.buffer, offset);\n          return msg.buffer.length;\n        },write:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.sendmsg(sock, buffer, offset, length);\n        },close:function (stream) {\n          var sock = stream.node.sock;\n          sock.sock_ops.close(sock);\n        }},nextname:function () {\n        if (!SOCKFS.nextname.current) {\n          SOCKFS.nextname.current = 0;\n        }\n        return 'socket[' + (SOCKFS.nextname.current++) + ']';\n      },websocket_sock_ops:{createPeer:function (sock, addr, port) {\n          var ws;\n  \n          if (typeof addr === 'object') {\n            ws = addr;\n            addr = null;\n            port = null;\n          }\n  \n          if (ws) {\n            // for sockets that've already connected (e.g. we're the server)\n            // we can inspect the _socket property for the address\n            if (ws._socket) {\n              addr = ws._socket.remoteAddress;\n              port = ws._socket.remotePort;\n            }\n            // if we're just now initializing a connection to the remote,\n            // inspect the url property\n            else {\n              var result = /ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);\n              if (!result) {\n                throw new Error('WebSocket URL must be in the format ws(s)://address:port');\n              }\n              addr = result[1];\n              port = parseInt(result[2], 10);\n            }\n          } else {\n            // create the actual websocket object and connect\n            try {\n              var url = 'ws://' + addr + ':' + port;\n              // the node ws library API is slightly different than the browser's\n              var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];\n              // If node we use the ws library.\n              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];\n              ws = new WebSocket(url, opts);\n              ws.binaryType = 'arraybuffer';\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);\n            }\n          }\n  \n  \n          var peer = {\n            addr: addr,\n            port: port,\n            socket: ws,\n            dgram_send_queue: []\n          };\n  \n          SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);\n  \n          // if this is a bound dgram socket, send the port number first to allow\n          // us to override the ephemeral port reported to us by remotePort on the\n          // remote end.\n          if (sock.type === 2 && typeof sock.sport !== 'undefined') {\n            peer.dgram_send_queue.push(new Uint8Array([\n                255, 255, 255, 255,\n                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),\n                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)\n            ]));\n          }\n  \n          return peer;\n        },getPeer:function (sock, addr, port) {\n          return sock.peers[addr + ':' + port];\n        },addPeer:function (sock, peer) {\n          sock.peers[peer.addr + ':' + peer.port] = peer;\n        },removePeer:function (sock, peer) {\n          delete sock.peers[peer.addr + ':' + peer.port];\n        },handlePeerEvents:function (sock, peer) {\n          var first = true;\n  \n          var handleOpen = function () {\n            try {\n              var queued = peer.dgram_send_queue.shift();\n              while (queued) {\n                peer.socket.send(queued);\n                queued = peer.dgram_send_queue.shift();\n              }\n            } catch (e) {\n              // not much we can do here in the way of proper error handling as we've already\n              // lied and said this data was sent. shut it down.\n              peer.socket.close();\n            }\n          };\n  \n          function handleMessage(data) {\n            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer\n            data = new Uint8Array(data);  // make a typed array view on the array buffer\n  \n  \n            // if this is the port message, override the peer's port with it\n            var wasfirst = first;\n            first = false;\n            if (wasfirst &&\n                data.length === 10 &&\n                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&\n                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {\n              // update the peer's port and it's key in the peer map\n              var newport = ((data[8] << 8) | data[9]);\n              SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n              peer.port = newport;\n              SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n              return;\n            }\n  \n            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });\n          };\n  \n          if (ENVIRONMENT_IS_NODE) {\n            peer.socket.on('open', handleOpen);\n            peer.socket.on('message', function(data, flags) {\n              if (!flags.binary) {\n                return;\n              }\n              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer\n            });\n            peer.socket.on('error', function() {\n              // don't throw\n            });\n          } else {\n            peer.socket.onopen = handleOpen;\n            peer.socket.onmessage = function peer_socket_onmessage(event) {\n              handleMessage(event.data);\n            };\n          }\n        },poll:function (sock) {\n          if (sock.type === 1 && sock.server) {\n            // listen sockets should only say they're available for reading\n            // if there are pending clients.\n            return sock.pending.length ? (64 | 1) : 0;\n          }\n  \n          var mask = 0;\n          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets\n            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :\n            null;\n  \n          if (sock.recv_queue.length ||\n              !dest ||  // connection-less sockets are always ready to read\n              (dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed\n            mask |= (64 | 1);\n          }\n  \n          if (!dest ||  // connection-less sockets are always ready to write\n              (dest && dest.socket.readyState === dest.socket.OPEN)) {\n            mask |= 4;\n          }\n  \n          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {\n            mask |= 16;\n          }\n  \n          return mask;\n        },ioctl:function (sock, request, arg) {\n          switch (request) {\n            case 21531:\n              var bytes = 0;\n              if (sock.recv_queue.length) {\n                bytes = sock.recv_queue[0].data.length;\n              }\n              HEAP32[((arg)>>2)]=bytes;\n              return 0;\n            default:\n              return ERRNO_CODES.EINVAL;\n          }\n        },close:function (sock) {\n          // if we've spawned a listen server, close it\n          if (sock.server) {\n            try {\n              sock.server.close();\n            } catch (e) {\n            }\n            sock.server = null;\n          }\n          // close any peer connections\n          var peers = Object.keys(sock.peers);\n          for (var i = 0; i < peers.length; i++) {\n            var peer = sock.peers[peers[i]];\n            try {\n              peer.socket.close();\n            } catch (e) {\n            }\n            SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n          }\n          return 0;\n        },bind:function (sock, addr, port) {\n          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound\n          }\n          sock.saddr = addr;\n          sock.sport = port || _mkport();\n          // in order to emulate dgram sockets, we need to launch a listen server when\n          // binding on a connection-less socket\n          // note: this is only required on the server side\n          if (sock.type === 2) {\n            // close the existing server if it exists\n            if (sock.server) {\n              sock.server.close();\n              sock.server = null;\n            }\n            // swallow error operation not supported error that occurs when binding in the\n            // browser where this isn't supported\n            try {\n              sock.sock_ops.listen(sock, 0);\n            } catch (e) {\n              if (!(e instanceof FS.ErrnoError)) throw e;\n              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;\n            }\n          }\n        },connect:function (sock, addr, port) {\n          if (sock.server) {\n            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);\n          }\n  \n          // TODO autobind\n          // if (!sock.addr && sock.type == 2) {\n          // }\n  \n          // early out if we're already connected / in the middle of connecting\n          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {\n            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n            if (dest) {\n              if (dest.socket.readyState === dest.socket.CONNECTING) {\n                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);\n              } else {\n                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);\n              }\n            }\n          }\n  \n          // add the socket to our peer list and set our\n          // destination address / port to match\n          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n          sock.daddr = peer.addr;\n          sock.dport = peer.port;\n  \n          // always \"fail\" in non-blocking mode\n          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);\n        },listen:function (sock, backlog) {\n          if (!ENVIRONMENT_IS_NODE) {\n            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n          }\n          if (sock.server) {\n             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening\n          }\n          var WebSocketServer = require('ws').Server;\n          var host = sock.saddr;\n          sock.server = new WebSocketServer({\n            host: host,\n            port: sock.sport\n            // TODO support backlog\n          });\n  \n          sock.server.on('connection', function(ws) {\n            if (sock.type === 1) {\n              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);\n  \n              // create a peer on the new socket\n              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);\n              newsock.daddr = peer.addr;\n              newsock.dport = peer.port;\n  \n              // push to queue for accept to pick up\n              sock.pending.push(newsock);\n            } else {\n              // create a peer on the listen socket so calling sendto\n              // with the listen socket and an address will resolve\n              // to the correct client\n              SOCKFS.websocket_sock_ops.createPeer(sock, ws);\n            }\n          });\n          sock.server.on('closed', function() {\n            sock.server = null;\n          });\n          sock.server.on('error', function() {\n            // don't throw\n          });\n        },accept:function (listensock) {\n          if (!listensock.server) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          var newsock = listensock.pending.shift();\n          newsock.stream.flags = listensock.stream.flags;\n          return newsock;\n        },getname:function (sock, peer) {\n          var addr, port;\n          if (peer) {\n            if (sock.daddr === undefined || sock.dport === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            }\n            addr = sock.daddr;\n            port = sock.dport;\n          } else {\n            // TODO saddr and sport will be set for bind()'d UDP sockets, but what\n            // should we be returning for TCP sockets that've been connect()'d?\n            addr = sock.saddr || 0;\n            port = sock.sport || 0;\n          }\n          return { addr: addr, port: port };\n        },sendmsg:function (sock, buffer, offset, length, addr, port) {\n          if (sock.type === 2) {\n            // connection-less sockets will honor the message address,\n            // and otherwise fall back to the bound destination address\n            if (addr === undefined || port === undefined) {\n              addr = sock.daddr;\n              port = sock.dport;\n            }\n            // if there was no address to fall back to, error out\n            if (addr === undefined || port === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);\n            }\n          } else {\n            // connection-based sockets will only use the bound\n            addr = sock.daddr;\n            port = sock.dport;\n          }\n  \n          // find the peer for the destination address\n          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);\n  \n          // early out if not connected with a connection-based socket\n          if (sock.type === 1) {\n            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            } else if (dest.socket.readyState === dest.socket.CONNECTING) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // create a copy of the incoming data to send, as the WebSocket API\n          // doesn't work entirely with an ArrayBufferView, it'll just send\n          // the entire underlying buffer\n          var data;\n          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {\n            data = buffer.slice(offset, offset + length);\n          } else {  // ArrayBufferView\n            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);\n          }\n  \n          // if we're emulating a connection-less dgram socket and don't have\n          // a cached connection, queue the buffer to send upon connect and\n          // lie, saying the data was sent now.\n          if (sock.type === 2) {\n            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {\n              // if we're not connected, open a new connection\n              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n              }\n              dest.dgram_send_queue.push(data);\n              return length;\n            }\n          }\n  \n          try {\n            // send the actual data\n            dest.socket.send(data);\n            return length;\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n        },recvmsg:function (sock, length) {\n          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html\n          if (sock.type === 1 && sock.server) {\n            // tcp servers should not be recv()'ing on the listen socket\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n          }\n  \n          var queued = sock.recv_queue.shift();\n          if (!queued) {\n            if (sock.type === 1) {\n              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n  \n              if (!dest) {\n                // if we have a destination address but are not connected, error out\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n              }\n              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                // return null if the socket has closed\n                return null;\n              }\n              else {\n                // else, our socket is in a valid state but truly has nothing available\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n            } else {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's\n          // requeued TCP data it'll be an ArrayBufferView\n          var queuedLength = queued.data.byteLength || queued.data.length;\n          var queuedOffset = queued.data.byteOffset || 0;\n          var queuedBuffer = queued.data.buffer || queued.data;\n          var bytesRead = Math.min(length, queuedLength);\n          var res = {\n            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),\n            addr: queued.addr,\n            port: queued.port\n          };\n  \n  \n          // push back any unread data for TCP connections\n          if (sock.type === 1 && bytesRead < queuedLength) {\n            var bytesRemaining = queuedLength - bytesRead;\n            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);\n            sock.recv_queue.unshift(queued);\n          }\n  \n          return res;\n        }}};function _send(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _write(fd, buf, len);\n    }\n  \n  function _pwrite(fildes, buf, nbyte, offset) {\n      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _write(fildes, buf, nbyte) {\n      // ssize_t write(int fildes, const void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }\n  \n  function _fileno(stream) {\n      // int fileno(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) return -1;\n      return stream.fd;\n    }function _fwrite(ptr, size, nitems, stream) {\n      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html\n      var bytesToWrite = nitems * size;\n      if (bytesToWrite == 0) return 0;\n      var fd = _fileno(stream);\n      var bytesWritten = _write(fd, ptr, bytesToWrite);\n      if (bytesWritten == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return 0;\n      } else {\n        return Math.floor(bytesWritten / size);\n      }\n    }\n\n  \n  function _strtoll(str, endptr, base) {\n      return __parseInt64(str, endptr, base, '-9223372036854775808', '9223372036854775807');  // LLONG_MIN, LLONG_MAX.\n    }function _strtoll_l(str, endptr, base) {\n      return _strtoll(str, endptr, base); // no locale support yet\n    }\n\n\n  \n  \n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy; \n  Module[\"_memmove\"] = _memmove;var _llvm_memmove_p0i8_p0i8_i32=_memmove;\n\n  function _pthread_cond_broadcast() {\n      return 0;\n    }\n\n  \n  \n  function __exit(status) {\n      // void _exit(int status);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html\n      Module['exit'](status);\n    }function _exit(status) {\n      __exit(status);\n    }function __ZSt9terminatev() {\n      _exit(-1234);\n    }\n\n  function _gettimeofday(ptr) {\n      var now = Date.now();\n      HEAP32[((ptr)>>2)]=Math.floor(now/1000); // seconds\n      HEAP32[(((ptr)+(4))>>2)]=Math.floor((now-1000*Math.floor(now/1000))*1000); // microseconds\n      return 0;\n    }\n\n  function _pthread_mutex_unlock() {}\n\n  \n  function _isxdigit(chr) {\n      return (chr >= 48 && chr <= 57) ||\n             (chr >= 97 && chr <= 102) ||\n             (chr >= 65 && chr <= 70);\n    }function _isxdigit_l(chr) {\n      return _isxdigit(chr); // no locale support yet\n    }\n\n\n  function _sbrk(bytes) {\n      // Implement a Linux-like 'memory area' for our 'process'.\n      // Changes the size of the memory area by |bytes|; returns the\n      // address of the previous top ('break') of the memory area\n      // We control the \"dynamic\" memory - DYNAMIC_BASE to DYNAMICTOP\n      var self = _sbrk;\n      if (!self.called) {\n        DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned\n        self.called = true;\n        assert(Runtime.dynamicAlloc);\n        self.alloc = Runtime.dynamicAlloc;\n        Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') };\n      }\n      var ret = DYNAMICTOP;\n      if (bytes != 0) self.alloc(bytes);\n      return ret;  // Previous break location.\n    }\n\n\n  \n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;function _newlocale(mask, locale, base) {\n      return _malloc(4);\n    }\n\n\n  function ___errno_location() {\n      return ___errno_state;\n    }\n\n  var _BItoD=true;\n\n  function _catclose(catd) {\n      // int catclose (nl_catd catd)\n      return 0;\n    }\n\n  \n  \n  \n  function _free() {\n  }\n  Module[\"_free\"] = _free;function ___cxa_free_exception(ptr) {\n      try {\n        return _free(ptr - ___cxa_exception_header_size);\n      } catch(e) { // XXX FIXME\n      }\n    }\n  \n  var ___cxa_caught_exceptions=[];function ___cxa_end_catch() {\n      if (___cxa_end_catch.rethrown) {\n        ___cxa_end_catch.rethrown = false;\n        return;\n      }\n      // Clear state flag.\n      asm['setThrew'](0);\n      // Call destructor if one is registered then clear it.\n      var ptr = ___cxa_caught_exceptions.pop();\n      if (ptr) {\n        header = ptr - ___cxa_exception_header_size;\n        var destructor = HEAP32[(((header)+(4))>>2)];\n        if (destructor) {\n          Runtime.dynCall('vi', destructor, [ptr]);\n          HEAP32[(((header)+(4))>>2)]=0;\n        }\n        ___cxa_free_exception(ptr);\n        ___cxa_last_thrown_exception = 0;\n      }\n    }function ___cxa_rethrow() {\n      ___cxa_end_catch.rethrown = true;\n      var ptr = ___cxa_caught_exceptions.pop();\n      throw ptr + \" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.\";\n    }\n\n  function _abort() {\n      Module['abort']();\n    }\n\n  function _fmod(x, y) {\n      return x % y;\n    }\n\n  function ___cxa_guard_release() {}\n\n  function _ungetc(c, stream) {\n      // int ungetc(int c, FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) {\n        return -1;\n      }\n      if (c === -1) {\n        // do nothing for EOF character\n        return c;\n      }\n      c = unSign(c & 0xFF);\n      stream.ungotten.push(c);\n      stream.eof = false;\n      return c;\n    }\n\n  function _uselocale(locale) {\n      return 0;\n    }\n\n  \n  \n  \n   \n  Module[\"_strlen\"] = _strlen;\n  \n  function __reallyNegative(x) {\n      return x < 0 || (x === 0 && (1/x) === -Infinity);\n    }function __formatString(format, varargs) {\n      var textIndex = format;\n      var argIndex = 0;\n      function getNextArg(type) {\n        // NOTE: Explicitly ignoring type safety. Otherwise this fails:\n        //       int x = 4; printf(\"%c\\n\", (char)x);\n        var ret;\n        if (type === 'double') {\n          ret = (HEAP32[((tempDoublePtr)>>2)]=HEAP32[(((varargs)+(argIndex))>>2)],HEAP32[(((tempDoublePtr)+(4))>>2)]=HEAP32[(((varargs)+((argIndex)+(4)))>>2)],(+(HEAPF64[(tempDoublePtr)>>3])));\n        } else if (type == 'i64') {\n          ret = [HEAP32[(((varargs)+(argIndex))>>2)],\n                 HEAP32[(((varargs)+(argIndex+4))>>2)]];\n  \n        } else {\n          type = 'i32'; // varargs are always i32, i64, or double\n          ret = HEAP32[(((varargs)+(argIndex))>>2)];\n        }\n        argIndex += Runtime.getNativeFieldSize(type);\n        return ret;\n      }\n  \n      var ret = [];\n      var curr, next, currArg;\n      while(1) {\n        var startTextIndex = textIndex;\n        curr = HEAP8[(textIndex)];\n        if (curr === 0) break;\n        next = HEAP8[((textIndex+1)|0)];\n        if (curr == 37) {\n          // Handle flags.\n          var flagAlwaysSigned = false;\n          var flagLeftAlign = false;\n          var flagAlternative = false;\n          var flagZeroPad = false;\n          var flagPadSign = false;\n          flagsLoop: while (1) {\n            switch (next) {\n              case 43:\n                flagAlwaysSigned = true;\n                break;\n              case 45:\n                flagLeftAlign = true;\n                break;\n              case 35:\n                flagAlternative = true;\n                break;\n              case 48:\n                if (flagZeroPad) {\n                  break flagsLoop;\n                } else {\n                  flagZeroPad = true;\n                  break;\n                }\n              case 32:\n                flagPadSign = true;\n                break;\n              default:\n                break flagsLoop;\n            }\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          }\n  \n          // Handle width.\n          var width = 0;\n          if (next == 42) {\n            width = getNextArg('i32');\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          } else {\n            while (next >= 48 && next <= 57) {\n              width = width * 10 + (next - 48);\n              textIndex++;\n              next = HEAP8[((textIndex+1)|0)];\n            }\n          }\n  \n          // Handle precision.\n          var precisionSet = false, precision = -1;\n          if (next == 46) {\n            precision = 0;\n            precisionSet = true;\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n            if (next == 42) {\n              precision = getNextArg('i32');\n              textIndex++;\n            } else {\n              while(1) {\n                var precisionChr = HEAP8[((textIndex+1)|0)];\n                if (precisionChr < 48 ||\n                    precisionChr > 57) break;\n                precision = precision * 10 + (precisionChr - 48);\n                textIndex++;\n              }\n            }\n            next = HEAP8[((textIndex+1)|0)];\n          }\n          if (precision < 0) {\n            precision = 6; // Standard default.\n            precisionSet = false;\n          }\n  \n          // Handle integer sizes. WARNING: These assume a 32-bit architecture!\n          var argSize;\n          switch (String.fromCharCode(next)) {\n            case 'h':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 104) {\n                textIndex++;\n                argSize = 1; // char (actually i32 in varargs)\n              } else {\n                argSize = 2; // short (actually i32 in varargs)\n              }\n              break;\n            case 'l':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 108) {\n                textIndex++;\n                argSize = 8; // long long\n              } else {\n                argSize = 4; // long\n              }\n              break;\n            case 'L': // long long\n            case 'q': // int64_t\n            case 'j': // intmax_t\n              argSize = 8;\n              break;\n            case 'z': // size_t\n            case 't': // ptrdiff_t\n            case 'I': // signed ptrdiff_t or unsigned size_t\n              argSize = 4;\n              break;\n            default:\n              argSize = null;\n          }\n          if (argSize) textIndex++;\n          next = HEAP8[((textIndex+1)|0)];\n  \n          // Handle type specifier.\n          switch (String.fromCharCode(next)) {\n            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {\n              // Integer.\n              var signed = next == 100 || next == 105;\n              argSize = argSize || 4;\n              var currArg = getNextArg('i' + (argSize * 8));\n              var origArg = currArg;\n              var argText;\n              // Flatten i64-1 [low, high] into a (slightly rounded) double\n              if (argSize == 8) {\n                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);\n              }\n              // Truncate to requested size.\n              if (argSize <= 4) {\n                var limit = Math.pow(256, argSize) - 1;\n                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);\n              }\n              // Format the number.\n              var currAbsArg = Math.abs(currArg);\n              var prefix = '';\n              if (next == 100 || next == 105) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else\n                argText = reSign(currArg, 8 * argSize, 1).toString(10);\n              } else if (next == 117) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else\n                argText = unSign(currArg, 8 * argSize, 1).toString(10);\n                currArg = Math.abs(currArg);\n              } else if (next == 111) {\n                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);\n              } else if (next == 120 || next == 88) {\n                prefix = (flagAlternative && currArg != 0) ? '0x' : '';\n                if (argSize == 8 && i64Math) {\n                  if (origArg[1]) {\n                    argText = (origArg[1]>>>0).toString(16);\n                    var lower = (origArg[0]>>>0).toString(16);\n                    while (lower.length < 8) lower = '0' + lower;\n                    argText += lower;\n                  } else {\n                    argText = (origArg[0]>>>0).toString(16);\n                  }\n                } else\n                if (currArg < 0) {\n                  // Represent negative numbers in hex as 2's complement.\n                  currArg = -currArg;\n                  argText = (currAbsArg - 1).toString(16);\n                  var buffer = [];\n                  for (var i = 0; i < argText.length; i++) {\n                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));\n                  }\n                  argText = buffer.join('');\n                  while (argText.length < argSize * 2) argText = 'f' + argText;\n                } else {\n                  argText = currAbsArg.toString(16);\n                }\n                if (next == 88) {\n                  prefix = prefix.toUpperCase();\n                  argText = argText.toUpperCase();\n                }\n              } else if (next == 112) {\n                if (currAbsArg === 0) {\n                  argText = '(nil)';\n                } else {\n                  prefix = '0x';\n                  argText = currAbsArg.toString(16);\n                }\n              }\n              if (precisionSet) {\n                while (argText.length < precision) {\n                  argText = '0' + argText;\n                }\n              }\n  \n              // Add sign if needed\n              if (currArg >= 0) {\n                if (flagAlwaysSigned) {\n                  prefix = '+' + prefix;\n                } else if (flagPadSign) {\n                  prefix = ' ' + prefix;\n                }\n              }\n  \n              // Move sign to prefix so we zero-pad after the sign\n              if (argText.charAt(0) == '-') {\n                prefix = '-' + prefix;\n                argText = argText.substr(1);\n              }\n  \n              // Add padding.\n              while (prefix.length + argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad) {\n                    argText = '0' + argText;\n                  } else {\n                    prefix = ' ' + prefix;\n                  }\n                }\n              }\n  \n              // Insert the result into the buffer.\n              argText = prefix + argText;\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {\n              // Float.\n              var currArg = getNextArg('double');\n              var argText;\n              if (isNaN(currArg)) {\n                argText = 'nan';\n                flagZeroPad = false;\n              } else if (!isFinite(currArg)) {\n                argText = (currArg < 0 ? '-' : '') + 'inf';\n                flagZeroPad = false;\n              } else {\n                var isGeneral = false;\n                var effectivePrecision = Math.min(precision, 20);\n  \n                // Convert g/G to f/F or e/E, as per:\n                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html\n                if (next == 103 || next == 71) {\n                  isGeneral = true;\n                  precision = precision || 1;\n                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);\n                  if (precision > exponent && exponent >= -4) {\n                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);\n                    precision -= exponent + 1;\n                  } else {\n                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);\n                    precision--;\n                  }\n                  effectivePrecision = Math.min(precision, 20);\n                }\n  \n                if (next == 101 || next == 69) {\n                  argText = currArg.toExponential(effectivePrecision);\n                  // Make sure the exponent has at least 2 digits.\n                  if (/[eE][-+]\\d$/.test(argText)) {\n                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);\n                  }\n                } else if (next == 102 || next == 70) {\n                  argText = currArg.toFixed(effectivePrecision);\n                  if (currArg === 0 && __reallyNegative(currArg)) {\n                    argText = '-' + argText;\n                  }\n                }\n  \n                var parts = argText.split('e');\n                if (isGeneral && !flagAlternative) {\n                  // Discard trailing zeros and periods.\n                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&\n                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {\n                    parts[0] = parts[0].slice(0, -1);\n                  }\n                } else {\n                  // Make sure we have a period in alternative mode.\n                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';\n                  // Zero pad until required precision.\n                  while (precision > effectivePrecision++) parts[0] += '0';\n                }\n                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');\n  \n                // Capitalize 'E' if needed.\n                if (next == 69) argText = argText.toUpperCase();\n  \n                // Add sign.\n                if (currArg >= 0) {\n                  if (flagAlwaysSigned) {\n                    argText = '+' + argText;\n                  } else if (flagPadSign) {\n                    argText = ' ' + argText;\n                  }\n                }\n              }\n  \n              // Add padding.\n              while (argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {\n                    argText = argText[0] + '0' + argText.slice(1);\n                  } else {\n                    argText = (flagZeroPad ? '0' : ' ') + argText;\n                  }\n                }\n              }\n  \n              // Adjust case.\n              if (next < 97) argText = argText.toUpperCase();\n  \n              // Insert the result into the buffer.\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 's': {\n              // String.\n              var arg = getNextArg('i8*');\n              var argLength = arg ? _strlen(arg) : '(null)'.length;\n              if (precisionSet) argLength = Math.min(argLength, precision);\n              if (!flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              if (arg) {\n                for (var i = 0; i < argLength; i++) {\n                  ret.push(HEAPU8[((arg++)|0)]);\n                }\n              } else {\n                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));\n              }\n              if (flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              break;\n            }\n            case 'c': {\n              // Character.\n              if (flagLeftAlign) ret.push(getNextArg('i8'));\n              while (--width > 0) {\n                ret.push(32);\n              }\n              if (!flagLeftAlign) ret.push(getNextArg('i8'));\n              break;\n            }\n            case 'n': {\n              // Write the length written so far to the next parameter.\n              var ptr = getNextArg('i32*');\n              HEAP32[((ptr)>>2)]=ret.length;\n              break;\n            }\n            case '%': {\n              // Literal percent sign.\n              ret.push(curr);\n              break;\n            }\n            default: {\n              // Unknown specifiers remain untouched.\n              for (var i = startTextIndex; i < textIndex + 2; i++) {\n                ret.push(HEAP8[(i)]);\n              }\n            }\n          }\n          textIndex += 2;\n          // TODO: Support a/A (hex float) and m (last error) specifiers.\n          // TODO: Support %1${specifier} for arg selection.\n        } else {\n          ret.push(curr);\n          textIndex += 1;\n        }\n      }\n      return ret;\n    }function _snprintf(s, n, format, varargs) {\n      // int snprintf(char *restrict s, size_t n, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var result = __formatString(format, varargs);\n      var limit = (n === undefined) ? result.length\n                                    : Math.min(result.length, Math.max(n - 1, 0));\n      if (s < 0) {\n        s = -s;\n        var buf = _malloc(limit+1);\n        HEAP32[((s)>>2)]=buf;\n        s = buf;\n      }\n      for (var i = 0; i < limit; i++) {\n        HEAP8[(((s)+(i))|0)]=result[i];\n      }\n      if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0;\n      return result.length;\n    }function _vsnprintf(s, n, format, va_arg) {\n      return _snprintf(s, n, format, HEAP32[((va_arg)>>2)]);\n    }\n\n  \n  \n  \n  function __getFloat(text) {\n      return /^[+-]?[0-9]*\\.?[0-9]+([eE][+-]?[0-9]+)?/.exec(text);\n    }function __scanString(format, get, unget, varargs) {\n      if (!__scanString.whiteSpace) {\n        __scanString.whiteSpace = {};\n        __scanString.whiteSpace[32] = 1;\n        __scanString.whiteSpace[9] = 1;\n        __scanString.whiteSpace[10] = 1;\n        __scanString.whiteSpace[11] = 1;\n        __scanString.whiteSpace[12] = 1;\n        __scanString.whiteSpace[13] = 1;\n      }\n      // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf.\n      // TODO: Support all format specifiers.\n      format = Pointer_stringify(format);\n      var soFar = 0;\n      if (format.indexOf('%n') >= 0) {\n        // need to track soFar\n        var _get = get;\n        get = function get() {\n          soFar++;\n          return _get();\n        }\n        var _unget = unget;\n        unget = function unget() {\n          soFar--;\n          return _unget();\n        }\n      }\n      var formatIndex = 0;\n      var argsi = 0;\n      var fields = 0;\n      var argIndex = 0;\n      var next;\n  \n      mainLoop:\n      for (var formatIndex = 0; formatIndex < format.length;) {\n        if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') {\n          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n          argIndex += Runtime.getAlignSize('void*', null, true);\n          HEAP32[((argPtr)>>2)]=soFar;\n          formatIndex += 2;\n          continue;\n        }\n  \n        if (format[formatIndex] === '%') {\n          var nextC = format.indexOf('c', formatIndex+1);\n          if (nextC > 0) {\n            var maxx = 1;\n            if (nextC > formatIndex+1) {\n              var sub = format.substring(formatIndex+1, nextC);\n              maxx = parseInt(sub);\n              if (maxx != sub) maxx = 0;\n            }\n            if (maxx) {\n              var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n              argIndex += Runtime.getAlignSize('void*', null, true);\n              fields++;\n              for (var i = 0; i < maxx; i++) {\n                next = get();\n                HEAP8[((argPtr++)|0)]=next;\n                if (next === 0) return i > 0 ? fields : fields-1; // we failed to read the full length of this field\n              }\n              formatIndex += nextC - formatIndex + 1;\n              continue;\n            }\n          }\n        }\n  \n        // handle %[...]\n        if (format[formatIndex] === '%' && format.indexOf('[', formatIndex+1) > 0) {\n          var match = /\\%([0-9]*)\\[(\\^)?(\\]?[^\\]]*)\\]/.exec(format.substring(formatIndex));\n          if (match) {\n            var maxNumCharacters = parseInt(match[1]) || Infinity;\n            var negateScanList = (match[2] === '^');\n            var scanList = match[3];\n  \n            // expand \"middle\" dashs into character sets\n            var middleDashMatch;\n            while ((middleDashMatch = /([^\\-])\\-([^\\-])/.exec(scanList))) {\n              var rangeStartCharCode = middleDashMatch[1].charCodeAt(0);\n              var rangeEndCharCode = middleDashMatch[2].charCodeAt(0);\n              for (var expanded = ''; rangeStartCharCode <= rangeEndCharCode; expanded += String.fromCharCode(rangeStartCharCode++));\n              scanList = scanList.replace(middleDashMatch[1] + '-' + middleDashMatch[2], expanded);\n            }\n  \n            var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n            argIndex += Runtime.getAlignSize('void*', null, true);\n            fields++;\n  \n            for (var i = 0; i < maxNumCharacters; i++) {\n              next = get();\n              if (negateScanList) {\n                if (scanList.indexOf(String.fromCharCode(next)) < 0) {\n                  HEAP8[((argPtr++)|0)]=next;\n                } else {\n                  unget();\n                  break;\n                }\n              } else {\n                if (scanList.indexOf(String.fromCharCode(next)) >= 0) {\n                  HEAP8[((argPtr++)|0)]=next;\n                } else {\n                  unget();\n                  break;\n                }\n              }\n            }\n  \n            // write out null-terminating character\n            HEAP8[((argPtr++)|0)]=0;\n            formatIndex += match[0].length;\n            \n            continue;\n          }\n        }      \n        // remove whitespace\n        while (1) {\n          next = get();\n          if (next == 0) return fields;\n          if (!(next in __scanString.whiteSpace)) break;\n        }\n        unget();\n  \n        if (format[formatIndex] === '%') {\n          formatIndex++;\n          var suppressAssignment = false;\n          if (format[formatIndex] == '*') {\n            suppressAssignment = true;\n            formatIndex++;\n          }\n          var maxSpecifierStart = formatIndex;\n          while (format[formatIndex].charCodeAt(0) >= 48 &&\n                 format[formatIndex].charCodeAt(0) <= 57) {\n            formatIndex++;\n          }\n          var max_;\n          if (formatIndex != maxSpecifierStart) {\n            max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10);\n          }\n          var long_ = false;\n          var half = false;\n          var longLong = false;\n          if (format[formatIndex] == 'l') {\n            long_ = true;\n            formatIndex++;\n            if (format[formatIndex] == 'l') {\n              longLong = true;\n              formatIndex++;\n            }\n          } else if (format[formatIndex] == 'h') {\n            half = true;\n            formatIndex++;\n          }\n          var type = format[formatIndex];\n          formatIndex++;\n          var curr = 0;\n          var buffer = [];\n          // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later\n          if (type == 'f' || type == 'e' || type == 'g' ||\n              type == 'F' || type == 'E' || type == 'G') {\n            next = get();\n            while (next > 0 && (!(next in __scanString.whiteSpace)))  {\n              buffer.push(String.fromCharCode(next));\n              next = get();\n            }\n            var m = __getFloat(buffer.join(''));\n            var last = m ? m[0].length : 0;\n            for (var i = 0; i < buffer.length - last + 1; i++) {\n              unget();\n            }\n            buffer.length = last;\n          } else {\n            next = get();\n            var first = true;\n            \n            // Strip the optional 0x prefix for %x.\n            if ((type == 'x' || type == 'X') && (next == 48)) {\n              var peek = get();\n              if (peek == 120 || peek == 88) {\n                next = get();\n              } else {\n                unget();\n              }\n            }\n            \n            while ((curr < max_ || isNaN(max_)) && next > 0) {\n              if (!(next in __scanString.whiteSpace) && // stop on whitespace\n                  (type == 's' ||\n                   ((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) ||\n                                                                     (first && next == 45))) ||\n                   ((type === 'x' || type === 'X') && (next >= 48 && next <= 57 ||\n                                     next >= 97 && next <= 102 ||\n                                     next >= 65 && next <= 70))) &&\n                  (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up\n                buffer.push(String.fromCharCode(next));\n                next = get();\n                curr++;\n                first = false;\n              } else {\n                break;\n              }\n            }\n            unget();\n          }\n          if (buffer.length === 0) return 0;  // Failure.\n          if (suppressAssignment) continue;\n  \n          var text = buffer.join('');\n          var argPtr = HEAP32[(((varargs)+(argIndex))>>2)];\n          argIndex += Runtime.getAlignSize('void*', null, true);\n          switch (type) {\n            case 'd': case 'u': case 'i':\n              if (half) {\n                HEAP16[((argPtr)>>1)]=parseInt(text, 10);\n              } else if (longLong) {\n                (tempI64 = [parseInt(text, 10)>>>0,(tempDouble=parseInt(text, 10),(+(Math_abs(tempDouble))) >= (+1) ? (tempDouble > (+0) ? ((Math_min((+(Math_floor((tempDouble)/(+4294967296)))), (+4294967295)))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/(+4294967296))))))>>>0) : 0)],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]);\n              } else {\n                HEAP32[((argPtr)>>2)]=parseInt(text, 10);\n              }\n              break;\n            case 'X':\n            case 'x':\n              HEAP32[((argPtr)>>2)]=parseInt(text, 16);\n              break;\n            case 'F':\n            case 'f':\n            case 'E':\n            case 'e':\n            case 'G':\n            case 'g':\n            case 'E':\n              // fallthrough intended\n              if (long_) {\n                HEAPF64[((argPtr)>>3)]=parseFloat(text);\n              } else {\n                HEAPF32[((argPtr)>>2)]=parseFloat(text);\n              }\n              break;\n            case 's':\n              var array = intArrayFromString(text);\n              for (var j = 0; j < array.length; j++) {\n                HEAP8[(((argPtr)+(j))|0)]=array[j];\n              }\n              break;\n          }\n          fields++;\n        } else if (format[formatIndex].charCodeAt(0) in __scanString.whiteSpace) {\n          next = get();\n          while (next in __scanString.whiteSpace) {\n            if (next <= 0) break mainLoop;  // End of input.\n            next = get();\n          }\n          unget(next);\n          formatIndex++;\n        } else {\n          // Not a specifier.\n          next = get();\n          if (format[formatIndex].charCodeAt(0) !== next) {\n            unget(next);\n            break mainLoop;\n          }\n          formatIndex++;\n        }\n      }\n      return fields;\n    }function _sscanf(s, format, varargs) {\n      // int sscanf(const char *restrict s, const char *restrict format, ... );\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html\n      var index = 0;\n      function get() { return HEAP8[(((s)+(index++))|0)]; };\n      function unget() { index--; };\n      return __scanString(format, get, unget, varargs);\n    }function _vsscanf(s, format, va_arg) {\n      return _sscanf(s, format, HEAP32[((va_arg)>>2)]);\n    }\n\n\n\n  \n  \n  \n  function _recv(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _read(fd, buf, len);\n    }\n  \n  function _pread(fildes, buf, nbyte, offset) {\n      // ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.read(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _read(fildes, buf, nbyte) {\n      // ssize_t read(int fildes, void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.read(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _fread(ptr, size, nitems, stream) {\n      // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html\n      var bytesToRead = nitems * size;\n      if (bytesToRead == 0) {\n        return 0;\n      }\n      var bytesRead = 0;\n      var streamObj = FS.getStreamFromPtr(stream);\n      if (!streamObj) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return 0;\n      }\n      while (streamObj.ungotten.length && bytesToRead > 0) {\n        HEAP8[((ptr++)|0)]=streamObj.ungotten.pop();\n        bytesToRead--;\n        bytesRead++;\n      }\n      var err = _read(streamObj.fd, ptr, bytesToRead);\n      if (err == -1) {\n        if (streamObj) streamObj.error = true;\n        return 0;\n      }\n      bytesRead += err;\n      if (bytesRead < bytesToRead) streamObj.eof = true;\n      return Math.floor(bytesRead / size);\n    }function _fgetc(stream) {\n      // int fgetc(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html\n      var streamObj = FS.getStreamFromPtr(stream);\n      if (!streamObj) return -1;\n      if (streamObj.eof || streamObj.error) return -1;\n      var ret = _fread(_fgetc.ret, 1, 1, stream);\n      if (ret == 0) {\n        return -1;\n      } else if (ret == -1) {\n        streamObj.error = true;\n        return -1;\n      } else {\n        return HEAPU8[((_fgetc.ret)|0)];\n      }\n    }\n\n\n  \n  function _strerror_r(errnum, strerrbuf, buflen) {\n      if (errnum in ERRNO_MESSAGES) {\n        if (ERRNO_MESSAGES[errnum].length > buflen - 1) {\n          return ___setErrNo(ERRNO_CODES.ERANGE);\n        } else {\n          var msg = ERRNO_MESSAGES[errnum];\n          writeAsciiToMemory(msg, strerrbuf);\n          return 0;\n        }\n      } else {\n        return ___setErrNo(ERRNO_CODES.EINVAL);\n      }\n    }function _strerror(errnum) {\n      if (!_strerror.buffer) _strerror.buffer = _malloc(256);\n      _strerror_r(errnum, _strerror.buffer, 256);\n      return _strerror.buffer;\n    }\n\n  \n  \n  function __isLeapYear(year) {\n        return year%4 === 0 && (year%100 !== 0 || year%400 === 0);\n    }\n  \n  function __arraySum(array, index) {\n      var sum = 0;\n      for (var i = 0; i <= index; sum += array[i++]);\n      return sum;\n    }\n  \n  \n  var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];\n  \n  var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) {\n      var newDate = new Date(date.getTime());\n      while(days > 0) {\n        var leap = __isLeapYear(newDate.getFullYear());\n        var currentMonth = newDate.getMonth();\n        var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];\n  \n        if (days > daysInCurrentMonth-newDate.getDate()) {\n          // we spill over to next month\n          days -= (daysInCurrentMonth-newDate.getDate()+1);\n          newDate.setDate(1);\n          if (currentMonth < 11) {\n            newDate.setMonth(currentMonth+1)\n          } else {\n            newDate.setMonth(0);\n            newDate.setFullYear(newDate.getFullYear()+1);\n          }\n        } else {\n          // we stay in current month \n          newDate.setDate(newDate.getDate()+days);\n          return newDate;\n        }\n      }\n  \n      return newDate;\n    }function _strftime(s, maxsize, format, tm) {\n      // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);\n      // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html\n      \n      var date = {\n        tm_sec: HEAP32[((tm)>>2)],\n        tm_min: HEAP32[(((tm)+(4))>>2)],\n        tm_hour: HEAP32[(((tm)+(8))>>2)],\n        tm_mday: HEAP32[(((tm)+(12))>>2)],\n        tm_mon: HEAP32[(((tm)+(16))>>2)],\n        tm_year: HEAP32[(((tm)+(20))>>2)],\n        tm_wday: HEAP32[(((tm)+(24))>>2)],\n        tm_yday: HEAP32[(((tm)+(28))>>2)],\n        tm_isdst: HEAP32[(((tm)+(32))>>2)]\n      };\n  \n      var pattern = Pointer_stringify(format);\n  \n      // expand format\n      var EXPANSION_RULES_1 = {\n        '%c': '%a %b %d %H:%M:%S %Y',     // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug  3 14:02:01 2013\n        '%D': '%m/%d/%y',                 // Equivalent to %m / %d / %y\n        '%F': '%Y-%m-%d',                 // Equivalent to %Y - %m - %d\n        '%h': '%b',                       // Equivalent to %b\n        '%r': '%I:%M:%S %p',              // Replaced by the time in a.m. and p.m. notation\n        '%R': '%H:%M',                    // Replaced by the time in 24-hour notation\n        '%T': '%H:%M:%S',                 // Replaced by the time\n        '%x': '%m/%d/%y',                 // Replaced by the locale's appropriate date representation\n        '%X': '%H:%M:%S',                 // Replaced by the locale's appropriate date representation\n      };\n      for (var rule in EXPANSION_RULES_1) {\n        pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]);\n      }\n  \n      var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n      var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n  \n      function leadingSomething(value, digits, character) {\n        var str = typeof value === 'number' ? value.toString() : (value || '');\n        while (str.length < digits) {\n          str = character[0]+str;\n        }\n        return str;\n      };\n  \n      function leadingNulls(value, digits) {\n        return leadingSomething(value, digits, '0');\n      };\n  \n      function compareByDay(date1, date2) {\n        function sgn(value) {\n          return value < 0 ? -1 : (value > 0 ? 1 : 0);\n        };\n  \n        var compare;\n        if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) {\n          if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) {\n            compare = sgn(date1.getDate()-date2.getDate());\n          }\n        }\n        return compare;\n      };\n  \n      function getFirstWeekStartDate(janFourth) {\n          switch (janFourth.getDay()) {\n            case 0: // Sunday\n              return new Date(janFourth.getFullYear()-1, 11, 29);\n            case 1: // Monday\n              return janFourth;\n            case 2: // Tuesday\n              return new Date(janFourth.getFullYear(), 0, 3);\n            case 3: // Wednesday\n              return new Date(janFourth.getFullYear(), 0, 2);\n            case 4: // Thursday\n              return new Date(janFourth.getFullYear(), 0, 1);\n            case 5: // Friday\n              return new Date(janFourth.getFullYear()-1, 11, 31);\n            case 6: // Saturday\n              return new Date(janFourth.getFullYear()-1, 11, 30);\n          }\n      };\n  \n      function getWeekBasedYear(date) {\n          var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);\n  \n          var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);\n          var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4);\n  \n          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n  \n          if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {\n            // this date is after the start of the first week of this year\n            if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {\n              return thisDate.getFullYear()+1;\n            } else {\n              return thisDate.getFullYear();\n            }\n          } else { \n            return thisDate.getFullYear()-1;\n          }\n      };\n  \n      var EXPANSION_RULES_2 = {\n        '%a': function(date) {\n          return WEEKDAYS[date.tm_wday].substring(0,3);\n        },\n        '%A': function(date) {\n          return WEEKDAYS[date.tm_wday];\n        },\n        '%b': function(date) {\n          return MONTHS[date.tm_mon].substring(0,3);\n        },\n        '%B': function(date) {\n          return MONTHS[date.tm_mon];\n        },\n        '%C': function(date) {\n          var year = date.tm_year+1900;\n          return leadingNulls(Math.floor(year/100),2);\n        },\n        '%d': function(date) {\n          return leadingNulls(date.tm_mday, 2);\n        },\n        '%e': function(date) {\n          return leadingSomething(date.tm_mday, 2, ' ');\n        },\n        '%g': function(date) {\n          // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. \n          // In this system, weeks begin on a Monday and week 1 of the year is the week that includes \n          // January 4th, which is also the week that includes the first Thursday of the year, and \n          // is also the first week that contains at least four days in the year. \n          // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of \n          // the last week of the preceding year; thus, for Saturday 2nd January 1999, \n          // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, \n          // or 31st is a Monday, it and any following days are part of week 1 of the following year. \n          // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01.\n          \n          return getWeekBasedYear(date).toString().substring(2);\n        },\n        '%G': function(date) {\n          return getWeekBasedYear(date);\n        },\n        '%H': function(date) {\n          return leadingNulls(date.tm_hour, 2);\n        },\n        '%I': function(date) {\n          return leadingNulls(date.tm_hour < 13 ? date.tm_hour : date.tm_hour-12, 2);\n        },\n        '%j': function(date) {\n          // Day of the year (001-366)\n          return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3);\n        },\n        '%m': function(date) {\n          return leadingNulls(date.tm_mon+1, 2);\n        },\n        '%M': function(date) {\n          return leadingNulls(date.tm_min, 2);\n        },\n        '%n': function() {\n          return '\\n';\n        },\n        '%p': function(date) {\n          if (date.tm_hour > 0 && date.tm_hour < 13) {\n            return 'AM';\n          } else {\n            return 'PM';\n          }\n        },\n        '%S': function(date) {\n          return leadingNulls(date.tm_sec, 2);\n        },\n        '%t': function() {\n          return '\\t';\n        },\n        '%u': function(date) {\n          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);\n          return day.getDay() || 7;\n        },\n        '%U': function(date) {\n          // Replaced by the week number of the year as a decimal number [00,53]. \n          // The first Sunday of January is the first day of week 1; \n          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]\n          var janFirst = new Date(date.tm_year+1900, 0, 1);\n          var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay());\n          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);\n          \n          // is target date after the first Sunday?\n          if (compareByDay(firstSunday, endDate) < 0) {\n            // calculate difference in days between first Sunday and endDate\n            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;\n            var firstSundayUntilEndJanuary = 31-firstSunday.getDate();\n            var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();\n            return leadingNulls(Math.ceil(days/7), 2);\n          }\n  \n          return compareByDay(firstSunday, janFirst) === 0 ? '01': '00';\n        },\n        '%V': function(date) {\n          // Replaced by the week number of the year (Monday as the first day of the week) \n          // as a decimal number [01,53]. If the week containing 1 January has four \n          // or more days in the new year, then it is considered week 1. \n          // Otherwise, it is the last week of the previous year, and the next week is week 1. \n          // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday]\n          var janFourthThisYear = new Date(date.tm_year+1900, 0, 4);\n          var janFourthNextYear = new Date(date.tm_year+1901, 0, 4);\n  \n          var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);\n          var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);\n  \n          var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday);\n  \n          if (compareByDay(endDate, firstWeekStartThisYear) < 0) {\n            // if given date is before this years first week, then it belongs to the 53rd week of last year\n            return '53';\n          } \n  \n          if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {\n            // if given date is after next years first week, then it belongs to the 01th week of next year\n            return '01';\n          }\n  \n          // given date is in between CW 01..53 of this calendar year\n          var daysDifference;\n          if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) {\n            // first CW of this year starts last year\n            daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate()\n          } else {\n            // first CW of this year starts this year\n            daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate();\n          }\n          return leadingNulls(Math.ceil(daysDifference/7), 2);\n        },\n        '%w': function(date) {\n          var day = new Date(date.tm_year+1900, date.tm_mon+1, date.tm_mday, 0, 0, 0, 0);\n          return day.getDay();\n        },\n        '%W': function(date) {\n          // Replaced by the week number of the year as a decimal number [00,53]. \n          // The first Monday of January is the first day of week 1; \n          // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday]\n          var janFirst = new Date(date.tm_year, 0, 1);\n          var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1);\n          var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday);\n  \n          // is target date after the first Monday?\n          if (compareByDay(firstMonday, endDate) < 0) {\n            var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31;\n            var firstMondayUntilEndJanuary = 31-firstMonday.getDate();\n            var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();\n            return leadingNulls(Math.ceil(days/7), 2);\n          }\n          return compareByDay(firstMonday, janFirst) === 0 ? '01': '00';\n        },\n        '%y': function(date) {\n          // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year]\n          return (date.tm_year+1900).toString().substring(2);\n        },\n        '%Y': function(date) {\n          // Replaced by the year as a decimal number (for example, 1997). [ tm_year]\n          return date.tm_year+1900;\n        },\n        '%z': function(date) {\n          // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ),\n          // or by no characters if no timezone is determinable. \n          // For example, \"-0430\" means 4 hours 30 minutes behind UTC (west of Greenwich). \n          // If tm_isdst is zero, the standard time offset is used. \n          // If tm_isdst is greater than zero, the daylight savings time offset is used. \n          // If tm_isdst is negative, no characters are returned. \n          // FIXME: we cannot determine time zone (or can we?)\n          return '';\n        },\n        '%Z': function(date) {\n          // Replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. [ tm_isdst]\n          // FIXME: we cannot determine time zone (or can we?)\n          return '';\n        },\n        '%%': function() {\n          return '%';\n        }\n      };\n      for (var rule in EXPANSION_RULES_2) {\n        if (pattern.indexOf(rule) >= 0) {\n          pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date));\n        }\n      }\n  \n      var bytes = intArrayFromString(pattern, false);\n      if (bytes.length > maxsize) {\n        return 0;\n      } \n  \n      writeArrayToMemory(bytes, s);\n      return bytes.length-1;\n    }function _strftime_l(s, maxsize, format, tm) {\n      return _strftime(s, maxsize, format, tm); // no locale support yet\n    }\n\n  var _llvm_memcpy_p0i8_p0i8_i32=_memcpy;\n\n\n  function _pthread_cond_wait() {\n      return 0;\n    }\n\n  \n  function _isdigit(chr) {\n      return chr >= 48 && chr <= 57;\n    }function _isdigit_l(chr) {\n      return _isdigit(chr); // no locale support yet\n    }\n\n  var _fabs=Math_abs;\n\n  function _llvm_lifetime_start() {}\n\n  var _getc=_fgetc;\n\n  var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  function ___ctype_b_loc() {\n      // http://refspecs.freestandards.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/baselib---ctype-b-loc.html\n      var me = ___ctype_b_loc;\n      if (!me.ret) {\n        var values = [\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,8195,8194,8194,8194,8194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,24577,49156,49156,49156,\n          49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,49156,55304,55304,55304,55304,55304,55304,55304,55304,\n          55304,55304,49156,49156,49156,49156,49156,49156,49156,54536,54536,54536,54536,54536,54536,50440,50440,50440,50440,50440,\n          50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,50440,49156,49156,49156,49156,49156,\n          49156,54792,54792,54792,54792,54792,54792,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,50696,\n          50696,50696,50696,50696,50696,50696,50696,49156,49156,49156,49156,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n        ];\n        var i16size = 2;\n        var arr = _malloc(values.length * i16size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP16[(((arr)+(i * i16size))>>1)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i16size], 'i16*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function _freelocale(locale) {\n      _free(locale);\n    }\n\n  function ___cxa_allocate_exception(size) {\n      var ptr = _malloc(size + ___cxa_exception_header_size);\n      return ptr + ___cxa_exception_header_size;\n    }\n\n  var _fmodl=_fmod;\n\n  function _catopen(name, oflag) {\n      // nl_catd catopen (const char *name, int oflag)\n      return -1;\n    }\n\n  function _catgets(catd, set_id, msg_id, s) {\n      // char *catgets (nl_catd catd, int set_id, int msg_id, const char *s)\n      return s;\n    }\n\n  \n  \n  function _sprintf(s, format, varargs) {\n      // int sprintf(char *restrict s, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      return _snprintf(s, undefined, format, varargs);\n    }function _asprintf(s, format, varargs) {\n      return _sprintf(-s, format, varargs);\n    }function _vasprintf(s, format, va_arg) {\n      return _asprintf(s, format, HEAP32[((va_arg)>>2)]);\n    }\n\n  function _time(ptr) {\n      var ret = Math.floor(Date.now()/1000);\n      if (ptr) {\n        HEAP32[((ptr)>>2)]=ret;\n      }\n      return ret;\n    }\n\n  function _copysign(a, b) {\n      return __reallyNegative(a) === __reallyNegative(b) ? a : -a;\n    }\n\n  function ___ctype_toupper_loc() {\n      // http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/libutil---ctype-toupper-loc.html\n      var me = ___ctype_toupper_loc;\n      if (!me.ret) {\n        var values = [\n          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,\n          158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n          188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,\n          218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,\n          248,249,250,251,252,253,254,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n          33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,\n          73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,\n          81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,\n          145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,\n          175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,\n          205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,\n          235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255\n        ];\n        var i32size = 4;\n        var arr = _malloc(values.length * i32size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP32[(((arr)+(i * i32size))>>2)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i32size], 'i32*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function ___cxa_guard_acquire(variable) {\n      if (!HEAP8[(variable)]) { // ignore SAFE_HEAP stuff because llvm mixes i64 and i8 here\n        HEAP8[(variable)]=1;\n        return 1;\n      }\n      return 0;\n    }\n\n  function ___ctype_tolower_loc() {\n      // http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/libutil---ctype-tolower-loc.html\n      var me = ___ctype_tolower_loc;\n      if (!me.ret) {\n        var values = [\n          128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,\n          158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n          188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,\n          218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,\n          248,249,250,251,252,253,254,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,\n          33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,100,101,102,103,\n          104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,96,97,98,99,100,101,102,103,\n          104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,\n          134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,\n          164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,\n          194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,\n          224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,\n          254,255\n        ];\n        var i32size = 4;\n        var arr = _malloc(values.length * i32size);\n        for (var i = 0; i < values.length; i++) {\n          HEAP32[(((arr)+(i * i32size))>>2)]=values[i];\n        }\n        me.ret = allocate([arr + 128 * i32size], 'i32*', ALLOC_NORMAL);\n      }\n      return me.ret;\n    }\n\n  function ___cxa_begin_catch(ptr) {\n      __ZSt18uncaught_exceptionv.uncaught_exception--;\n      ___cxa_caught_exceptions.push(___cxa_last_thrown_exception);\n      return ptr;\n    }\n\n   \n  Module[\"_bitshift64Shl\"] = _bitshift64Shl;\n\n\n  function __ZNSt9exceptionD2Ev() {}\n\n  var _copysignl=_copysign;\n\n  var __ZTISt9exception=allocate([allocate([1,0,0,0,0,0,0], \"i8\", ALLOC_STATIC)+8, 0], \"i32\", ALLOC_STATIC);\n\n  var ___dso_handle=allocate(1, \"i32*\", ALLOC_STATIC);\n\n\n\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\n__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });\n_fgetc.ret = allocate([0], \"i8\", ALLOC_STATIC);\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n var ctlz_i8 = allocate([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], \"i8\", ALLOC_DYNAMIC);\n var cttz_i8 = allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0], \"i8\", ALLOC_DYNAMIC);\n\nvar Math_min = Math.min;\nfunction invoke_iiii(index,a1,a2,a3) {\n  try {\n    return Module[\"dynCall_iiii\"](index,a1,a2,a3);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7) {\n  try {\n    Module[\"dynCall_viiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiii(index,a1,a2,a3,a4,a5) {\n  try {\n    Module[\"dynCall_viiiii\"](index,a1,a2,a3,a4,a5);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_vi(index,a1) {\n  try {\n    Module[\"dynCall_vi\"](index,a1);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_vii(index,a1,a2) {\n  try {\n    Module[\"dynCall_vii\"](index,a1,a2);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9) {\n  try {\n    Module[\"dynCall_viiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_ii(index,a1) {\n  try {\n    return Module[\"dynCall_ii\"](index,a1);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiid(index,a1,a2,a3,a4,a5,a6,a7) {\n  try {\n    Module[\"dynCall_viiiiiid\"](index,a1,a2,a3,a4,a5,a6,a7);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viii(index,a1,a2,a3) {\n  try {\n    Module[\"dynCall_viii\"](index,a1,a2,a3);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiid(index,a1,a2,a3,a4,a5,a6) {\n  try {\n    Module[\"dynCall_viiiiid\"](index,a1,a2,a3,a4,a5,a6);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_v(index) {\n  try {\n    Module[\"dynCall_v\"](index);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {\n  try {\n    return Module[\"dynCall_iiiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiii(index,a1,a2,a3,a4) {\n  try {\n    return Module[\"dynCall_iiiii\"](index,a1,a2,a3,a4);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8) {\n  try {\n    Module[\"dynCall_viiiiiiii\"](index,a1,a2,a3,a4,a5,a6,a7,a8);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiiiii(index,a1,a2,a3,a4,a5,a6) {\n  try {\n    Module[\"dynCall_viiiiii\"](index,a1,a2,a3,a4,a5,a6);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iii(index,a1,a2) {\n  try {\n    return Module[\"dynCall_iii\"](index,a1,a2);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_iiiiii(index,a1,a2,a3,a4,a5) {\n  try {\n    return Module[\"dynCall_iiiiii\"](index,a1,a2,a3,a4,a5);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction invoke_viiii(index,a1,a2,a3,a4) {\n  try {\n    Module[\"dynCall_viiii\"](index,a1,a2,a3,a4);\n  } catch(e) {\n    if (typeof e !== 'number' && e !== 'longjmp') throw e;\n    asm[\"setThrew\"](1, 0);\n  }\n}\n\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=env.__ZTISt9exception|0;var p=env.___dso_handle|0;var q=env._stderr|0;var r=env._stdin|0;var s=env._stdout|0;var t=0;var u=0;var v=0;var w=0;var x=+env.NaN,y=+env.Infinity;var z=0,A=0,B=0,C=0,D=0.0,E=0,F=0,G=0,H=0.0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=0;var S=global.Math.floor;var T=global.Math.abs;var U=global.Math.sqrt;var V=global.Math.pow;var W=global.Math.cos;var X=global.Math.sin;var Y=global.Math.tan;var Z=global.Math.acos;var _=global.Math.asin;var $=global.Math.atan;var aa=global.Math.atan2;var ba=global.Math.exp;var ca=global.Math.log;var da=global.Math.ceil;var ea=global.Math.imul;var fa=env.abort;var ga=env.assert;var ha=env.asmPrintInt;var ia=env.asmPrintFloat;var ja=env.min;var ka=env.invoke_iiii;var la=env.invoke_viiiiiii;var ma=env.invoke_viiiii;var na=env.invoke_vi;var oa=env.invoke_vii;var pa=env.invoke_viiiiiiiii;var qa=env.invoke_ii;var ra=env.invoke_viiiiiid;var sa=env.invoke_viii;var ta=env.invoke_viiiiid;var ua=env.invoke_v;var va=env.invoke_iiiiiiiii;var wa=env.invoke_iiiii;var xa=env.invoke_viiiiiiii;var ya=env.invoke_viiiiii;var za=env.invoke_iii;var Aa=env.invoke_iiiiii;var Ba=env.invoke_viiii;var Ca=env._fabs;var Da=env._pthread_cond_wait;var Ea=env._freelocale;var Fa=env.__formatString;var Ga=env._asprintf;var Ha=env._send;var Ia=env._strtoll_l;var Ja=env._vsscanf;var Ka=env.___ctype_b_loc;var La=env.__ZSt9terminatev;var Ma=env._fmod;var Na=env.___cxa_guard_acquire;var Oa=env._isspace;var Pa=env.___setErrNo;var Qa=env.___cxa_is_number_type;var Ra=env._atexit;var Sa=env._copysign;var Ta=env._ungetc;var Ua=env.___cxa_free_exception;var Va=env.___cxa_allocate_exception;var Wa=env.__ZSt18uncaught_exceptionv;var Xa=env._isxdigit_l;var Ya=env.___ctype_toupper_loc;var Za=env._fflush;var _a=env.___cxa_guard_release;var $a=env.__addDays;var ab=env.___errno_location;var bb=env._strtoll;var cb=env._strerror_r;var db=env._strftime_l;var eb=env._llvm_lifetime_start;var fb=env._isdigit;var gb=env._sscanf;var hb=env._sbrk;var ib=env._uselocale;var jb=env._catgets;var kb=env._newlocale;var lb=env._snprintf;var mb=env.___cxa_begin_catch;var nb=env._emscripten_memcpy_big;var ob=env._fileno;var pb=env._pread;var qb=env.___resumeException;var rb=env.___cxa_find_matching_catch;var sb=env.__exit;var tb=env._strtoull;var ub=env._isdigit_l;var vb=env._strftime;var wb=env.__arraySum;var xb=env.___cxa_throw;var yb=env.___ctype_tolower_loc;var zb=env.___cxa_end_catch;var Ab=env._pthread_mutex_unlock;var Bb=env._fread;var Cb=env._pthread_cond_broadcast;var Db=env._isxdigit;var Eb=env._sprintf;var Fb=env.__reallyNegative;var Gb=env._vasprintf;var Hb=env._write;var Ib=env.__isLeapYear;var Jb=env.__scanString;var Kb=env._recv;var Lb=env._vsnprintf;var Mb=env.__ZNSt9exceptionD2Ev;var Nb=env._fgetc;var Ob=env._strtoull_l;var Pb=env._mkport;var Qb=env.___cxa_does_inherit;var Rb=env._sysconf;var Sb=env._read;var Tb=env.___cxa_rethrow;var Ub=env.__parseInt64;var Vb=env._abort;var Wb=env._catclose;var Xb=env._fwrite;var Yb=env._time;var Zb=env._pthread_mutex_lock;var _b=env._strerror;var $b=env._gettimeofday;var ac=env._llvm_lifetime_end;var bc=env._pwrite;var cc=env._catopen;var dc=env._exit;var ec=env.__getFloat;var fc=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction yc(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function zc(){return i|0}function Ac(a){a=a|0;i=a}function Bc(a,b){a=a|0;b=b|0;if((t|0)==0){t=a;u=b}}function Cc(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function Dc(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function Ec(a){a=a|0;I=a}function Fc(a){a=a|0;J=a}function Gc(a){a=a|0;K=a}function Hc(a){a=a|0;L=a}function Ic(a){a=a|0;M=a}function Jc(a){a=a|0;N=a}function Kc(a){a=a|0;O=a}function Lc(a){a=a|0;P=a}function Mc(a){a=a|0;Q=a}function Nc(a){a=a|0;R=a}function Oc(){var a=0,b=0;a=i;b=0;do{c[61448+(b<<2)>>2]=(c[77832+(b<<2)>>2]|0)+(c[69640+(b<<2)>>2]|0);b=b+1|0;}while((b|0)!=256);i=a;return}function Pc(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((a|0)>0){e=0}else{i=d;return}do{c[69640+(e<<2)>>2]=b;e=e+1|0;}while((e|0)!=(a|0));i=d;return}function Qc(a,b){a=a|0;b=b|0;var d=0,e=0;b=i;if((a|0)==0){i=b;return}else{d=a;e=0}while(1){a=d+ -1|0;c[61448+(e<<2)>>2]=c[77832+(e<<2)>>2]&c[69640+(e<<2)>>2];if((a|0)==0){break}else{e=e+1|0;d=a}}i=b;return}function Rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((a|0)==0){i=e;return}else{f=b;g=a;h=d}while(1){d=g+ -1|0;c[f>>2]=c[h>>2];if((d|0)==0){break}else{h=h+4|0;g=d;f=f+4|0}}i=e;return}function Sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((a|0)==0){i=e;return}else{f=b;g=a;h=d}while(1){d=g+ -1|0;c[f>>2]=(c[h>>2]|0)+5;if((d|0)==0){break}else{h=h+4|0;g=d;f=f+4|0}}i=e;return}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;if((a|0)>0){e=0}else{i=d;return}while(1){b=e+1|0;c[61448+(e<<2)>>2]=(c[77832+(e+3<<2)>>2]|0)+(c[69640+(b<<2)>>2]|0);if((b|0)==(a|0)){break}else{e=b}}i=d;return}function Uc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;d=i;if((a|0)>0){e=0}else{i=d;return}do{c[69640+(e<<2)>>2]=(c[61448+(e<<2)>>2]|0)>4?4:0;e=e+1|0;}while((e|0)!=(a|0));i=d;return}function Vc(a){a=a|0;var b=0;b=i;$m(61448,69640+(a<<2)|0,4096)|0;i=b;return}function Wc(a){a=a|0;var b=0,d=0,e=0;b=i;d=0;do{e=0;do{c[94216+(d<<12)+(e<<2)>>2]=a;e=e+1|0;}while((e|0)!=1024);d=d+1|0;}while((d|0)!=32);i=b;return}function Xc(a){a=a|0;var b=0,d=0,e=0;b=i;d=0;e=0;do{d=(c[24584+(e<<2)>>2]|0)+d-(c[28680+(e<<2)>>2]|0)|0;e=e+1|0;}while((e|0)!=1024);c[a>>2]=d;i=b;return}function Yc(a,d,f,g,h,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;k=i;l=0;do{c[g+(l<<2)>>2]=(c[j+(l<<2)>>2]|0)+(c[h+(l<<2)>>2]|0);b[a+(l<<1)>>1]=(e[f+(l<<1)>>1]|0)+(e[d+(l<<1)>>1]|0);l=l+1|0;}while((l|0)!=1024);i=k;return}function Zc(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;h=i;g=0;do{c[f+(g<<2)>>2]=b[d+(g<<1)>>1]|0;g=g+1|0;}while((g|0)!=1024);i=h;return}function _c(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;b=0;do{d=b<<1;e=d|1;f=c[69640+(e<<2)>>2]|0;g=c[77832+(e<<2)>>2]|0;e=ea(g,f)|0;h=c[69640+(d<<2)>>2]|0;j=c[77832+(d<<2)>>2]|0;c[61448+(b<<2)>>2]=e-(ea(j,h)|0);c[86024+(b<<2)>>2]=(ea(j,f)|0)+(ea(g,h)|0);b=b+1|0;}while((b|0)!=512);i=a;return}function $c(){var a=0,b=0;a=i;b=0;do{c[61448+(b<<2)>>2]=b;b=b+1|0;}while((b|0)!=1024);i=a;return}function ad(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=i;f=a;a=b;b=0;while(1){c[a>>2]=(e[f>>1]|0)<<7;g=b+1|0;if((g|0)==256){break}else{b=g;a=a+4|0;f=f+2|0}}i=d;return}function bd(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=0;do{c[20488+(e<<2)>>2]=(+g[32776+(e<<2)>>2]<+g[36872+(e<<2)>>2]?a:b)<<16>>16;e=e+1|0;}while((e|0)!=1024);i=d;return}function cd(){var a=0,b=0;a=i;b=0;do{c[57352+(b<<2)>>2]=+g[40968+(b<<2)>>2]<+g[45064+(b<<2)>>2]&+g[49160+(b<<2)>>2]<+g[53256+(b<<2)>>2]&1;b=b+1|0;}while((b|0)!=1024);i=a;return}function dd(b,e){b=b|0;e=e|0;var f=0,h=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,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.0,aa=0.0,ba=0,ca=0.0,da=0,ea=0.0,fa=0,ga=0.0,ha=0,ia=0.0,ja=0,ka=0.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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0;e=i;i=i+416|0;b=e;f=e+8|0;h=e+32|0;j=e+56|0;k=e+80|0;l=e+104|0;m=e+128|0;n=e+152|0;o=e+176|0;p=e+200|0;q=e+224|0;r=e+248|0;s=e+272|0;t=e+296|0;u=e+320|0;v=e+344|0;w=e+368|0;x=e+392|0;c[b>>2]=0;y=12296;z=1;while(1){A=((z&255)*7&255^39)+1|0;a[y]=A;B=y+1|0;if((B|0)==(16392|0)){C=16392;D=1;break}else{z=A;y=B}}while(1){y=((D&255)*7&255^39)+1|0;a[C]=y;z=C+1|0;if((z|0)==(20488|0)){E=20488;F=1;break}else{D=y;C=z}}while(1){C=((F&255)*7&255^39)+1|0;a[E]=C;D=E+1|0;if((D|0)==(24584|0)){G=2056;H=1;break}else{F=C;E=D}}while(1){E=((H&255)*7&255^39)+1|0;a[G]=E;F=G+1|0;if((F|0)==(4104|0)){I=4104;J=1;break}else{H=E;G=F}}while(1){G=((J&255)*7&255^39)+1|0;a[I]=G;H=I+1|0;if((H|0)==(6152|0)){K=6152;L=1;break}else{J=G;I=H}}while(1){I=((L&255)*7&255^39)+1|0;a[K]=I;J=K+1|0;if((J|0)==(8200|0)){M=61448;N=1;break}else{L=I;K=J}}while(1){K=((N&255)*7&255^39)+1|0;a[M]=K;L=M+1|0;if((L|0)==(69640|0)){O=69640;P=1;break}else{N=K;M=L}}while(1){M=((P&255)*7&255^39)+1|0;a[O]=M;N=O+1|0;if((N|0)==(77832|0)){Q=77832;R=1;break}else{P=M;O=N}}while(1){O=((R&255)*7&255^39)+1|0;a[Q]=O;P=Q+1|0;if((P|0)==(86024|0)){S=8200;T=1;break}else{R=O;Q=P}}while(1){Q=((T&255)*7&255^39)+1|0;a[S]=Q;R=S+1|0;if((R|0)==(12296|0)){U=24584;V=1;break}else{T=Q;S=R}}while(1){S=((V&255)*7&255^39)+1|0;a[U]=S;T=U+1|0;if((T|0)==(28680|0)){W=28680;X=1;break}else{V=S;U=T}}while(1){U=((X&255)*7&255^39)+1|0;a[W]=U;V=W+1|0;if((V|0)==(32776|0)){Y=94216;Z=1;break}else{X=U;W=V}}while(1){W=((Z&255)*7&255^39)+1|0;a[Y]=W;X=Y+1|0;if((X|0)==(98312|0)){_=32776;$=1.0;break}else{Z=W;Y=X}}while(1){aa=$*1.1;g[_>>2]=aa;Y=_+4|0;if((Y|0)==(36872|0)){ba=36872;ca=1.0;break}else{$=aa;_=Y}}while(1){$=ca*1.1;g[ba>>2]=$;_=ba+4|0;if((_|0)==(40968|0)){da=40968;ea=1.0;break}else{ca=$;ba=_}}while(1){ca=ea*1.1;g[da>>2]=ca;ba=da+4|0;if((ba|0)==(45064|0)){fa=45064;ga=1.0;break}else{ea=ca;da=ba}}while(1){ea=ga*1.1;g[fa>>2]=ea;da=fa+4|0;if((da|0)==(49160|0)){ha=49160;ia=1.0;break}else{ga=ea;fa=da}}while(1){ga=ia*1.1;g[ha>>2]=ga;fa=ha+4|0;if((fa|0)==(53256|0)){ja=53256;ka=1.0;break}else{ia=ga;ha=fa}}do{ka=ka*1.1;g[ja>>2]=ka;ja=ja+4|0;}while((ja|0)!=(57352|0));Oc();c[f>>2]=225288;a[f+4|0]=1;$b(f+8|0,0)|0;ja=0;while(1){Oc();ha=ja+1|0;if((ha|0)==655360){la=61448;ma=1;break}else{ja=ha}}do{ja=ma*3|0;ma=((d[la]|0)^ja)<<8^ja>>>8;la=la+1|0;}while((la|0)!=(62472|0));la=Gm(4)|0;ja=la;ha=(la|0)==0;if(!ha){c[ja>>2]=ma}hd(f);Pc(1024,2);c[h>>2]=225304;a[h+4|0]=1;$b(h+8|0,0)|0;f=0;while(1){Pc(1024,2);ma=f+1|0;if((ma|0)==262144){na=69640;oa=1;break}else{f=ma}}do{f=oa*3|0;oa=((d[na]|0)^f)<<8^f>>>8;na=na+1|0;}while((na|0)!=(73736|0));na=Gm(8)|0;c[na+4>>2]=oa;c[na>>2]=c[ja>>2];if(!ha){Im(la)}hd(h);Qc(1024,0);c[j>>2]=225320;a[j+4|0]=1;$b(j+8|0,0)|0;h=0;while(1){Qc(1024,0);la=h+1|0;if((la|0)==131072){pa=61448;qa=1;break}else{h=la}}do{h=qa*3|0;qa=((d[pa]|0)^h)<<8^h>>>8;pa=pa+1|0;}while((pa|0)!=(65544|0));pa=Gm(16)|0;h=pa;la=pa+16|0;c[pa+8>>2]=qa;qa=pa+12|0;ha=na;ja=c[ha+4>>2]|0;oa=pa;c[oa>>2]=c[ha>>2];c[oa+4>>2]=ja;if((na|0)!=0){Im(na)}hd(j);Rc(1024,12296,16392);c[k>>2]=225336;a[k+4|0]=1;$b(k+8|0,0)|0;j=0;while(1){Rc(1024,12296,16392);na=j+1|0;if((na|0)==131072){ra=12296;sa=1;break}else{j=na}}do{j=sa*3|0;sa=((d[ra]|0)^j)<<8^j>>>8;ra=ra+1|0;}while((ra|0)!=(16392|0));c[qa>>2]=sa;sa=pa+16|0;hd(k);Sc(1024,12296,16392);c[l>>2]=225352;a[l+4|0]=1;$b(l+8|0,0)|0;k=0;while(1){Sc(1024,12296,16392);pa=k+1|0;if((pa|0)==131072){ta=12296;ua=1;break}else{k=pa}}do{k=ua*3|0;ua=((d[ta]|0)^k)<<8^k>>>8;ta=ta+1|0;}while((ta|0)!=(16392|0));do{if((sa|0)==(la|0)){ta=la-h|0;k=ta>>2;pa=k+1|0;if(pa>>>0>1073741823){Ij(0)}if(k>>>0<536870911){qa=ta>>1;ra=qa>>>0<pa>>>0?pa:qa;if((ra|0)==0){va=0;wa=0}else{xa=ra;ya=50}}else{xa=1073741823;ya=50}if((ya|0)==50){va=xa;wa=Gm(xa<<2)|0}ra=wa+(k<<2)|0;k=wa+(va<<2)|0;if((ra|0)!=0){c[ra>>2]=ua}ra=wa+(pa<<2)|0;pa=h;$m(wa|0,pa|0,ta|0)|0;if((h|0)==0){za=k;Aa=ra;Ba=wa;break}Im(pa);za=k;Aa=ra;Ba=wa}else{if((sa|0)!=0){c[sa>>2]=ua}za=la;Aa=sa+4|0;Ba=h}}while(0);hd(l);Tc(1014,0,0);c[m>>2]=225368;a[m+4|0]=1;$b(m+8|0,0)|0;l=0;while(1){Tc(1014,0,0);h=l+1|0;if((h|0)==131072){Ca=12296;Da=1;break}else{l=h}}do{l=Da*3|0;Da=((d[Ca]|0)^l)<<8^l>>>8;Ca=Ca+1|0;}while((Ca|0)!=(16392|0));do{if((Aa|0)==(za|0)){Ca=za-Ba|0;l=Ca>>2;h=l+1|0;if(h>>>0>1073741823){Ij(0)}if(l>>>0<536870911){sa=Ca>>1;la=sa>>>0<h>>>0?h:sa;if((la|0)==0){Ea=0;Fa=0}else{Ga=la;ya=66}}else{Ga=1073741823;ya=66}if((ya|0)==66){Ea=Ga;Fa=Gm(Ga<<2)|0}la=Fa+(l<<2)|0;l=Fa+(Ea<<2)|0;if((la|0)!=0){c[la>>2]=Da}la=Fa+(h<<2)|0;h=Ba;$m(Fa|0,h|0,Ca|0)|0;if((Ba|0)==0){Ha=l;Ia=la;Ja=Fa;break}Im(h);Ha=l;Ia=la;Ja=Fa}else{if((Aa|0)!=0){c[Aa>>2]=Da}Ha=za;Ia=Aa+4|0;Ja=Ba}}while(0);hd(m);Uc(1024,0,0);c[n>>2]=225384;a[n+4|0]=1;$b(n+8|0,0)|0;m=0;while(1){Uc(1024,0,0);Ba=m+1|0;if((Ba|0)==131072){Ka=16392;La=1;break}else{m=Ba}}do{m=La*3|0;La=((d[Ka]|0)^m)<<8^m>>>8;Ka=Ka+1|0;}while((Ka|0)!=(20488|0));do{if((Ia|0)==(Ha|0)){Ka=Ha-Ja|0;m=Ka>>2;Ba=m+1|0;if(Ba>>>0>1073741823){Ij(0)}if(m>>>0<536870911){Aa=Ka>>1;za=Aa>>>0<Ba>>>0?Ba:Aa;if((za|0)==0){Ma=0;Na=0}else{Oa=za;ya=82}}else{Oa=1073741823;ya=82}if((ya|0)==82){Ma=Oa;Na=Gm(Oa<<2)|0}za=Na+(m<<2)|0;m=Na+(Ma<<2)|0;if((za|0)!=0){c[za>>2]=La}za=Na+(Ba<<2)|0;Ba=Ja;$m(Na|0,Ba|0,Ka|0)|0;if((Ja|0)==0){Pa=m;Qa=za;Ra=Na;break}Im(Ba);Pa=m;Qa=za;Ra=Na}else{if((Ia|0)!=0){c[Ia>>2]=La}Pa=Ha;Qa=Ia+4|0;Ra=Ja}}while(0);hd(n);Vc(4);c[o>>2]=225400;a[o+4|0]=1;$b(o+8|0,0)|0;n=0;while(1){Vc(4);Ja=n+1|0;if((Ja|0)==262144){Sa=61448;Ta=1;break}else{n=Ja}}do{n=Ta*3|0;Ta=((d[Sa]|0)^n)<<8^n>>>8;Sa=Sa+1|0;}while((Sa|0)!=(65544|0));do{if((Qa|0)==(Pa|0)){Sa=Pa-Ra|0;n=Sa>>2;Ja=n+1|0;if(Ja>>>0>1073741823){Ij(0)}if(n>>>0<536870911){Ia=Sa>>1;Ha=Ia>>>0<Ja>>>0?Ja:Ia;if((Ha|0)==0){Ua=0;Va=0}else{Wa=Ha;ya=98}}else{Wa=1073741823;ya=98}if((ya|0)==98){Ua=Wa;Va=Gm(Wa<<2)|0}Ha=Va+(n<<2)|0;n=Va+(Ua<<2)|0;if((Ha|0)!=0){c[Ha>>2]=Ta}Ha=Va+(Ja<<2)|0;Ja=Ra;$m(Va|0,Ja|0,Sa|0)|0;if((Ra|0)==0){Xa=n;Ya=Ha;Za=Va;break}Im(Ja);Xa=n;Ya=Ha;Za=Va}else{if((Qa|0)!=0){c[Qa>>2]=Ta}Xa=Pa;Ya=Qa+4|0;Za=Ra}}while(0);hd(o);Wc(8);c[p>>2]=225416;a[p+4|0]=1;$b(p+8|0,0)|0;o=0;while(1){Wc(8);Ra=o+1|0;if((Ra|0)==16384){_a=94216;$a=1;break}else{o=Ra}}do{o=$a*3|0;$a=((d[_a]|0)^o)<<8^o>>>8;_a=_a+1|0;}while((_a|0)!=(98312|0));do{if((Ya|0)==(Xa|0)){_a=Xa-Za|0;o=_a>>2;Ra=o+1|0;if(Ra>>>0>1073741823){Ij(0)}if(o>>>0<536870911){Qa=_a>>1;Pa=Qa>>>0<Ra>>>0?Ra:Qa;if((Pa|0)==0){ab=0;bb=0}else{cb=Pa;ya=114}}else{cb=1073741823;ya=114}if((ya|0)==114){ab=cb;bb=Gm(cb<<2)|0}Pa=bb+(o<<2)|0;o=bb+(ab<<2)|0;if((Pa|0)!=0){c[Pa>>2]=$a}Pa=bb+(Ra<<2)|0;Ra=Za;$m(bb|0,Ra|0,_a|0)|0;if((Za|0)==0){db=o;eb=Pa;fb=bb;break}Im(Ra);db=o;eb=Pa;fb=bb}else{if((Ya|0)!=0){c[Ya>>2]=$a}db=Xa;eb=Ya+4|0;fb=Za}}while(0);hd(p);Xc(b);c[q>>2]=225432;a[q+4|0]=1;$b(q+8|0,0)|0;p=0;do{Xc(b);p=p+1|0;}while((p|0)!=131072);p=c[b>>2]|0;do{if((eb|0)==(db|0)){b=db-fb|0;Za=b>>2;Ya=Za+1|0;if(Ya>>>0>1073741823){Ij(0)}if(Za>>>0<536870911){Xa=b>>1;$a=Xa>>>0<Ya>>>0?Ya:Xa;if(($a|0)==0){gb=0;hb=0}else{ib=$a;ya=129}}else{ib=1073741823;ya=129}if((ya|0)==129){gb=ib;hb=Gm(ib<<2)|0}$a=hb+(Za<<2)|0;Za=hb+(gb<<2)|0;if(($a|0)!=0){c[$a>>2]=p}$a=hb+(Ya<<2)|0;Ya=fb;$m(hb|0,Ya|0,b|0)|0;if((fb|0)==0){jb=Za;kb=$a;lb=hb;break}Im(Ya);jb=Za;kb=$a;lb=hb}else{if((eb|0)!=0){c[eb>>2]=p}jb=db;kb=eb+4|0;lb=fb}}while(0);hd(q);Yc(2056,4104,6152,12296,16392,20488);c[r>>2]=225448;a[r+4|0]=1;$b(r+8|0,0)|0;q=0;while(1){Yc(2056,4104,6152,12296,16392,20488);fb=q+1|0;if((fb|0)==131072){mb=12296;nb=1;break}else{q=fb}}while(1){q=nb*3|0;ob=((d[mb]|0)^q)<<8^q>>>8;q=mb+1|0;if((q|0)==(16392|0)){pb=2056;qb=1;break}else{nb=ob;mb=q}}do{mb=qb*3|0;qb=((d[pb]|0)^mb)<<8^mb>>>8;pb=pb+1|0;}while((pb|0)!=(4104|0));pb=qb+ob|0;do{if((kb|0)==(jb|0)){ob=jb-lb|0;qb=ob>>2;mb=qb+1|0;if(mb>>>0>1073741823){Ij(0)}if(qb>>>0<536870911){nb=ob>>1;q=nb>>>0<mb>>>0?mb:nb;if((q|0)==0){rb=0;sb=0}else{tb=q;ya=146}}else{tb=1073741823;ya=146}if((ya|0)==146){rb=tb;sb=Gm(tb<<2)|0}q=sb+(qb<<2)|0;qb=sb+(rb<<2)|0;if((q|0)!=0){c[q>>2]=pb}q=sb+(mb<<2)|0;mb=lb;$m(sb|0,mb|0,ob|0)|0;if((lb|0)==0){ub=qb;vb=q;wb=sb;break}Im(mb);ub=qb;vb=q;wb=sb}else{if((kb|0)!=0){c[kb>>2]=pb}ub=jb;vb=kb+4|0;wb=lb}}while(0);hd(r);Zc(0,4104,0,12296,0,0);c[s>>2]=225464;a[s+4|0]=1;$b(s+8|0,0)|0;r=0;while(1){Zc(0,4104,0,12296,0,0);lb=r+1|0;if((lb|0)==262144){xb=12296;yb=1;break}else{r=lb}}do{r=yb*3|0;yb=((d[xb]|0)^r)<<8^r>>>8;xb=xb+1|0;}while((xb|0)!=(16392|0));do{if((vb|0)==(ub|0)){xb=ub-wb|0;r=xb>>2;lb=r+1|0;if(lb>>>0>1073741823){Ij(0)}if(r>>>0<536870911){kb=xb>>1;jb=kb>>>0<lb>>>0?lb:kb;if((jb|0)==0){zb=0;Ab=0}else{Bb=jb;ya=162}}else{Bb=1073741823;ya=162}if((ya|0)==162){zb=Bb;Ab=Gm(Bb<<2)|0}jb=Ab+(r<<2)|0;r=Ab+(zb<<2)|0;if((jb|0)!=0){c[jb>>2]=yb}jb=Ab+(lb<<2)|0;lb=wb;$m(Ab|0,lb|0,xb|0)|0;if((wb|0)==0){Cb=r;Db=jb;Eb=Ab;break}Im(lb);Cb=r;Db=jb;Eb=Ab}else{if((vb|0)!=0){c[vb>>2]=yb}Cb=ub;Db=vb+4|0;Eb=wb}}while(0);hd(s);_c();c[t>>2]=225480;a[t+4|0]=1;$b(t+8|0,0)|0;s=0;while(1){_c();wb=s+1|0;if((wb|0)==131072){Fb=86024;Gb=1;break}else{s=wb}}do{s=Gb*3|0;Gb=((d[Fb]|0)^s)<<8^s>>>8;Fb=Fb+1|0;}while((Fb|0)!=(90120|0));do{if((Db|0)==(Cb|0)){Fb=Cb-Eb|0;s=Fb>>2;wb=s+1|0;if(wb>>>0>1073741823){Ij(0)}if(s>>>0<536870911){vb=Fb>>1;ub=vb>>>0<wb>>>0?wb:vb;if((ub|0)==0){Hb=0;Ib=0}else{Jb=ub;ya=178}}else{Jb=1073741823;ya=178}if((ya|0)==178){Hb=Jb;Ib=Gm(Jb<<2)|0}ub=Ib+(s<<2)|0;s=Ib+(Hb<<2)|0;if((ub|0)!=0){c[ub>>2]=Gb}ub=Ib+(wb<<2)|0;wb=Eb;$m(Ib|0,wb|0,Fb|0)|0;if((Eb|0)==0){Kb=s;Lb=ub;Mb=Ib;break}Im(wb);Kb=s;Lb=ub;Mb=Ib}else{if((Db|0)!=0){c[Db>>2]=Gb}Kb=Cb;Lb=Db+4|0;Mb=Eb}}while(0);hd(t);$c();c[u>>2]=225496;a[u+4|0]=1;$b(u+8|0,0)|0;t=0;while(1){$c();Eb=t+1|0;if((Eb|0)==262144){Nb=61448;Ob=1;break}else{t=Eb}}do{t=Ob*3|0;Ob=((d[Nb]|0)^t)<<8^t>>>8;Nb=Nb+1|0;}while((Nb|0)!=(65544|0));do{if((Lb|0)==(Kb|0)){Nb=Kb-Mb|0;t=Nb>>2;Eb=t+1|0;if(Eb>>>0>1073741823){Ij(0)}if(t>>>0<536870911){Db=Nb>>1;Cb=Db>>>0<Eb>>>0?Eb:Db;if((Cb|0)==0){Pb=0;Qb=0}else{Rb=Cb;ya=194}}else{Rb=1073741823;ya=194}if((ya|0)==194){Pb=Rb;Qb=Gm(Rb<<2)|0}Cb=Qb+(t<<2)|0;t=Qb+(Pb<<2)|0;if((Cb|0)!=0){c[Cb>>2]=Ob}Cb=Qb+(Eb<<2)|0;Eb=Mb;$m(Qb|0,Eb|0,Nb|0)|0;if((Mb|0)==0){Sb=t;Tb=Cb;Ub=Qb;break}Im(Eb);Sb=t;Tb=Cb;Ub=Qb}else{if((Lb|0)!=0){c[Lb>>2]=Ob}Sb=Kb;Tb=Lb+4|0;Ub=Mb}}while(0);hd(u);ad(8,8200);c[v>>2]=225512;a[v+4|0]=1;$b(v+8|0,0)|0;u=0;while(1){ad(8,8200);Mb=u+1|0;if((Mb|0)==524288){Vb=8;Wb=1;break}else{u=Mb}}do{u=Wb*3|0;Wb=((d[Vb]|0)^u)<<8^u>>>8;Vb=Vb+1|0;}while((Vb|0)!=(520|0));do{if((Tb|0)==(Sb|0)){Vb=Sb-Ub|0;u=Vb>>2;Mb=u+1|0;if(Mb>>>0>1073741823){Ij(0)}if(u>>>0<536870911){Lb=Vb>>1;Kb=Lb>>>0<Mb>>>0?Mb:Lb;if((Kb|0)==0){Xb=0;Yb=0}else{Zb=Kb;ya=210}}else{Zb=1073741823;ya=210}if((ya|0)==210){Xb=Zb;Yb=Gm(Zb<<2)|0}Kb=Yb+(u<<2)|0;u=Yb+(Xb<<2)|0;if((Kb|0)!=0){c[Kb>>2]=Wb}Kb=Yb+(Mb<<2)|0;Mb=Ub;$m(Yb|0,Mb|0,Vb|0)|0;if((Ub|0)==0){_b=u;ac=Kb;bc=Yb;break}Im(Mb);_b=u;ac=Kb;bc=Yb}else{if((Tb|0)!=0){c[Tb>>2]=Wb}_b=Sb;ac=Tb+4|0;bc=Ub}}while(0);hd(v);bd(2,4);c[w>>2]=225528;a[w+4|0]=1;$b(w+8|0,0)|0;v=0;do{bd(2,4);v=v+1|0;}while((v|0)!=131072);do{if((ac|0)==(_b|0)){v=_b-bc|0;Ub=v>>2;Tb=Ub+1|0;if(Tb>>>0>1073741823){Ij(0)}if(Ub>>>0<536870911){Sb=v>>1;Wb=Sb>>>0<Tb>>>0?Tb:Sb;if((Wb|0)==0){cc=0;dc=0}else{ec=Wb;ya=225}}else{ec=1073741823;ya=225}if((ya|0)==225){cc=ec;dc=Gm(ec<<2)|0}Wb=dc+(Ub<<2)|0;Ub=dc+(cc<<2)|0;if((Wb|0)!=0){c[Wb>>2]=0}Wb=dc+(Tb<<2)|0;Tb=bc;$m(dc|0,Tb|0,v|0)|0;if((bc|0)==0){fc=Ub;gc=Wb;hc=dc;break}Im(Tb);fc=Ub;gc=Wb;hc=dc}else{if((ac|0)!=0){c[ac>>2]=0}fc=_b;gc=ac+4|0;hc=bc}}while(0);hd(w);cd();c[x>>2]=225544;a[x+4|0]=1;$b(x+8|0,0)|0;w=0;while(1){cd();bc=w+1|0;if((bc|0)==131072){ic=57352;jc=1;break}else{w=bc}}do{w=jc*3|0;jc=((d[ic]|0)^w)<<8^w>>>8;ic=ic+1|0;}while((ic|0)!=(61448|0));do{if((gc|0)==(fc|0)){ic=fc-hc|0;w=ic>>2;bc=w+1|0;if(bc>>>0>1073741823){Ij(0)}if(w>>>0<536870911){ac=ic>>1;_b=ac>>>0<bc>>>0?bc:ac;if((_b|0)==0){kc=0}else{lc=_b;ya=241}}else{lc=1073741823;ya=241}if((ya|0)==241){kc=Gm(lc<<2)|0}_b=kc+(w<<2)|0;if((_b|0)!=0){c[_b>>2]=jc}_b=kc+(bc<<2)|0;bc=hc;$m(kc|0,bc|0,ic|0)|0;if((hc|0)==0){mc=_b;nc=kc;break}Im(bc);mc=_b;nc=kc}else{if((gc|0)!=0){c[gc>>2]=jc}mc=gc+4|0;nc=hc}}while(0);hd(x);x=(c[(c[56426]|0)+ -12>>2]|0)+225708|0;c[x>>2]=c[x>>2]&-75|8;x=fd(225704,225560)|0;if((nc|0)==(mc|0)){oc=0}else{hc=0;gc=nc;while(1){jc=(c[gc>>2]|0)+hc|0;kc=gc+4|0;if((kc|0)==(mc|0)){oc=jc;break}else{gc=kc;hc=jc}}}fd(zf(x,oc)|0,225576)|0;oc=mc-nc>>2;if((oc|0)!=0){mc=0;do{x=fd(225704,225584)|0;Af(x,c[nc+(mc<<2)>>2]|0)|0;mc=mc+1|0;}while(mc>>>0<oc>>>0)}fd(225704,225592)|0;if((nc|0)==0){i=e;return 0}Im(nc);i=e;return 0}function ed(a){a=a|0;mb(a|0)|0;La()}function fd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+40|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=h;a[l]=0;c[h+4>>2]=b;m=b;n=c[(c[m>>2]|0)+ -12>>2]|0;o=b;if((c[o+(n+16)>>2]|0)!=0){yf(h);i=e;return b|0}p=c[o+(n+72)>>2]|0;if((p|0)==0){q=n}else{nf(p)|0;q=c[(c[m>>2]|0)+ -12>>2]|0}a[l]=1;l=bn(d|0)|0;c[j>>2]=c[o+(q+24)>>2];if((c[o+(q+4)>>2]&176|0)==32){r=d+l|0}else{r=d}p=o+q|0;n=o+(q+76)|0;q=c[n>>2]|0;if((q|0)==-1){s=p;Ge(g,s);t=Rj(g,230352)|0;u=vc[c[(c[t>>2]|0)+28>>2]&15](t,32)|0;Qj(g);g=u<<24>>24;c[n>>2]=g;v=s;w=g}else{v=p;w=q}q=w&255;w=d+l|0;l=f;p=j;c[l+0>>2]=c[p+0>>2];gd(k,f,d,r,w,v,q);if((c[k>>2]|0)!=0){yf(h);i=e;return b|0}k=c[(c[m>>2]|0)+ -12>>2]|0;Ee(o+k|0,c[o+(k+16)>>2]|5);yf(h);i=e;return b|0}function gd(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;k=i;i=i+16|0;l=k;m=d;d=c[m>>2]|0;if((d|0)==0){c[b>>2]=0;i=k;return}n=g;g=e;o=n-g|0;p=h+12|0;h=c[p>>2]|0;q=(h|0)>(o|0)?h-o|0:0;o=f;h=o-g|0;do{if((h|0)>0){if((gc[c[(c[d>>2]|0)+48>>2]&31](d,e,h)|0)==(h|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);do{if((q|0)>0){if(q>>>0<11){h=q<<1&255;e=l;a[e]=h;r=e;s=h;t=l+1|0}else{h=q+16&-16;e=Gm(h)|0;c[l+8>>2]=e;g=h|1;c[l>>2]=g;c[l+4>>2]=q;r=l;s=g&255;t=e}Ym(t|0,j|0,q|0)|0;a[t+q|0]=0;if((s&1)==0){u=l+1|0}else{u=c[l+8>>2]|0}if((gc[c[(c[d>>2]|0)+48>>2]&31](d,u,q)|0)==(q|0)){if((a[r]&1)==0){break}Im(c[l+8>>2]|0);break}c[m>>2]=0;c[b>>2]=0;if((a[r]&1)==0){i=k;return}Im(c[l+8>>2]|0);i=k;return}}while(0);l=n-o|0;do{if((l|0)>0){if((gc[c[(c[d>>2]|0)+48>>2]&31](d,f,l)|0)==(l|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);c[p>>2]=0;c[b>>2]=d;i=k;return}function hd(b){b=b|0;var d=0,e=0,f=0;d=i;e=b+16|0;$b(e|0,0)|0;if((a[b+4|0]|0)==0){i=d;return}f=~~(+((c[b+20>>2]|0)-(c[b+12>>2]|0)|0)/1.0e3+ +(((c[e>>2]|0)-(c[b+8>>2]|0)|0)*1e3|0)+.5);fd(Bf(fd(fd(225704,c[b>>2]|0)|0,225600)|0,f)|0,225608)|0;i=d;return}function id(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+32|0;d=b;e=b+8|0;f=b+16|0;g=b+24|0;h=c[r>>2]|0;Ed(226328,h,226384);c[56404]=227756;c[225624>>2]=227776;c[225620>>2]=0;He(225624|0,226328);c[225696>>2]=0;c[225700>>2]=-1;j=c[s>>2]|0;c[56608]=227624;Oj(226436|0);c[226440>>2]=0;c[226444>>2]=0;c[226448>>2]=0;c[226452>>2]=0;c[226456>>2]=0;c[226460>>2]=0;c[56608]=226944;c[226464>>2]=j;Pj(g,226436|0);k=Rj(g,230416)|0;l=k;Qj(g);c[226468>>2]=l;c[226472>>2]=226392;a[226476|0]=(mc[c[(c[k>>2]|0)+28>>2]&63](l)|0)&1;c[56426]=227836;c[225708>>2]=227856;He(225708|0,226432);c[225780>>2]=0;c[225784>>2]=-1;l=c[q>>2]|0;c[56620]=227624;Oj(226484|0);c[226488>>2]=0;c[226492>>2]=0;c[226496>>2]=0;c[226500>>2]=0;c[226504>>2]=0;c[226508>>2]=0;c[56620]=226944;c[226512>>2]=l;Pj(f,226484|0);k=Rj(f,230416)|0;g=k;Qj(f);c[226516>>2]=g;c[226520>>2]=226400;a[226524|0]=(mc[c[(c[k>>2]|0)+28>>2]&63](g)|0)&1;c[56448]=227836;c[225796>>2]=227856;He(225796|0,226480);c[225868>>2]=0;c[225872>>2]=-1;g=c[(c[(c[56448]|0)+ -12>>2]|0)+225816>>2]|0;c[56470]=227836;c[225884>>2]=227856;He(225884|0,g);c[225956>>2]=0;c[225960>>2]=-1;c[(c[(c[56404]|0)+ -12>>2]|0)+225688>>2]=225704;g=(c[(c[56448]|0)+ -12>>2]|0)+225796|0;c[g>>2]=c[g>>2]|8192;c[(c[(c[56448]|0)+ -12>>2]|0)+225864>>2]=225704;qd(226528,h,226408|0);c[56492]=227796;c[225976>>2]=227816;c[225972>>2]=0;He(225976|0,226528);c[226048>>2]=0;c[226052>>2]=-1;c[56646]=227688;Oj(226588|0);c[226592>>2]=0;c[226596>>2]=0;c[226600>>2]=0;c[226604>>2]=0;c[226608>>2]=0;c[226612>>2]=0;c[56646]=226688;c[226616>>2]=j;Pj(e,226588|0);j=Rj(e,230424)|0;h=j;Qj(e);c[226620>>2]=h;c[226624>>2]=226416;a[226628|0]=(mc[c[(c[j>>2]|0)+28>>2]&63](h)|0)&1;c[56514]=227876;c[226060>>2]=227896;He(226060|0,226584);c[226132>>2]=0;c[226136>>2]=-1;c[56658]=227688;Oj(226636|0);c[226640>>2]=0;c[226644>>2]=0;c[226648>>2]=0;c[226652>>2]=0;c[226656>>2]=0;c[226660>>2]=0;c[56658]=226688;c[226664>>2]=l;Pj(d,226636|0);l=Rj(d,230424)|0;h=l;Qj(d);c[226668>>2]=h;c[226672>>2]=226424;a[226676|0]=(mc[c[(c[l>>2]|0)+28>>2]&63](h)|0)&1;c[56536]=227876;c[226148>>2]=227896;He(226148|0,226632);c[226220>>2]=0;c[226224>>2]=-1;h=c[(c[(c[56536]|0)+ -12>>2]|0)+226168>>2]|0;c[56558]=227876;c[226236>>2]=227896;He(226236|0,h);c[226308>>2]=0;c[226312>>2]=-1;c[(c[(c[56492]|0)+ -12>>2]|0)+226040>>2]=226056;h=(c[(c[56536]|0)+ -12>>2]|0)+226148|0;c[h>>2]=c[h>>2]|8192;c[(c[(c[56536]|0)+ -12>>2]|0)+226216>>2]=226056;i=b;return}function jd(a){a=a|0;a=i;nf(225704)|0;nf(225880)|0;tf(226056)|0;tf(226232)|0;i=a;return}function kd(a){a=a|0;var b=0;b=i;c[a>>2]=227688;Qj(a+4|0);i=b;return}function ld(a){a=a|0;var b=0;b=i;c[a>>2]=227688;Qj(a+4|0);Im(a);i=b;return}function md(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;mc[c[(c[b>>2]|0)+24>>2]&63](b)|0;f=Rj(d,230424)|0;d=f;c[b+36>>2]=d;a[b+44|0]=(mc[c[(c[f>>2]|0)+28>>2]&63](d)|0)&1;i=e;return}function nd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=b+8|0;f=a+36|0;g=a+40|0;h=d;j=d+8|0;k=d;d=a+32|0;while(1){a=c[f>>2]|0;l=wc[c[(c[a>>2]|0)+20>>2]&15](a,c[g>>2]|0,h,j,e)|0;a=(c[e>>2]|0)-k|0;if((Xb(h|0,1,a|0,c[d>>2]|0)|0)!=(a|0)){m=-1;n=5;break}if((l|0)==2){m=-1;n=5;break}else if((l|0)!=1){n=4;break}}if((n|0)==4){m=((Za(c[d>>2]|0)|0)!=0)<<31>>31;i=b;return m|0}else if((n|0)==5){i=b;return m|0}return 0}function od(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((a[b+44|0]|0)!=0){g=Xb(d|0,4,e|0,c[b+32>>2]|0)|0;i=f;return g|0}h=b;if((e|0)>0){j=d;k=0}else{g=0;i=f;return g|0}while(1){if((vc[c[(c[h>>2]|0)+52>>2]&15](b,c[j>>2]|0)|0)==-1){g=k;l=6;break}d=k+1|0;if((d|0)<(e|0)){j=j+4|0;k=d}else{g=d;l=6;break}}if((l|0)==6){i=f;return g|0}return 0}function pd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=(d|0)==-1;a:do{if(!k){c[g>>2]=d;if((a[b+44|0]|0)!=0){if((Xb(g|0,4,1,c[b+32>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}m=f;c[h>>2]=m;n=g+4|0;o=b+36|0;p=b+40|0;q=f+8|0;r=f;s=b+32|0;t=g;while(1){u=c[o>>2]|0;v=rc[c[(c[u>>2]|0)+12>>2]&15](u,c[p>>2]|0,t,n,j,m,q,h)|0;if((c[j>>2]|0)==(t|0)){l=-1;w=12;break}if((v|0)==3){w=7;break}u=(v|0)==1;if(!(v>>>0<2)){l=-1;w=12;break}v=(c[h>>2]|0)-r|0;if((Xb(m|0,1,v|0,c[s>>2]|0)|0)!=(v|0)){l=-1;w=12;break}if(u){t=u?c[j>>2]|0:t}else{break a}}if((w|0)==7){if((Xb(t|0,1,1,c[s>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}else if((w|0)==12){i=e;return l|0}}}while(0);l=k?0:d;i=e;return l|0}function qd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f;h=b;c[h>>2]=227688;j=b+4|0;Oj(j);k=b+8|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[h>>2]=226800;c[b+32>>2]=d;c[b+40>>2]=e;c[b+48>>2]=-1;a[b+52|0]=0;Pj(g,j);j=Rj(g,230424)|0;e=j;d=b+36|0;c[d>>2]=e;h=b+44|0;c[h>>2]=mc[c[(c[j>>2]|0)+24>>2]&63](e)|0;e=c[d>>2]|0;a[b+53|0]=(mc[c[(c[e>>2]|0)+28>>2]&63](e)|0)&1;if((c[h>>2]|0)>8){$i(226896)}else{Qj(g);i=f;return}}function rd(a){a=a|0;var b=0;b=i;c[a>>2]=227688;Qj(a+4|0);i=b;return}function sd(a){a=a|0;var b=0;b=i;c[a>>2]=227688;Qj(a+4|0);Im(a);i=b;return}function td(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Rj(d,230424)|0;d=f;g=b+36|0;c[g>>2]=d;h=b+44|0;c[h>>2]=mc[c[(c[f>>2]|0)+24>>2]&63](d)|0;d=c[g>>2]|0;a[b+53|0]=(mc[c[(c[d>>2]|0)+28>>2]&63](d)|0)&1;if((c[h>>2]|0)>8){$i(226896)}else{i=e;return}}function ud(a){a=a|0;var b=0,c=0;b=i;c=xd(a,0)|0;i=b;return c|0}function vd(a){a=a|0;var b=0,c=0;b=i;c=xd(a,1)|0;i=b;return c|0}function wd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;l=(a[k]|0)!=0;if((d|0)==-1){if(l){m=-1;i=e;return m|0}n=c[b+48>>2]|0;a[k]=(n|0)!=-1|0;m=n;i=e;return m|0}n=b+48|0;a:do{if(l){c[h>>2]=c[n>>2];o=c[b+36>>2]|0;p=f;q=rc[c[(c[o>>2]|0)+12>>2]&15](o,c[b+40>>2]|0,h,h+4|0,j,p,f+8|0,g)|0;if((q|0)==3){a[p]=c[n>>2];c[g>>2]=f+1}else if((q|0)==1|(q|0)==2){m=-1;i=e;return m|0}q=b+32|0;while(1){o=c[g>>2]|0;if(!(o>>>0>p>>>0)){break a}r=o+ -1|0;c[g>>2]=r;if((Ta(a[r]|0,c[q>>2]|0)|0)==-1){m=-1;break}}i=e;return m|0}}while(0);c[n>>2]=d;a[k]=1;m=d;i=e;return m|0}function xd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;if((a[k]|0)!=0){l=b+48|0;m=c[l>>2]|0;if(!d){n=m;i=e;return n|0}c[l>>2]=-1;a[k]=0;n=m;i=e;return n|0}m=c[b+44>>2]|0;k=(m|0)>1?m:1;a:do{if((k|0)>0){m=b+32|0;l=0;while(1){o=Nb(c[m>>2]|0)|0;if((o|0)==-1){n=-1;break}a[f+l|0]=o;l=l+1|0;if((l|0)>=(k|0)){break a}}i=e;return n|0}}while(0);b:do{if((a[b+53|0]|0)==0){l=b+40|0;m=b+36|0;o=f;p=g+4|0;q=b+32|0;r=k;while(1){s=c[l>>2]|0;t=s;u=c[t>>2]|0;v=c[t+4>>2]|0;t=c[m>>2]|0;w=f+r|0;x=rc[c[(c[t>>2]|0)+16>>2]&15](t,s,o,w,h,g,p,j)|0;if((x|0)==3){y=14;break}else if((x|0)==2){n=-1;y=22;break}else if((x|0)!=1){z=r;break b}x=c[l>>2]|0;c[x>>2]=u;c[x+4>>2]=v;if((r|0)==8){n=-1;y=22;break}v=Nb(c[q>>2]|0)|0;if((v|0)==-1){n=-1;y=22;break}a[w]=v;r=r+1|0}if((y|0)==14){c[g>>2]=a[o]|0;z=r;break}else if((y|0)==22){i=e;return n|0}}else{c[g>>2]=a[f]|0;z=k}}while(0);if(d){d=c[g>>2]|0;c[b+48>>2]=d;n=d;i=e;return n|0}d=b+32|0;b=z;while(1){if((b|0)<=0){break}z=b+ -1|0;if((Ta(a[f+z|0]|0,c[d>>2]|0)|0)==-1){n=-1;y=22;break}else{b=z}}if((y|0)==22){i=e;return n|0}n=c[g>>2]|0;i=e;return n|0}function yd(a){a=a|0;var b=0;b=i;c[a>>2]=227624;Qj(a+4|0);i=b;return}function zd(a){a=a|0;var b=0;b=i;c[a>>2]=227624;Qj(a+4|0);Im(a);i=b;return}function Ad(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;mc[c[(c[b>>2]|0)+24>>2]&63](b)|0;f=Rj(d,230416)|0;d=f;c[b+36>>2]=d;a[b+44|0]=(mc[c[(c[f>>2]|0)+28>>2]&63](d)|0)&1;i=e;return}function Bd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+16|0;d=b;e=b+8|0;f=a+36|0;g=a+40|0;h=d;j=d+8|0;k=d;d=a+32|0;while(1){a=c[f>>2]|0;l=wc[c[(c[a>>2]|0)+20>>2]&15](a,c[g>>2]|0,h,j,e)|0;a=(c[e>>2]|0)-k|0;if((Xb(h|0,1,a|0,c[d>>2]|0)|0)!=(a|0)){m=-1;n=5;break}if((l|0)==2){m=-1;n=5;break}else if((l|0)!=1){n=4;break}}if((n|0)==4){m=((Za(c[d>>2]|0)|0)!=0)<<31>>31;i=b;return m|0}else if((n|0)==5){i=b;return m|0}return 0}function Cd(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;if((a[b+44|0]|0)!=0){h=Xb(e|0,1,f|0,c[b+32>>2]|0)|0;i=g;return h|0}j=b;if((f|0)>0){k=e;l=0}else{h=0;i=g;return h|0}while(1){if((vc[c[(c[j>>2]|0)+52>>2]&15](b,d[k]|0)|0)==-1){h=l;m=6;break}e=l+1|0;if((e|0)<(f|0)){k=k+1|0;l=e}else{h=e;m=6;break}}if((m|0)==6){i=g;return h|0}return 0}function Dd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=(d|0)==-1;a:do{if(!k){a[g]=d;if((a[b+44|0]|0)!=0){if((Xb(g|0,1,1,c[b+32>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}m=f;c[h>>2]=m;n=g+1|0;o=b+36|0;p=b+40|0;q=f+8|0;r=f;s=b+32|0;t=g;while(1){u=c[o>>2]|0;v=rc[c[(c[u>>2]|0)+12>>2]&15](u,c[p>>2]|0,t,n,j,m,q,h)|0;if((c[j>>2]|0)==(t|0)){l=-1;w=12;break}if((v|0)==3){w=7;break}u=(v|0)==1;if(!(v>>>0<2)){l=-1;w=12;break}v=(c[h>>2]|0)-r|0;if((Xb(m|0,1,v|0,c[s>>2]|0)|0)!=(v|0)){l=-1;w=12;break}if(u){t=u?c[j>>2]|0:t}else{break a}}if((w|0)==7){if((Xb(t|0,1,1,c[s>>2]|0)|0)==1){break}else{l=-1}i=e;return l|0}else if((w|0)==12){i=e;return l|0}}}while(0);l=k?0:d;i=e;return l|0}function Ed(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f;h=b;c[h>>2]=227624;j=b+4|0;Oj(j);k=b+8|0;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;c[k+12>>2]=0;c[k+16>>2]=0;c[k+20>>2]=0;c[h>>2]=227056;c[b+32>>2]=d;c[b+40>>2]=e;c[b+48>>2]=-1;a[b+52|0]=0;Pj(g,j);j=Rj(g,230416)|0;e=j;d=b+36|0;c[d>>2]=e;h=b+44|0;c[h>>2]=mc[c[(c[j>>2]|0)+24>>2]&63](e)|0;e=c[d>>2]|0;a[b+53|0]=(mc[c[(c[e>>2]|0)+28>>2]&63](e)|0)&1;if((c[h>>2]|0)>8){$i(226896)}else{Qj(g);i=f;return}}function Fd(a){a=a|0;var b=0;b=i;c[a>>2]=227624;Qj(a+4|0);i=b;return}function Gd(a){a=a|0;var b=0;b=i;c[a>>2]=227624;Qj(a+4|0);Im(a);i=b;return}function Hd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Rj(d,230416)|0;d=f;g=b+36|0;c[g>>2]=d;h=b+44|0;c[h>>2]=mc[c[(c[f>>2]|0)+24>>2]&63](d)|0;d=c[g>>2]|0;a[b+53|0]=(mc[c[(c[d>>2]|0)+28>>2]&63](d)|0)&1;if((c[h>>2]|0)>8){$i(226896)}else{i=e;return}}function Id(a){a=a|0;var b=0,c=0;b=i;c=Ld(a,0)|0;i=b;return c|0}function Jd(a){a=a|0;var b=0,c=0;b=i;c=Ld(a,1)|0;i=b;return c|0}function Kd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+32|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=b+52|0;l=(a[k]|0)!=0;if((d|0)==-1){if(l){m=-1;i=e;return m|0}n=c[b+48>>2]|0;a[k]=(n|0)!=-1|0;m=n;i=e;return m|0}n=b+48|0;a:do{if(l){a[h]=c[n>>2];o=c[b+36>>2]|0;p=f;q=rc[c[(c[o>>2]|0)+12>>2]&15](o,c[b+40>>2]|0,h,h+1|0,j,p,f+8|0,g)|0;if((q|0)==3){a[p]=c[n>>2];c[g>>2]=f+1}else if((q|0)==1|(q|0)==2){m=-1;i=e;return m|0}q=b+32|0;while(1){o=c[g>>2]|0;if(!(o>>>0>p>>>0)){break a}r=o+ -1|0;c[g>>2]=r;if((Ta(a[r]|0,c[q>>2]|0)|0)==-1){m=-1;break}}i=e;return m|0}}while(0);c[n>>2]=d;a[k]=1;m=d;i=e;return m|0}function Ld(b,e){b=b|0;e=e|0;var f=0,g=0,h=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;f=i;i=i+32|0;g=f;h=f+8|0;j=f+16|0;k=f+24|0;l=b+52|0;if((a[l]|0)!=0){m=b+48|0;n=c[m>>2]|0;if(!e){o=n;i=f;return o|0}c[m>>2]=-1;a[l]=0;o=n;i=f;return o|0}n=c[b+44>>2]|0;l=(n|0)>1?n:1;a:do{if((l|0)>0){n=b+32|0;m=0;while(1){p=Nb(c[n>>2]|0)|0;if((p|0)==-1){o=-1;break}a[g+m|0]=p;m=m+1|0;if((m|0)>=(l|0)){break a}}i=f;return o|0}}while(0);b:do{if((a[b+53|0]|0)==0){m=b+40|0;n=b+36|0;p=g;q=h+1|0;r=b+32|0;s=l;while(1){t=c[m>>2]|0;u=t;v=c[u>>2]|0;w=c[u+4>>2]|0;u=c[n>>2]|0;x=g+s|0;y=rc[c[(c[u>>2]|0)+16>>2]&15](u,t,p,x,j,h,q,k)|0;if((y|0)==3){z=14;break}else if((y|0)==2){o=-1;z=23;break}else if((y|0)!=1){A=s;break b}y=c[m>>2]|0;c[y>>2]=v;c[y+4>>2]=w;if((s|0)==8){o=-1;z=23;break}w=Nb(c[r>>2]|0)|0;if((w|0)==-1){o=-1;z=23;break}a[x]=w;s=s+1|0}if((z|0)==14){a[h]=a[p]|0;A=s;break}else if((z|0)==23){i=f;return o|0}}else{a[h]=a[g]|0;A=l}}while(0);do{if(e){l=a[h]|0;c[b+48>>2]=l&255;B=l}else{l=b+32|0;k=A;while(1){if((k|0)<=0){z=21;break}j=k+ -1|0;if((Ta(d[g+j|0]|0,c[l>>2]|0)|0)==-1){o=-1;z=23;break}else{k=j}}if((z|0)==21){B=a[h]|0;break}else if((z|0)==23){i=f;return o|0}}}while(0);o=B&255;i=f;return o|0}function Md(){var a=0;a=i;id(0);Ra(111,226320,p|0)|0;i=a;return}function Nd(a){a=a|0;i=i;return}function Od(a){a=a|0;var b=0;b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;i=i;return}function Pd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[d>>2]|0;c[d>>2]=e+ -1;if((e|0)!=0){f=0;i=b;return f|0}jc[c[(c[a>>2]|0)+8>>2]&127](a);f=1;i=b;return f|0}function Qd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a>>2]=227200;e=bn(b|0)|0;f=Hm(e+13|0)|0;c[f+4>>2]=e;c[f>>2]=e;g=f+12|0;c[a+4>>2]=g;c[f+8>>2]=0;$m(g|0,b|0,e+1|0)|0;i=d;return}function Rd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=227200;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Jm((c[d>>2]|0)+ -12|0)}Mb(a|0);Im(a);i=b;return}function Sd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=227200;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)>=0){g=a;Mb(g|0);i=b;return}Jm((c[d>>2]|0)+ -12|0);g=a;Mb(g|0);i=b;return}function Td(a){a=a|0;i=i;return c[a+4>>2]|0}function Ud(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;c[b>>2]=227224;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=bn(f|0)|0;g=Hm(d+13|0)|0;c[g+4>>2]=d;c[g>>2]=d;h=g+12|0;c[b+4>>2]=h;c[g+8>>2]=0;$m(h|0,f|0,d+1|0)|0;i=e;return}function Vd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a>>2]=227224;e=bn(b|0)|0;f=Hm(e+13|0)|0;c[f+4>>2]=e;c[f>>2]=e;g=f+12|0;c[a+4>>2]=g;c[f+8>>2]=0;$m(g|0,b|0,e+1|0)|0;i=d;return}function Wd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=227224;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Jm((c[d>>2]|0)+ -12|0)}Mb(a|0);Im(a);i=b;return}function Xd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=227224;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)>=0){g=a;Mb(g|0);i=b;return}Jm((c[d>>2]|0)+ -12|0);g=a;Mb(g|0);i=b;return}function Yd(a){a=a|0;i=i;return c[a+4>>2]|0}function Zd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;c[a>>2]=227200;d=a+4|0;e=(c[d>>2]|0)+ -4|0;f=c[e>>2]|0;c[e>>2]=f+ -1;if((f+ -1|0)<0){Jm((c[d>>2]|0)+ -12|0)}Mb(a|0);Im(a);i=b;return}function _d(a){a=a|0;i=i;return}function $d(a,b,d){a=a|0;b=b|0;d=d|0;c[a>>2]=d;c[a+4>>2]=b;i=i;return}function ae(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e;oc[c[(c[a>>2]|0)+12>>2]&3](f,a,b);if((c[f+4>>2]|0)!=(c[d+4>>2]|0)){g=0;i=e;return g|0}g=(c[f>>2]|0)==(c[d>>2]|0);i=e;return g|0}function be(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((c[b+4>>2]|0)!=(a|0)){f=0;i=e;return f|0}f=(c[b>>2]|0)==(d|0);i=e;return f|0}function ce(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;d=i;f=_b(e|0)|0;e=bn(f|0)|0;if(e>>>0>4294967279){ie(0)}if(e>>>0<11){a[b]=e<<1;g=b+1|0;$m(g|0,f|0,e|0)|0;h=g+e|0;a[h]=0;i=d;return}else{j=e+16&-16;k=Gm(j)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=e;g=k;$m(g|0,f|0,e|0)|0;h=g+e|0;a[h]=0;i=d;return}}function de(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f;h=d;j=c[h>>2]|0;k=e;do{if((j|0)!=0){l=a[k]|0;if((l&1)==0){m=(l&255)>>>1}else{m=c[e+4>>2]|0}if((m|0)==0){n=j}else{se(e,227376,2)|0;n=c[h>>2]|0}l=c[d+4>>2]|0;oc[c[(c[l>>2]|0)+24>>2]&3](g,l,n);l=g;o=a[l]|0;if((o&1)==0){p=g+1|0;q=(o&255)>>>1}else{p=c[g+8>>2]|0;q=c[g+4>>2]|0}se(e,p,q)|0;if((a[l]&1)==0){break}Im(c[g+8>>2]|0)}}while(0);g=b;c[g+0>>2]=c[k+0>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;i=f;return}function ee(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+32|0;g=f;h=f+16|0;j=bn(e|0)|0;if(j>>>0>4294967279){ie(0)}if(j>>>0<11){a[h]=j<<1;k=h+1|0}else{l=j+16&-16;m=Gm(l)|0;c[h+8>>2]=m;c[h>>2]=l|1;c[h+4>>2]=j;k=m}$m(k|0,e|0,j|0)|0;a[k+j|0]=0;de(g,d,h);Ud(b,g);if(!((a[g]&1)==0)){Im(c[g+8>>2]|0)}if(!((a[h]&1)==0)){Im(c[h+8>>2]|0)}c[b>>2]=227392;h=d;d=c[h+4>>2]|0;g=b+8|0;c[g>>2]=c[h>>2];c[g+4>>2]=d;i=f;return}function fe(a){a=a|0;var b=0;b=i;Xd(a);Im(a);i=b;return}function ge(a){a=a|0;var b=0;b=i;Xd(a);i=b;return}function he(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;Zb(227528)|0;if((c[a>>2]|0)==1){do{Da(227552,227528)|0;}while((c[a>>2]|0)==1)}if((c[a>>2]|0)==0){c[a>>2]=1;Ab(227528)|0;jc[d&127](b);Zb(227528)|0;c[a>>2]=-1;Ab(227528)|0;Cb(227552)|0;i=e;return}else{Ab(227528)|0;i=e;return}}function ie(a){a=a|0;a=Va(8)|0;Qd(a,227600);c[a>>2]=227280;xb(a|0,227320,9)}function je(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=d;if((a[f]&1)==0){g=b;c[g+0>>2]=c[f+0>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];i=e;return}f=c[d+8>>2]|0;g=c[d+4>>2]|0;if(g>>>0>4294967279){ie(0)}if(g>>>0<11){a[b]=g<<1;h=b+1|0}else{d=g+16&-16;j=Gm(d)|0;c[b+8>>2]=j;c[b>>2]=d|1;c[b+4>>2]=g;h=j}$m(h|0,f|0,g|0)|0;a[h+g|0]=0;i=e;return}function ke(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(e>>>0>4294967279){ie(0)}if(e>>>0<11){a[b]=e<<1;g=b+1|0}else{h=e+16&-16;j=Gm(h)|0;c[b+8>>2]=j;c[b>>2]=h|1;c[b+4>>2]=e;g=j}$m(g|0,d|0,e|0)|0;a[g+e|0]=0;i=f;return}function le(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;if(d>>>0>4294967279){ie(0)}if(d>>>0<11){a[b]=d<<1;g=b+1|0}else{h=d+16&-16;j=Gm(h)|0;c[b+8>>2]=j;c[b>>2]=h|1;c[b+4>>2]=d;g=j}Ym(g|0,e|0,d|0)|0;a[g+d|0]=0;i=f;return}function me(b){b=b|0;var d=0;d=i;if((a[b]&1)==0){i=d;return}Im(c[b+8>>2]|0);i=d;return}function ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=bn(d|0)|0;g=b;h=a[g]|0;if((h&1)==0){j=h;k=10}else{h=c[b>>2]|0;j=h&255;k=(h&-2)+ -1|0}h=(j&1)==0;if(k>>>0<f>>>0){if(h){l=(j&255)>>>1}else{l=c[b+4>>2]|0}te(b,k,f-k|0,l,0,l,f,d);i=e;return b|0}if(h){m=b+1|0}else{m=c[b+8>>2]|0}an(m|0,d|0,f|0)|0;a[m+f|0]=0;if((a[g]&1)==0){a[g]=f<<1;i=e;return b|0}else{c[b+4>>2]=f;i=e;return b|0}return 0}function oe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=b;h=a[g]|0;j=(h&1)==0;if(j){k=(h&255)>>>1}else{k=c[b+4>>2]|0}if(k>>>0<d>>>0){pe(b,d-k|0,e)|0;i=f;return}if(j){a[b+d+1|0]=0;a[g]=d<<1;i=f;return}else{a[(c[b+8>>2]|0)+d|0]=0;c[b+4>>2]=d;i=f;return}}function pe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if((d|0)==0){i=f;return b|0}g=b;h=a[g]|0;if((h&1)==0){j=h;k=10}else{h=c[b>>2]|0;j=h&255;k=(h&-2)+ -1|0}if((j&1)==0){l=(j&255)>>>1}else{l=c[b+4>>2]|0}if((k-l|0)>>>0<d>>>0){ue(b,k,d-k+l|0,l,l,0,0);m=a[g]|0}else{m=j}if((m&1)==0){n=b+1|0}else{n=c[b+8>>2]|0}Ym(n+l|0,e|0,d|0)|0;e=l+d|0;if((a[g]&1)==0){a[g]=e<<1}else{c[b+4>>2]=e}a[n+e|0]=0;i=f;return b|0}function qe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if(d>>>0>4294967279){ie(0)}f=b;g=a[f]|0;if((g&1)==0){h=g;j=10}else{g=c[b>>2]|0;h=g&255;j=(g&-2)+ -1|0}if((h&1)==0){k=(h&255)>>>1}else{k=c[b+4>>2]|0}g=k>>>0>d>>>0?k:d;if(g>>>0<11){l=10}else{l=(g+16&-16)+ -1|0}if((l|0)==(j|0)){i=e;return}do{if((l|0)==10){m=b+1|0;n=0;o=c[b+8>>2]|0;p=1}else{g=l+1|0;if(l>>>0>j>>>0){q=Gm(g)|0}else{q=Gm(g)|0}if((h&1)==0){m=q;n=1;o=b+1|0;p=0;break}else{m=q;n=1;o=c[b+8>>2]|0;p=1;break}}}while(0);if((h&1)==0){r=(h&255)>>>1}else{r=c[b+4>>2]|0}$m(m|0,o|0,r+1|0)|0;if(p){Im(o)}if(n){c[b>>2]=l+1|1;c[b+4>>2]=k;c[b+8>>2]=m;i=e;return}else{a[f]=k<<1;i=e;return}}function re(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b;g=a[f]|0;h=(g&1)!=0;if(h){j=(c[b>>2]&-2)+ -1|0;k=c[b+4>>2]|0}else{j=10;k=(g&255)>>>1}if((k|0)==(j|0)){ue(b,j,1,j,j,0,0);if((a[f]&1)==0){l=7}else{l=8}}else{if(h){l=8}else{l=7}}if((l|0)==7){a[f]=(k<<1)+2;m=b+1|0;n=k+1|0;o=m+k|0;a[o]=d;p=m+n|0;a[p]=0;i=e;return}else if((l|0)==8){l=c[b+8>>2]|0;f=k+1|0;c[b+4>>2]=f;m=l;n=f;o=m+k|0;a[o]=d;p=m+n|0;a[p]=0;i=e;return}}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b;h=a[g]|0;if((h&1)==0){j=10;k=h}else{h=c[b>>2]|0;j=(h&-2)+ -1|0;k=h&255}if((k&1)==0){l=(k&255)>>>1}else{l=c[b+4>>2]|0}if((j-l|0)>>>0<e>>>0){te(b,j,e-j+l|0,l,l,0,e,d);i=f;return b|0}if((e|0)==0){i=f;return b|0}if((k&1)==0){m=b+1|0}else{m=c[b+8>>2]|0}$m(m+l|0,d|0,e|0)|0;d=l+e|0;if((a[g]&1)==0){a[g]=d<<1}else{c[b+4>>2]=d}a[m+d|0]=0;i=f;return b|0}function te(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((-18-d|0)>>>0<e>>>0){ie(0)}if((a[b]&1)==0){m=b+1|0}else{m=c[b+8>>2]|0}do{if(d>>>0<2147483623){n=e+d|0;o=d<<1;p=n>>>0<o>>>0?o:n;if(p>>>0<11){q=11;break}q=p+16&-16}else{q=-17}}while(0);e=Gm(q)|0;if((g|0)!=0){$m(e|0,m|0,g|0)|0}if((j|0)!=0){$m(e+g|0,k|0,j|0)|0}k=f-h|0;if((k|0)!=(g|0)){$m(e+(j+g)|0,m+(h+g)|0,k-g|0)|0}if((d|0)==10){r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+u|0;a[w]=0;i=l;return}Im(m);r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+u|0;a[w]=0;i=l;return}function ue(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=i;if((-17-d|0)>>>0<e>>>0){ie(0)}if((a[b]&1)==0){l=b+1|0}else{l=c[b+8>>2]|0}do{if(d>>>0<2147483623){m=e+d|0;n=d<<1;o=m>>>0<n>>>0?n:m;if(o>>>0<11){p=11;break}p=o+16&-16}else{p=-17}}while(0);e=Gm(p)|0;if((g|0)!=0){$m(e|0,l|0,g|0)|0}o=f-h|0;if((o|0)!=(g|0)){$m(e+(j+g)|0,l+(h+g)|0,o-g|0)|0}if((d|0)==10){q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}Im(l);q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}function ve(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(e>>>0>1073741807){ie(0)}if(e>>>0<2){a[b]=e<<1;g=b+4|0;cm(g,d,e)|0;h=g+(e<<2)|0;c[h>>2]=0;i=f;return}else{j=e+4&-4;k=Gm(j<<2)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=e;g=k;cm(g,d,e)|0;h=g+(e<<2)|0;c[h>>2]=0;i=f;return}}function we(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if(d>>>0>1073741807){ie(0)}if(d>>>0<2){a[b]=d<<1;g=b+4|0;em(g,e,d)|0;h=g+(d<<2)|0;c[h>>2]=0;i=f;return}else{j=d+4&-4;k=Gm(j<<2)|0;c[b+8>>2]=k;c[b>>2]=j|1;c[b+4>>2]=d;g=k;em(g,e,d)|0;h=g+(d<<2)|0;c[h>>2]=0;i=f;return}}function xe(b){b=b|0;var d=0;d=i;if((a[b]&1)==0){i=d;return}Im(c[b+8>>2]|0);i=d;return}function ye(a,b){a=a|0;b=b|0;var c=0,d=0;c=i;d=ze(a,b,bm(b)|0)|0;i=c;return d|0}function ze(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b;h=a[g]|0;if((h&1)==0){j=1;k=h}else{h=c[b>>2]|0;j=(h&-2)+ -1|0;k=h&255}h=(k&1)==0;if(j>>>0<e>>>0){if(h){l=(k&255)>>>1}else{l=c[b+4>>2]|0}Ce(b,j,e-j|0,l,0,l,e,d);i=f;return b|0}if(h){m=b+4|0}else{m=c[b+8>>2]|0}dm(m,d,e)|0;c[m+(e<<2)>>2]=0;if((a[g]&1)==0){a[g]=e<<1;i=f;return b|0}else{c[b+4>>2]=e;i=f;return b|0}return 0}function Ae(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;if(d>>>0>1073741807){ie(0)}f=b;g=a[f]|0;if((g&1)==0){h=g;j=1}else{g=c[b>>2]|0;h=g&255;j=(g&-2)+ -1|0}if((h&1)==0){k=(h&255)>>>1}else{k=c[b+4>>2]|0}g=k>>>0>d>>>0?k:d;if(g>>>0<2){l=1}else{l=(g+4&-4)+ -1|0}if((l|0)==(j|0)){i=e;return}do{if((l|0)==1){m=b+4|0;n=0;o=c[b+8>>2]|0;p=1}else{g=(l<<2)+4|0;if(l>>>0>j>>>0){q=Gm(g)|0}else{q=Gm(g)|0}g=q;if((h&1)==0){m=g;n=1;o=b+4|0;p=0;break}else{m=g;n=1;o=c[b+8>>2]|0;p=1;break}}}while(0);if((h&1)==0){r=(h&255)>>>1}else{r=c[b+4>>2]|0}cm(m,o,r+1|0)|0;if(p){Im(o)}if(n){c[b>>2]=l+1|1;c[b+4>>2]=k;c[b+8>>2]=m;i=e;return}else{a[f]=k<<1;i=e;return}}function Be(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;f=b;g=a[f]|0;h=(g&1)!=0;if(h){j=(c[b>>2]&-2)+ -1|0;k=c[b+4>>2]|0}else{j=1;k=(g&255)>>>1}if((k|0)==(j|0)){De(b,j,1,j,j,0,0);if((a[f]&1)==0){l=7}else{l=8}}else{if(h){l=8}else{l=7}}if((l|0)==7){a[f]=(k<<1)+2;m=b+4|0;n=k+1|0;o=m+(k<<2)|0;c[o>>2]=d;p=m+(n<<2)|0;c[p>>2]=0;i=e;return}else if((l|0)==8){l=c[b+8>>2]|0;f=k+1|0;c[b+4>>2]=f;m=l;n=f;o=m+(k<<2)|0;c[o>>2]=d;p=m+(n<<2)|0;c[p>>2]=0;i=e;return}}function Ce(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;l=i;if((1073741806-d|0)>>>0<e>>>0){ie(0)}if((a[b]&1)==0){m=b+4|0}else{m=c[b+8>>2]|0}do{if(d>>>0<536870887){n=e+d|0;o=d<<1;p=n>>>0<o>>>0?o:n;if(p>>>0<2){q=2;break}q=p+4&-4}else{q=1073741807}}while(0);e=Gm(q<<2)|0;if((g|0)!=0){cm(e,m,g)|0}if((j|0)!=0){cm(e+(g<<2)|0,k,j)|0}k=f-h|0;if((k|0)!=(g|0)){cm(e+(j+g<<2)|0,m+(h+g<<2)|0,k-g|0)|0}if((d|0)==1){r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+(u<<2)|0;c[w>>2]=0;i=l;return}Im(m);r=b+8|0;c[r>>2]=e;s=q|1;t=b;c[t>>2]=s;u=k+j|0;v=b+4|0;c[v>>2]=u;w=e+(u<<2)|0;c[w>>2]=0;i=l;return}function De(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;k=i;if((1073741807-d|0)>>>0<e>>>0){ie(0)}if((a[b]&1)==0){l=b+4|0}else{l=c[b+8>>2]|0}do{if(d>>>0<536870887){m=e+d|0;n=d<<1;o=m>>>0<n>>>0?n:m;if(o>>>0<2){p=2;break}p=o+4&-4}else{p=1073741807}}while(0);e=Gm(p<<2)|0;if((g|0)!=0){cm(e,l,g)|0}o=f-h|0;if((o|0)!=(g|0)){cm(e+(j+g<<2)|0,l+(h+g<<2)|0,o-g|0)|0}if((d|0)==1){q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}Im(l);q=b+8|0;c[q>>2]=e;r=p|1;s=b;c[s>>2]=r;i=k;return}function Ee(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e;g=e+8|0;h=(c[b+24>>2]|0)==0;if(h){c[b+16>>2]=d|1}else{c[b+16>>2]=d}if(((h&1|d)&c[b+20>>2]|0)==0){i=e;return}e=Va(16)|0;do{if((a[227968]|0)==0){if((Na(227968)|0)==0){break}c[56990]=228664;Ra(40,227960,p|0)|0;_a(227968)}}while(0);b=e;d=g;c[d>>2]=1;c[d+4>>2]=227960;d=f;h=g;c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];ee(b,f,228016);c[e>>2]=227984;xb(e|0,228064,36)}function Fe(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;c[a>>2]=228008;d=c[a+40>>2]|0;e=a+32|0;f=a+36|0;if((d|0)!=0){g=d;do{g=g+ -1|0;oc[c[(c[e>>2]|0)+(g<<2)>>2]&3](0,a,c[(c[f>>2]|0)+(g<<2)>>2]|0);}while((g|0)!=0)}Qj(a+28|0);Cm(c[e>>2]|0);Cm(c[f>>2]|0);Cm(c[a+48>>2]|0);Cm(c[a+60>>2]|0);i=b;return}function Ge(a,b){a=a|0;b=b|0;var c=0;c=i;Pj(a,b+28|0);i=c;return}function He(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;c[a+24>>2]=b;c[a+16>>2]=(b|0)==0;c[a+20>>2]=0;c[a+4>>2]=4098;c[a+12>>2]=0;c[a+8>>2]=6;b=a+28|0;e=a+32|0;a=e+40|0;do{c[e>>2]=0;e=e+4|0}while((e|0)<(a|0));Oj(b);i=d;return}function Ie(a){a=a|0;var b=0;b=i;c[a>>2]=227624;Qj(a+4|0);Im(a);i=b;return}function Je(a){a=a|0;var b=0;b=i;c[a>>2]=227624;Qj(a+4|0);i=b;return}function Ke(a,b){a=a|0;b=b|0;i=i;return}function Le(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return a|0}function Me(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=a;c[g>>2]=0;c[g+4>>2]=0;g=a+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=i;return}function Ne(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=a;c[e>>2]=0;c[e+4>>2]=0;e=a+8|0;c[e>>2]=-1;c[e+4>>2]=-1;i=i;return}function Oe(a){a=a|0;i=i;return 0}function Pe(a){a=a|0;i=i;return 0}function Qe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b;if((e|0)<=0){h=0;i=f;return h|0}j=b+12|0;k=b+16|0;l=d;d=0;while(1){m=c[j>>2]|0;if(m>>>0<(c[k>>2]|0)>>>0){c[j>>2]=m+1;n=a[m]|0}else{m=mc[c[(c[g>>2]|0)+40>>2]&63](b)|0;if((m|0)==-1){h=d;o=8;break}n=m&255}a[l]=n;m=d+1|0;if((m|0)<(e|0)){l=l+1|0;d=m}else{h=m;o=8;break}}if((o|0)==8){i=f;return h|0}return 0}function Re(a){a=a|0;i=i;return-1}function Se(a){a=a|0;var b=0,e=0,f=0;b=i;if((mc[c[(c[a>>2]|0)+36>>2]&63](a)|0)==-1){e=-1;i=b;return e|0}f=a+12|0;a=c[f>>2]|0;c[f>>2]=a+1;e=d[a]|0;i=b;return e|0}function Te(a,b){a=a|0;b=b|0;i=i;return-1}function Ue(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=b;if((f|0)<=0){j=0;i=g;return j|0}k=b+24|0;l=b+28|0;m=e;e=0;while(1){n=c[k>>2]|0;if(n>>>0<(c[l>>2]|0)>>>0){o=a[m]|0;c[k>>2]=n+1;a[n]=o}else{if((vc[c[(c[h>>2]|0)+52>>2]&15](b,d[m]|0)|0)==-1){j=e;p=7;break}}o=e+1|0;if((o|0)<(f|0)){m=m+1|0;e=o}else{j=o;p=7;break}}if((p|0)==7){i=g;return j|0}return 0}function Ve(a,b){a=a|0;b=b|0;i=i;return-1}function We(a){a=a|0;var b=0;b=i;c[a>>2]=227688;Qj(a+4|0);Im(a);i=b;return}function Xe(a){a=a|0;var b=0;b=i;c[a>>2]=227688;Qj(a+4|0);i=b;return}function Ye(a,b){a=a|0;b=b|0;i=i;return}function Ze(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return a|0}function _e(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=a;c[g>>2]=0;c[g+4>>2]=0;g=a+8|0;c[g>>2]=-1;c[g+4>>2]=-1;i=i;return}function $e(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=a;c[e>>2]=0;c[e+4>>2]=0;e=a+8|0;c[e>>2]=-1;c[e+4>>2]=-1;i=i;return}function af(a){a=a|0;i=i;return 0}function bf(a){a=a|0;i=i;return 0}function cf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a;if((d|0)<=0){g=0;i=e;return g|0}h=a+12|0;j=a+16|0;k=b;b=0;while(1){l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){c[h>>2]=l+4;m=c[l>>2]|0}else{l=mc[c[(c[f>>2]|0)+40>>2]&63](a)|0;if((l|0)==-1){g=b;n=8;break}else{m=l}}c[k>>2]=m;l=b+1|0;if((l|0)>=(d|0)){g=l;n=8;break}k=k+4|0;b=l}if((n|0)==8){i=e;return g|0}return 0}function df(a){a=a|0;i=i;return-1}function ef(a){a=a|0;var b=0,d=0,e=0;b=i;if((mc[c[(c[a>>2]|0)+36>>2]&63](a)|0)==-1){d=-1;i=b;return d|0}e=a+12|0;a=c[e>>2]|0;c[e>>2]=a+4;d=c[a>>2]|0;i=b;return d|0}function ff(a,b){a=a|0;b=b|0;i=i;return-1}function gf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=a;if((d|0)<=0){g=0;i=e;return g|0}h=a+24|0;j=a+28|0;k=b;b=0;while(1){l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){m=c[k>>2]|0;c[h>>2]=l+4;c[l>>2]=m}else{if((vc[c[(c[f>>2]|0)+52>>2]&15](a,c[k>>2]|0)|0)==-1){g=b;n=8;break}}m=b+1|0;if((m|0)>=(d|0)){g=m;n=8;break}k=k+4|0;b=m}if((n|0)==8){i=e;return g|0}return 0}function hf(a,b){a=a|0;b=b|0;i=i;return-1}function jf(a){a=a|0;var b=0;b=i;Fe(a+8|0);Im(a);i=b;return}function kf(a){a=a|0;var b=0;b=i;Fe(a+8|0);i=b;return}function lf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Fe(d+(e+8)|0);Im(d+e|0);i=b;return}function mf(a){a=a|0;var b=0;b=i;Fe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+8)|0);i=b;return}function nf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d;f=b;g=c[(c[f>>2]|0)+ -12>>2]|0;h=b;if((c[h+(g+24)>>2]|0)==0){i=d;return b|0}j=e;a[j]=0;c[e+4>>2]=b;do{if((c[h+(g+16)>>2]|0)==0){k=c[h+(g+72)>>2]|0;if((k|0)==0){l=g}else{nf(k)|0;l=c[(c[f>>2]|0)+ -12>>2]|0}a[j]=1;k=c[h+(l+24)>>2]|0;if(!((mc[c[(c[k>>2]|0)+24>>2]&63](k)|0)==-1)){break}k=c[(c[f>>2]|0)+ -12>>2]|0;Ee(h+k|0,c[h+(k+16)>>2]|1)}}while(0);yf(e);i=d;return b|0}function of(a){a=a|0;var b=0;b=a+16|0;c[b>>2]=c[b>>2]|1;if((c[a+20>>2]&1|0)==0){i=i;return}else{Tb()}}function pf(a){a=a|0;var b=0;b=i;Fe(a+8|0);Im(a);i=b;return}function qf(a){a=a|0;var b=0;b=i;Fe(a+8|0);i=b;return}function rf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Fe(d+(e+8)|0);Im(d+e|0);i=b;return}function sf(a){a=a|0;var b=0;b=i;Fe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+8)|0);i=b;return}function tf(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d;f=b;g=c[(c[f>>2]|0)+ -12>>2]|0;h=b;if((c[h+(g+24)>>2]|0)==0){i=d;return b|0}j=e;a[j]=0;c[e+4>>2]=b;do{if((c[h+(g+16)>>2]|0)==0){k=c[h+(g+72)>>2]|0;if((k|0)==0){l=g}else{tf(k)|0;l=c[(c[f>>2]|0)+ -12>>2]|0}a[j]=1;k=c[h+(l+24)>>2]|0;if(!((mc[c[(c[k>>2]|0)+24>>2]&63](k)|0)==-1)){break}k=c[(c[f>>2]|0)+ -12>>2]|0;Ee(h+k|0,c[h+(k+16)>>2]|1)}}while(0);Gf(e);i=d;return b|0}function uf(a){a=a|0;var b=0;b=i;Fe(a+4|0);Im(a);i=b;return}function vf(a){a=a|0;var b=0;b=i;Fe(a+4|0);i=b;return}function wf(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Fe(d+(e+4)|0);Im(d+e|0);i=b;return}function xf(a){a=a|0;var b=0;b=i;Fe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+4)|0);i=b;return}function yf(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;a=c[d>>2]|0;e=c[(c[a>>2]|0)+ -12>>2]|0;f=a;if((c[f+(e+24)>>2]|0)==0){i=b;return}if((c[f+(e+16)>>2]|0)!=0){i=b;return}if((c[f+(e+4)>>2]&8192|0)==0){i=b;return}if(Wa()|0){i=b;return}e=c[d>>2]|0;f=c[e+((c[(c[e>>2]|0)+ -12>>2]|0)+24)>>2]|0;if(!((mc[c[(c[f>>2]|0)+24>>2]&63](f)|0)==-1)){i=b;return}f=c[d>>2]|0;d=c[(c[f>>2]|0)+ -12>>2]|0;e=f;Ee(e+d|0,c[e+(d+16)>>2]|1);i=b;return}function zf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+48|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=j;a[m]=0;c[j+4>>2]=b;n=b;o=c[(c[n>>2]|0)+ -12>>2]|0;p=b;if((c[p+(o+16)>>2]|0)!=0){yf(j);i=e;return b|0}q=c[p+(o+72)>>2]|0;if((q|0)==0){r=o}else{nf(q)|0;r=c[(c[n>>2]|0)+ -12>>2]|0}a[m]=1;Pj(k,p+(r+28)|0);r=Rj(k,229072)|0;m=r;Qj(k);k=c[(c[n>>2]|0)+ -12>>2]|0;q=c[p+(k+24)>>2]|0;o=p+(k+76)|0;s=c[o>>2]|0;if((s|0)==-1){Pj(h,p+(k+28)|0);t=Rj(h,230352)|0;u=vc[c[(c[t>>2]|0)+28>>2]&15](t,32)|0;Qj(h);h=u<<24>>24;c[o>>2]=h;v=h}else{v=s}s=v&255;v=p+k|0;k=c[(c[r>>2]|0)+16>>2]|0;c[g>>2]=q;q=f;r=g;c[q+0>>2]=c[r+0>>2];uc[k&15](l,m,f,v,s,d);if((c[l>>2]|0)!=0){yf(j);i=e;return b|0}l=c[(c[n>>2]|0)+ -12>>2]|0;Ee(p+l|0,c[p+(l+16)>>2]|5);yf(j);i=e;return b|0}function Af(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+48|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=j;a[m]=0;c[j+4>>2]=b;n=b;o=c[(c[n>>2]|0)+ -12>>2]|0;p=b;if((c[p+(o+16)>>2]|0)!=0){yf(j);i=e;return b|0}q=c[p+(o+72)>>2]|0;if((q|0)==0){r=o}else{nf(q)|0;r=c[(c[n>>2]|0)+ -12>>2]|0}a[m]=1;Pj(k,p+(r+28)|0);r=Rj(k,229072)|0;m=r;Qj(k);k=c[(c[n>>2]|0)+ -12>>2]|0;q=c[p+(k+24)>>2]|0;o=p+(k+76)|0;s=c[o>>2]|0;if((s|0)==-1){Pj(h,p+(k+28)|0);t=Rj(h,230352)|0;u=vc[c[(c[t>>2]|0)+28>>2]&15](t,32)|0;Qj(h);h=u<<24>>24;c[o>>2]=h;v=h}else{v=s}s=v&255;v=p+k|0;k=c[(c[r>>2]|0)+24>>2]|0;c[g>>2]=q;q=f;r=g;c[q+0>>2]=c[r+0>>2];uc[k&15](l,m,f,v,s,d);if((c[l>>2]|0)!=0){yf(j);i=e;return b|0}l=c[(c[n>>2]|0)+ -12>>2]|0;Ee(p+l|0,c[p+(l+16)>>2]|5);yf(j);i=e;return b|0}function Bf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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;e=i;i=i+48|0;f=e;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=j;a[m]=0;c[j+4>>2]=b;n=b;o=c[(c[n>>2]|0)+ -12>>2]|0;p=b;if((c[p+(o+16)>>2]|0)!=0){yf(j);i=e;return b|0}q=c[p+(o+72)>>2]|0;if((q|0)==0){r=o}else{nf(q)|0;r=c[(c[n>>2]|0)+ -12>>2]|0}a[m]=1;Pj(k,p+(r+28)|0);r=Rj(k,229072)|0;m=r;Qj(k);k=c[(c[n>>2]|0)+ -12>>2]|0;q=c[p+(k+24)>>2]|0;o=p+(k+76)|0;s=c[o>>2]|0;if((s|0)==-1){Pj(h,p+(k+28)|0);t=Rj(h,230352)|0;u=vc[c[(c[t>>2]|0)+28>>2]&15](t,32)|0;Qj(h);h=u<<24>>24;c[o>>2]=h;v=h}else{v=s}s=v&255;v=p+k|0;k=c[(c[r>>2]|0)+16>>2]|0;c[g>>2]=q;q=f;r=g;c[q+0>>2]=c[r+0>>2];uc[k&15](l,m,f,v,s,d);if((c[l>>2]|0)!=0){yf(j);i=e;return b|0}l=c[(c[n>>2]|0)+ -12>>2]|0;Ee(p+l|0,c[p+(l+16)>>2]|5);yf(j);i=e;return b|0}function Cf(a){a=a|0;var b=0;b=i;Fe(a+4|0);Im(a);i=b;return}function Df(a){a=a|0;var b=0;b=i;Fe(a+4|0);i=b;return}function Ef(a){a=a|0;var b=0,d=0,e=0;b=i;d=a;e=c[(c[a>>2]|0)+ -12>>2]|0;Fe(d+(e+4)|0);Im(d+e|0);i=b;return}function Ff(a){a=a|0;var b=0;b=i;Fe(a+((c[(c[a>>2]|0)+ -12>>2]|0)+4)|0);i=b;return}function Gf(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;a=c[d>>2]|0;e=c[(c[a>>2]|0)+ -12>>2]|0;f=a;if((c[f+(e+24)>>2]|0)==0){i=b;return}if((c[f+(e+16)>>2]|0)!=0){i=b;return}if((c[f+(e+4)>>2]&8192|0)==0){i=b;return}if(Wa()|0){i=b;return}e=c[d>>2]|0;f=c[e+((c[(c[e>>2]|0)+ -12>>2]|0)+24)>>2]|0;if(!((mc[c[(c[f>>2]|0)+24>>2]&63](f)|0)==-1)){i=b;return}f=c[d>>2]|0;d=c[(c[f>>2]|0)+ -12>>2]|0;e=f;Ee(e+d|0,c[e+(d+16)>>2]|1);i=b;return}function Hf(a){a=a|0;i=i;return 227904}function If(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=i;if((c|0)==1){ke(a,227920,35);i=d;return}else{ce(a,b,c);i=d;return}}function Jf(a){a=a|0;i=i;return}function Kf(a){a=a|0;var b=0;b=i;ge(a);Im(a);i=b;return}function Lf(a){a=a|0;var b=0;b=i;ge(a);i=b;return}function Mf(a){a=a|0;var b=0;b=i;Fe(a);Im(a);i=b;return}function Nf(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Of(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Pf(a){a=a|0;i=i;return}function Qf(a){a=a|0;i=i;return}function Rf(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,j=0,k=0,l=0,m=0,n=0;b=i;a:do{if((e|0)==(f|0)){g=c;h=6}else{j=e;k=c;while(1){if((k|0)==(d|0)){l=-1;break a}m=a[k]|0;n=a[j]|0;if(m<<24>>24<n<<24>>24){l=-1;break a}if(n<<24>>24<m<<24>>24){l=1;break a}m=k+1|0;n=j+1|0;if((n|0)==(f|0)){g=m;h=6;break}else{j=n;k=m}}}}while(0);if((h|0)==6){l=(g|0)!=(d|0)|0}i=b;return l|0}function Sf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;g=e;h=f-g|0;if(h>>>0>4294967279){ie(b)}if(h>>>0<11){a[b]=h<<1;j=b+1|0}else{k=h+16&-16;l=Gm(k)|0;c[b+8>>2]=l;c[b>>2]=k|1;c[b+4>>2]=h;j=l}if((e|0)==(f|0)){m=j;a[m]=0;i=d;return}else{n=e;o=j}while(1){a[o]=a[n]|0;e=n+1|0;if((e|0)==(f|0)){break}else{o=o+1|0;n=e}}m=j+(f+(0-g))|0;a[m]=0;i=d;return}function Tf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;b=i;if((c|0)==(d|0)){e=0;i=b;return e|0}else{f=0;g=c}while(1){c=(a[g]|0)+(f<<4)|0;h=c&-268435456;j=(h>>>24|h)^c;c=g+1|0;if((c|0)==(d|0)){e=j;break}else{g=c;f=j}}i=b;return e|0}function Uf(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Vf(a){a=a|0;i=i;return}function Wf(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,j=0,k=0,l=0,m=0,n=0;a=i;a:do{if((e|0)==(f|0)){g=b;h=6}else{j=e;k=b;while(1){if((k|0)==(d|0)){l=-1;break a}m=c[k>>2]|0;n=c[j>>2]|0;if((m|0)<(n|0)){l=-1;break a}if((n|0)<(m|0)){l=1;break a}m=k+4|0;n=j+4|0;if((n|0)==(f|0)){g=m;h=6;break}else{j=n;k=m}}}}while(0);if((h|0)==6){l=(g|0)!=(d|0)|0}i=a;return l|0}function Xf(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;d=i;g=e;h=f-g|0;j=h>>2;if(j>>>0>1073741807){ie(b)}if(j>>>0<2){a[b]=h>>>1;k=b+4|0}else{h=j+4&-4;l=Gm(h<<2)|0;c[b+8>>2]=l;c[b>>2]=h|1;c[b+4>>2]=j;k=l}if((e|0)==(f|0)){m=k;c[m>>2]=0;i=d;return}l=f+ -4+(0-g)|0;g=e;e=k;while(1){c[e>>2]=c[g>>2];j=g+4|0;if((j|0)==(f|0)){break}else{e=e+4|0;g=j}}m=k+((l>>>2)+1<<2)|0;c[m>>2]=0;i=d;return}function Yf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;a=i;if((b|0)==(d|0)){e=0;i=a;return e|0}else{f=0;g=b}while(1){b=(c[g>>2]|0)+(f<<4)|0;h=b&-268435456;j=(h>>>24|h)^b;b=g+4|0;if((b|0)==(d|0)){e=j;break}else{g=b;f=j}}i=a;return e|0}function Zf(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function _f(a){a=a|0;i=i;return}function $f(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+136|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=k+40|0;q=k+56|0;r=k+64|0;s=k+72|0;t=k+80|0;u=k+88|0;v=k+96|0;w=k+104|0;x=k+128|0;if((c[g+4>>2]&1|0)==0){c[q>>2]=-1;y=c[(c[d>>2]|0)+16>>2]|0;z=e;c[s>>2]=c[z>>2];c[t>>2]=c[f>>2];A=n;B=s;c[A+0>>2]=c[B+0>>2];B=m;A=t;c[B+0>>2]=c[A+0>>2];hc[y&63](r,d,n,m,g,h,q);m=c[r>>2]|0;c[z>>2]=m;z=c[q>>2]|0;if((z|0)==0){a[j]=0}else if((z|0)==1){a[j]=1}else{a[j]=1;c[h>>2]=4}c[b>>2]=m;i=k;return}Ge(u,g);m=u;u=c[m>>2]|0;if(!((c[57588]|0)==-1)){c[p>>2]=230352;c[p+4>>2]=112;c[p+8>>2]=0;he(230352,p,113)}p=(c[230356>>2]|0)+ -1|0;z=c[u+8>>2]|0;if(!((c[u+12>>2]|0)-z>>2>>>0>p>>>0)){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}u=c[z+(p<<2)>>2]|0;if((u|0)==0){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}C=u;Pd(c[m>>2]|0)|0;Ge(v,g);g=v;v=c[g>>2]|0;if(!((c[57624]|0)==-1)){c[o>>2]=230496;c[o+4>>2]=112;c[o+8>>2]=0;he(230496,o,113)}o=(c[230500>>2]|0)+ -1|0;m=c[v+8>>2]|0;if(!((c[v+12>>2]|0)-m>>2>>>0>o>>>0)){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}v=c[m+(o<<2)>>2]|0;if((v|0)==0){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}E=v;Pd(c[g>>2]|0)|0;g=w;F=v;kc[c[(c[F>>2]|0)+24>>2]&63](g,E);kc[c[(c[F>>2]|0)+28>>2]&63](w+12|0,E);c[x>>2]=c[f>>2];f=w+24|0;E=l;F=x;c[E+0>>2]=c[F+0>>2];F=ag(e,l,g,f,C,h,1)|0;a[j]=(F|0)==(g|0)|0;c[b>>2]=c[e>>2];me(w+12|0);me(w);i=k;return}function ag(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;l=i;i=i+104|0;m=(g-f|0)/12|0;n=l;do{if(m>>>0>100){o=Bm(m)|0;if((o|0)!=0){p=o;q=o;break}Nm()}else{p=0;q=n}}while(0);n=(f|0)==(g|0);if(n){r=0;s=m}else{o=f;t=0;u=m;m=q;while(1){v=a[o]|0;if((v&1)==0){w=(v&255)>>>1}else{w=c[o+4>>2]|0}if((w|0)==0){a[m]=2;x=t+1|0;y=u+ -1|0}else{a[m]=1;x=t;y=u}v=o+12|0;if((v|0)==(g|0)){r=x;s=y;break}else{o=v;t=x;u=y;m=m+1|0}}}m=b;b=e;e=h;y=0;u=r;r=s;a:while(1){s=c[m>>2]|0;do{if((s|0)==0){z=0}else{if((c[s+12>>2]|0)!=(c[s+16>>2]|0)){z=s;break}if((mc[c[(c[s>>2]|0)+36>>2]&63](s)|0)==-1){c[m>>2]=0;z=0;break}else{z=c[m>>2]|0;break}}}while(0);s=(z|0)==0;x=c[b>>2]|0;do{if((x|0)==0){A=0}else{if((c[x+12>>2]|0)!=(c[x+16>>2]|0)){A=x;break}if(!((mc[c[(c[x>>2]|0)+36>>2]&63](x)|0)==-1)){A=x;break}c[b>>2]=0;A=0}}while(0);B=(A|0)==0;C=c[m>>2]|0;if(!((s^B)&(r|0)!=0)){break}x=c[C+12>>2]|0;if((x|0)==(c[C+16>>2]|0)){D=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{D=d[x]|0}x=D&255;if(k){E=x}else{E=vc[c[(c[e>>2]|0)+12>>2]&15](h,x)|0}x=y+1|0;if(n){y=x;r=r;u=u;continue}b:do{if(k){t=0;o=f;w=u;v=r;F=q;while(1){do{if((a[F]|0)==1){G=a[o]|0;H=(G&1)==0;if(H){I=o+1|0}else{I=c[o+8>>2]|0}if(!(E<<24>>24==(a[I+y|0]|0))){a[F]=0;J=t;K=w;L=v+ -1|0;break}if(H){M=(G&255)>>>1}else{M=c[o+4>>2]|0}if((M|0)!=(x|0)){J=1;K=w;L=v;break}a[F]=2;J=1;K=w+1|0;L=v+ -1|0}else{J=t;K=w;L=v}}while(0);G=o+12|0;if((G|0)==(g|0)){N=J;O=K;P=L;break b}t=J;o=G;w=K;v=L;F=F+1|0}}else{F=0;v=f;w=u;o=r;t=q;while(1){do{if((a[t]|0)==1){G=v;if((a[G]&1)==0){Q=v+1|0}else{Q=c[v+8>>2]|0}if(!(E<<24>>24==(vc[c[(c[e>>2]|0)+12>>2]&15](h,a[Q+y|0]|0)|0)<<24>>24)){a[t]=0;R=F;S=w;T=o+ -1|0;break}H=a[G]|0;if((H&1)==0){U=(H&255)>>>1}else{U=c[v+4>>2]|0}if((U|0)!=(x|0)){R=1;S=w;T=o;break}a[t]=2;R=1;S=w+1|0;T=o+ -1|0}else{R=F;S=w;T=o}}while(0);H=v+12|0;if((H|0)==(g|0)){N=R;O=S;P=T;break b}F=R;v=H;w=S;o=T;t=t+1|0}}}while(0);if(!N){y=x;u=O;r=P;continue}s=c[m>>2]|0;t=s+12|0;o=c[t>>2]|0;if((o|0)==(c[s+16>>2]|0)){mc[c[(c[s>>2]|0)+40>>2]&63](s)|0}else{c[t>>2]=o+1}if((P+O|0)>>>0<2){y=x;u=O;r=P;continue}else{V=f;W=O;X=q}while(1){do{if((a[X]|0)==2){o=a[V]|0;if((o&1)==0){Y=(o&255)>>>1}else{Y=c[V+4>>2]|0}if((Y|0)==(x|0)){Z=W;break}a[X]=0;Z=W+ -1|0}else{Z=W}}while(0);o=V+12|0;if((o|0)==(g|0)){y=x;u=Z;r=P;continue a}else{V=o;W=Z;X=X+1|0}}}do{if((C|0)==0){_=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){_=C;break}if((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1){c[m>>2]=0;_=0;break}else{_=c[m>>2]|0;break}}}while(0);m=(_|0)==0;do{if(B){$=78}else{if((c[A+12>>2]|0)!=(c[A+16>>2]|0)){if(m){break}else{$=80;break}}if((mc[c[(c[A>>2]|0)+36>>2]&63](A)|0)==-1){c[b>>2]=0;$=78;break}else{if(m){break}else{$=80;break}}}}while(0);if(($|0)==78){if(m){$=80}}if(($|0)==80){c[j>>2]=c[j>>2]|2}c:do{if(n){$=85}else{if((a[q]|0)==2){aa=f;break}else{ba=f;ca=q}while(1){m=ba+12|0;b=ca+1|0;if((m|0)==(g|0)){$=85;break c}if((a[b]|0)==2){aa=m;break}else{ca=b;ba=m}}}}while(0);if(($|0)==85){c[j>>2]=c[j>>2]|4;aa=g}if((p|0)==0){i=l;return aa|0}Cm(p);i=l;return aa|0}function bg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];cg(a,0,k,j,f,g,h);i=b;return}function cg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==8){u=16}else if((t|0)==0){u=0}else{u=10}t=l;Ug(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((mc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}oe(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}oe(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{Q=d[I]|0}if((ug(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){mc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Ml(H,c[p>>2]|0,j,u)|0;dj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;me(o);me(n);i=e;return}function dg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];eg(a,0,k,j,f,g,h);i=b;return}function eg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;Ug(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((mc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;J=(D&1)==0;if(J){K=(D&255)>>>1}else{K=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(K|0)){if(J){L=(D&255)>>>1;M=(D&255)>>>1}else{D=c[z>>2]|0;L=D;M=D}oe(o,M<<1,0);if((a[h]&1)==0){N=10}else{N=(c[g>>2]&-2)+ -1|0}oe(o,N,0);if((a[h]&1)==0){O=v}else{O=c[w>>2]|0}c[p>>2]=O+L;P=O}else{P=B}D=C+12|0;J=c[D>>2]|0;Q=C+16|0;if((J|0)==(c[Q>>2]|0)){R=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{R=d[J]|0}if((ug(R&255,u,P,p,s,A,n,l,r,t)|0)!=0){G=F;H=P;break}J=c[D>>2]|0;if((J|0)==(c[Q>>2]|0)){mc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=P;continue}else{c[D>>2]=J+1;m=C;B=P;continue}}P=a[n]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[n+4>>2]|0}do{if((S|0)!=0){P=c[r>>2]|0;if((P-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=P+4;c[P>>2]=B}}while(0);s=Ll(H,c[p>>2]|0,j,u)|0;u=k;c[u>>2]=s;c[u+4>>2]=I;dj(n,l,c[r>>2]|0,j);do{if((C|0)==0){T=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){T=C;break}if(!((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){T=C;break}c[y>>2]=0;T=0}}while(0);y=(T|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}U=b;c[U>>2]=T;me(o);me(n);i=e;return}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}U=b;c[U>>2]=T;me(o);me(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}U=b;c[U>>2]=T;me(o);me(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;U=b;c[U>>2]=T;me(o);me(n);i=e;return}function fg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];gg(a,0,k,j,f,g,h);i=b;return}function gg(e,f,g,h,j,k,l){e=e|0;f=f|0;g=g|0;h=h|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,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;f=i;i=i+256|0;m=f;n=f+32|0;o=f+40|0;p=f+56|0;q=f+72|0;r=f+80|0;s=f+240|0;t=f+248|0;u=c[j+4>>2]&74;if((u|0)==0){v=0}else if((u|0)==8){v=16}else if((u|0)==64){v=8}else{v=10}u=m;Ug(o,j,u,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;oe(p,10,0);if((a[j]&1)==0){m=p+1|0;w=m;x=p+8|0;y=m}else{m=p+8|0;w=p+1|0;x=m;y=c[m>>2]|0}c[q>>2]=y;m=r;c[s>>2]=m;c[t>>2]=0;z=g;g=h;h=p;A=p+4|0;B=a[n]|0;n=c[z>>2]|0;C=y;a:while(1){do{if((n|0)==0){D=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){D=n;break}if(!((mc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){D=n;break}c[z>>2]=0;D=0}}while(0);y=(D|0)==0;E=c[g>>2]|0;do{if((E|0)==0){F=18}else{if((c[E+12>>2]|0)!=(c[E+16>>2]|0)){if(y){G=E;break}else{H=E;I=C;break a}}if((mc[c[(c[E>>2]|0)+36>>2]&63](E)|0)==-1){c[g>>2]=0;F=18;break}else{if(y){G=E;break}else{H=E;I=C;break a}}}}while(0);if((F|0)==18){F=0;if(y){H=0;I=C;break}else{G=0}}E=a[j]|0;J=(E&1)==0;if(J){K=(E&255)>>>1}else{K=c[A>>2]|0}if(((c[q>>2]|0)-C|0)==(K|0)){if(J){L=(E&255)>>>1;M=(E&255)>>>1}else{E=c[A>>2]|0;L=E;M=E}oe(p,M<<1,0);if((a[j]&1)==0){N=10}else{N=(c[h>>2]&-2)+ -1|0}oe(p,N,0);if((a[j]&1)==0){O=w}else{O=c[x>>2]|0}c[q>>2]=O+L;P=O}else{P=C}E=D+12|0;J=c[E>>2]|0;Q=D+16|0;if((J|0)==(c[Q>>2]|0)){R=mc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{R=d[J]|0}if((ug(R&255,v,P,q,t,B,o,m,s,u)|0)!=0){H=G;I=P;break}J=c[E>>2]|0;if((J|0)==(c[Q>>2]|0)){mc[c[(c[D>>2]|0)+40>>2]&63](D)|0;n=D;C=P;continue}else{c[E>>2]=J+1;n=D;C=P;continue}}P=a[o]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[o+4>>2]|0}do{if((S|0)!=0){P=c[s>>2]|0;if((P-r|0)>=160){break}C=c[t>>2]|0;c[s>>2]=P+4;c[P>>2]=C}}while(0);b[l>>1]=Kl(I,c[q>>2]|0,k,v)|0;dj(o,m,c[s>>2]|0,k);do{if((D|0)==0){T=0}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){T=D;break}if(!((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1)){T=D;break}c[z>>2]=0;T=0}}while(0);z=(T|0)==0;do{if((H|0)==0){F=54}else{if((c[H+12>>2]|0)!=(c[H+16>>2]|0)){if(!z){break}U=e;c[U>>2]=T;me(p);me(o);i=f;return}if((mc[c[(c[H>>2]|0)+36>>2]&63](H)|0)==-1){c[g>>2]=0;F=54;break}if(!(z^(H|0)==0)){break}U=e;c[U>>2]=T;me(p);me(o);i=f;return}}while(0);do{if((F|0)==54){if(z){break}U=e;c[U>>2]=T;me(p);me(o);i=f;return}}while(0);c[k>>2]=c[k>>2]|2;U=e;c[U>>2]=T;me(p);me(o);i=f;return}function hg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];ig(a,0,k,j,f,g,h);i=b;return}function ig(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;Ug(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((mc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}oe(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}oe(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{Q=d[I]|0}if((ug(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){mc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Jl(H,c[p>>2]|0,j,u)|0;dj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;me(o);me(n);i=e;return}function jg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];kg(a,0,k,j,f,g,h);i=b;return}function kg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;Ug(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((mc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;I=(D&1)==0;if(I){J=(D&255)>>>1}else{J=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(J|0)){if(I){K=(D&255)>>>1;L=(D&255)>>>1}else{D=c[z>>2]|0;K=D;L=D}oe(o,L<<1,0);if((a[h]&1)==0){M=10}else{M=(c[g>>2]&-2)+ -1|0}oe(o,M,0);if((a[h]&1)==0){N=v}else{N=c[w>>2]|0}c[p>>2]=N+K;O=N}else{O=B}D=C+12|0;I=c[D>>2]|0;P=C+16|0;if((I|0)==(c[P>>2]|0)){Q=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{Q=d[I]|0}if((ug(Q&255,u,O,p,s,A,n,l,r,t)|0)!=0){G=F;H=O;break}I=c[D>>2]|0;if((I|0)==(c[P>>2]|0)){mc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=O;continue}else{c[D>>2]=I+1;m=C;B=O;continue}}O=a[n]|0;if((O&1)==0){R=(O&255)>>>1}else{R=c[n+4>>2]|0}do{if((R|0)!=0){O=c[r>>2]|0;if((O-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=O+4;c[O>>2]=B}}while(0);c[k>>2]=Il(H,c[p>>2]|0,j,u)|0;dj(n,l,c[r>>2]|0,j);do{if((C|0)==0){S=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){S=C;break}if(!((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){S=C;break}c[y>>2]=0;S=0}}while(0);y=(S|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}T=b;c[T>>2]=S;me(o);me(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;T=b;c[T>>2]=S;me(o);me(n);i=e;return}function lg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];mg(a,0,k,j,f,g,h);i=b;return}function mg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;e=i;i=i+256|0;l=e;m=e+32|0;n=e+40|0;o=e+56|0;p=e+72|0;q=e+80|0;r=e+240|0;s=e+248|0;t=c[h+4>>2]&74;if((t|0)==64){u=8}else if((t|0)==0){u=0}else if((t|0)==8){u=16}else{u=10}t=l;Ug(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=a[m]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0}else{if((c[m+12>>2]|0)!=(c[m+16>>2]|0)){C=m;break}if(!((mc[c[(c[m>>2]|0)+36>>2]&63](m)|0)==-1)){C=m;break}c[y>>2]=0;C=0}}while(0);x=(C|0)==0;D=c[f>>2]|0;do{if((D|0)==0){E=18}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){if(x){F=D;break}else{G=D;H=B;break a}}if((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[f>>2]=0;E=18;break}else{if(x){F=D;break}else{G=D;H=B;break a}}}}while(0);if((E|0)==18){E=0;if(x){G=0;H=B;break}else{F=0}}D=a[h]|0;J=(D&1)==0;if(J){K=(D&255)>>>1}else{K=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(K|0)){if(J){L=(D&255)>>>1;M=(D&255)>>>1}else{D=c[z>>2]|0;L=D;M=D}oe(o,M<<1,0);if((a[h]&1)==0){N=10}else{N=(c[g>>2]&-2)+ -1|0}oe(o,N,0);if((a[h]&1)==0){O=v}else{O=c[w>>2]|0}c[p>>2]=O+L;P=O}else{P=B}D=C+12|0;J=c[D>>2]|0;Q=C+16|0;if((J|0)==(c[Q>>2]|0)){R=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{R=d[J]|0}if((ug(R&255,u,P,p,s,A,n,l,r,t)|0)!=0){G=F;H=P;break}J=c[D>>2]|0;if((J|0)==(c[Q>>2]|0)){mc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=P;continue}else{c[D>>2]=J+1;m=C;B=P;continue}}P=a[n]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[n+4>>2]|0}do{if((S|0)!=0){P=c[r>>2]|0;if((P-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=P+4;c[P>>2]=B}}while(0);s=Hl(H,c[p>>2]|0,j,u)|0;u=k;c[u>>2]=s;c[u+4>>2]=I;dj(n,l,c[r>>2]|0,j);do{if((C|0)==0){T=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){T=C;break}if(!((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){T=C;break}c[y>>2]=0;T=0}}while(0);y=(T|0)==0;do{if((G|0)==0){E=54}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(!y){break}U=b;c[U>>2]=T;me(o);me(n);i=e;return}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;E=54;break}if(!(y^(G|0)==0)){break}U=b;c[U>>2]=T;me(o);me(n);i=e;return}}while(0);do{if((E|0)==54){if(y){break}U=b;c[U>>2]=T;me(o);me(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;U=b;c[U>>2]=T;me(o);me(n);i=e;return}function ng(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];og(a,0,k,j,f,g,h);i=b;return}function og(b,e,f,h,j,k,l){b=b|0;e=e|0;f=f|0;h=h|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;Vg(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;oe(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=h;h=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((mc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}oe(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[h>>2]&-2)+ -1|0}oe(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=mc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=d[L]|0}if((Wg(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){mc[c[(c[F>>2]|0)+40>>2]&63](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);g[l>>2]=+Gl(K,c[q>>2]|0,k);dj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((mc[c[(c[F>>2]|0)+36>>2]&63](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}if((mc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;me(p);me(o);i=e;return}function pg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];qg(a,0,k,j,f,g,h);i=b;return}function qg(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;Vg(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;oe(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=g;g=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((mc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}oe(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[g>>2]&-2)+ -1|0}oe(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=mc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=d[L]|0}if((Wg(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){mc[c[(c[F>>2]|0)+40>>2]&63](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);h[l>>3]=+Fl(K,c[q>>2]|0,k);dj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((mc[c[(c[F>>2]|0)+36>>2]&63](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}if((mc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;me(p);me(o);i=e;return}function rg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];sg(a,0,k,j,f,g,h);i=b;return}function sg(b,e,f,g,j,k,l){b=b|0;e=e|0;f=f|0;g=g|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,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;e=i;i=i+280|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+64|0;q=e+80|0;r=e+88|0;s=e+248|0;t=e+256|0;u=e+264|0;v=e+272|0;w=e;Vg(o,j,w,m,n);j=p;c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;oe(p,10,0);if((a[j]&1)==0){x=p+1|0;y=x;z=p+8|0;A=x}else{x=p+8|0;y=p+1|0;z=x;A=c[x>>2]|0}c[q>>2]=A;x=r;c[s>>2]=x;c[t>>2]=0;a[u]=1;a[v]=69;B=f;f=g;g=p;C=p+4|0;D=a[m]|0;m=a[n]|0;n=c[B>>2]|0;E=A;a:while(1){do{if((n|0)==0){F=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){F=n;break}if(!((mc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1)){F=n;break}c[B>>2]=0;F=0}}while(0);A=(F|0)==0;G=c[f>>2]|0;do{if((G|0)==0){H=14}else{if((c[G+12>>2]|0)!=(c[G+16>>2]|0)){if(A){I=G;break}else{J=G;K=E;break a}}if((mc[c[(c[G>>2]|0)+36>>2]&63](G)|0)==-1){c[f>>2]=0;H=14;break}else{if(A){I=G;break}else{J=G;K=E;break a}}}}while(0);if((H|0)==14){H=0;if(A){J=0;K=E;break}else{I=0}}G=a[j]|0;L=(G&1)==0;if(L){M=(G&255)>>>1}else{M=c[C>>2]|0}if(((c[q>>2]|0)-E|0)==(M|0)){if(L){N=(G&255)>>>1;O=(G&255)>>>1}else{G=c[C>>2]|0;N=G;O=G}oe(p,O<<1,0);if((a[j]&1)==0){P=10}else{P=(c[g>>2]&-2)+ -1|0}oe(p,P,0);if((a[j]&1)==0){Q=y}else{Q=c[z>>2]|0}c[q>>2]=Q+N;R=Q}else{R=E}G=F+12|0;L=c[G>>2]|0;S=F+16|0;if((L|0)==(c[S>>2]|0)){T=mc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=d[L]|0}if((Wg(T&255,u,v,R,q,D,m,o,x,s,t,w)|0)!=0){J=I;K=R;break}L=c[G>>2]|0;if((L|0)==(c[S>>2]|0)){mc[c[(c[F>>2]|0)+40>>2]&63](F)|0;n=F;E=R;continue}else{c[G>>2]=L+1;n=F;E=R;continue}}R=a[o]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[o+4>>2]|0}do{if((U|0)!=0){if((a[u]|0)==0){break}R=c[s>>2]|0;if((R-r|0)>=160){break}E=c[t>>2]|0;c[s>>2]=R+4;c[R>>2]=E}}while(0);h[l>>3]=+El(K,c[q>>2]|0,k);dj(o,x,c[s>>2]|0,k);do{if((F|0)==0){V=0}else{if((c[F+12>>2]|0)!=(c[F+16>>2]|0)){V=F;break}if(!((mc[c[(c[F>>2]|0)+36>>2]&63](F)|0)==-1)){V=F;break}c[B>>2]=0;V=0}}while(0);B=(V|0)==0;do{if((J|0)==0){H=51}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){if(!B){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}if((mc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1){c[f>>2]=0;H=51;break}if(!(B^(J|0)==0)){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}}while(0);do{if((H|0)==51){if(B){break}W=b;c[W>>2]=V;me(p);me(o);i=e;return}}while(0);c[k>>2]=c[k>>2]|2;W=b;c[W>>2]=V;me(p);me(o);i=e;return}function tg(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;e=i;i=i+8|0;l=e;m=i;i=i+16|0;n=i;i=i+32|0;o=i;i=i+16|0;p=i;i=i+8|0;q=i;i=i+16|0;r=i;i=i+160|0;s=o;c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;Ge(p,h);h=p;p=c[h>>2]|0;if(!((c[57588]|0)==-1)){c[m>>2]=230352;c[m+4>>2]=112;c[m+8>>2]=0;he(230352,m,113)}m=(c[230356>>2]|0)+ -1|0;t=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-t>>2>>>0>m>>>0)){u=Va(4)|0;v=u;gm(v);xb(u|0,238312,101)}p=c[t+(m<<2)>>2]|0;if((p|0)==0){u=Va(4)|0;v=u;gm(v);xb(u|0,238312,101)}u=n;sc[c[(c[p>>2]|0)+32>>2]&7](p,228896,228922|0,u)|0;Pd(c[h>>2]|0)|0;h=q;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(q,10,0);if((a[h]&1)==0){p=q+1|0;w=p;x=q+8|0;y=p}else{p=q+8|0;w=q+1|0;x=p;y=c[p>>2]|0}p=f;f=g;g=q;v=q+4|0;m=n+24|0;t=n+25|0;z=r;A=n+26|0;B=n;n=o+4|0;C=c[p>>2]|0;D=y;E=r;r=0;F=y;a:while(1){do{if((C|0)==0){G=0}else{if((c[C+12>>2]|0)!=(c[C+16>>2]|0)){G=C;break}if(!((mc[c[(c[C>>2]|0)+36>>2]&63](C)|0)==-1)){G=C;break}c[p>>2]=0;G=0}}while(0);y=(G|0)==0;H=c[f>>2]|0;do{if((H|0)==0){I=19}else{if((c[H+12>>2]|0)!=(c[H+16>>2]|0)){if(y){break}else{J=F;break a}}if((mc[c[(c[H>>2]|0)+36>>2]&63](H)|0)==-1){c[f>>2]=0;I=19;break}else{if(y){break}else{J=F;break a}}}}while(0);if((I|0)==19){I=0;if(y){J=F;break}}H=a[h]|0;K=(H&1)==0;if(K){L=(H&255)>>>1}else{L=c[v>>2]|0}if((D-F|0)==(L|0)){if(K){M=(H&255)>>>1;N=(H&255)>>>1}else{H=c[v>>2]|0;M=H;N=H}oe(q,N<<1,0);if((a[h]&1)==0){O=10}else{O=(c[g>>2]&-2)+ -1|0}oe(q,O,0);if((a[h]&1)==0){P=w}else{P=c[x>>2]|0}Q=P+M|0;R=P}else{Q=D;R=F}H=c[G+12>>2]|0;if((H|0)==(c[G+16>>2]|0)){S=mc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{S=d[H]|0}H=S&255;K=(Q|0)==(R|0);do{if(K){T=(a[m]|0)==H<<24>>24;if(!T){if(!((a[t]|0)==H<<24>>24)){I=40;break}}a[Q]=T?43:45;U=Q+1|0;V=E;W=0}else{I=40}}while(0);do{if((I|0)==40){I=0;y=a[s]|0;if((y&1)==0){X=(y&255)>>>1}else{X=c[n>>2]|0}if((X|0)!=0&H<<24>>24==0){if((E-z|0)>=160){U=Q;V=E;W=r;break}c[E>>2]=r;U=Q;V=E+4|0;W=0;break}else{Y=u}while(1){y=Y+1|0;if((a[Y]|0)==H<<24>>24){Z=Y;break}if((y|0)==(A|0)){Z=A;break}else{Y=y}}y=Z-B|0;if((y|0)>23){J=R;break a}if((y|0)<22){a[Q]=a[228896+y|0]|0;U=Q+1|0;V=E;W=r+1|0;break}if(K){J=Q;break a}if((Q-R|0)>=3){J=R;break a}if((a[Q+ -1|0]|0)!=48){J=R;break a}a[Q]=a[228896+y|0]|0;U=Q+1|0;V=E;W=0}}while(0);K=c[p>>2]|0;H=K+12|0;y=c[H>>2]|0;if((y|0)==(c[K+16>>2]|0)){mc[c[(c[K>>2]|0)+40>>2]&63](K)|0;C=K;D=U;E=V;r=W;F=R;continue}else{c[H>>2]=y+1;C=K;D=U;E=V;r=W;F=R;continue}}a[J+3|0]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);R=c[57560]|0;c[l>>2]=k;if((vg(J,R,228936,l)|0)!=1){c[j>>2]=4}l=c[p>>2]|0;do{if((l|0)==0){_=0}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){_=l;break}if(!((mc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1)){_=l;break}c[p>>2]=0;_=0}}while(0);p=(_|0)==0;l=c[f>>2]|0;do{if((l|0)==0){I=72}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){if(!p){break}$=b;c[$>>2]=_;me(q);me(o);i=e;return}if((mc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1){c[f>>2]=0;I=72;break}if(!(p^(l|0)==0)){break}$=b;c[$>>2]=_;me(q);me(o);i=e;return}}while(0);do{if((I|0)==72){if(p){break}$=b;c[$>>2]=_;me(q);me(o);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;$=b;c[$>>2]=_;me(q);me(o);i=e;return}function ug(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;o=c[f>>2]|0;p=(o|0)==(e|0);do{if(p){q=(a[m+24|0]|0)==b<<24>>24;if(!q){if(!((a[m+25|0]|0)==b<<24>>24)){break}}c[f>>2]=e+1;a[e]=q?43:45;c[g>>2]=0;r=0;i=n;return r|0}}while(0);q=a[j]|0;if((q&1)==0){s=(q&255)>>>1}else{s=c[j+4>>2]|0}if((s|0)!=0&b<<24>>24==h<<24>>24){h=c[l>>2]|0;if((h-k|0)>=160){r=0;i=n;return r|0}k=c[g>>2]|0;c[l>>2]=h+4;c[h>>2]=k;c[g>>2]=0;r=0;i=n;return r|0}k=m+26|0;h=m;while(1){l=h+1|0;if((a[h]|0)==b<<24>>24){t=h;break}if((l|0)==(k|0)){t=k;break}else{h=l}}h=t-m|0;if((h|0)>23){r=-1;i=n;return r|0}do{if((d|0)==16){if((h|0)<22){break}if(p){r=-1;i=n;return r|0}if((o-e|0)>=3){r=-1;i=n;return r|0}if((a[o+ -1|0]|0)!=48){r=-1;i=n;return r|0}c[g>>2]=0;m=a[228896+h|0]|0;c[f>>2]=o+1;a[o]=m;r=0;i=n;return r|0}else if((d|0)==10|(d|0)==8){if((h|0)<(d|0)){break}else{r=-1}i=n;return r|0}}while(0);d=a[228896+h|0]|0;c[f>>2]=o+1;a[o]=d;c[g>>2]=(c[g>>2]|0)+1;r=0;i=n;return r|0}function vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=ib(b|0)|0;b=Ja(a|0,d|0,g|0)|0;if((e|0)==0){i=f;return b|0}ib(e|0)|0;i=f;return b|0}function wg(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function xg(a){a=a|0;i=i;return}function yg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+136|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=k+40|0;q=k+56|0;r=k+64|0;s=k+72|0;t=k+80|0;u=k+88|0;v=k+96|0;w=k+104|0;x=k+128|0;if((c[g+4>>2]&1|0)==0){c[q>>2]=-1;y=c[(c[d>>2]|0)+16>>2]|0;z=e;c[s>>2]=c[z>>2];c[t>>2]=c[f>>2];A=n;B=s;c[A+0>>2]=c[B+0>>2];B=m;A=t;c[B+0>>2]=c[A+0>>2];hc[y&63](r,d,n,m,g,h,q);m=c[r>>2]|0;c[z>>2]=m;z=c[q>>2]|0;if((z|0)==0){a[j]=0}else if((z|0)==1){a[j]=1}else{a[j]=1;c[h>>2]=4}c[b>>2]=m;i=k;return}Ge(u,g);m=u;u=c[m>>2]|0;if(!((c[57586]|0)==-1)){c[p>>2]=230344;c[p+4>>2]=112;c[p+8>>2]=0;he(230344,p,113)}p=(c[230348>>2]|0)+ -1|0;z=c[u+8>>2]|0;if(!((c[u+12>>2]|0)-z>>2>>>0>p>>>0)){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}u=c[z+(p<<2)>>2]|0;if((u|0)==0){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}C=u;Pd(c[m>>2]|0)|0;Ge(v,g);g=v;v=c[g>>2]|0;if(!((c[57626]|0)==-1)){c[o>>2]=230504;c[o+4>>2]=112;c[o+8>>2]=0;he(230504,o,113)}o=(c[230508>>2]|0)+ -1|0;m=c[v+8>>2]|0;if(!((c[v+12>>2]|0)-m>>2>>>0>o>>>0)){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}v=c[m+(o<<2)>>2]|0;if((v|0)==0){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}E=v;Pd(c[g>>2]|0)|0;g=w;F=v;kc[c[(c[F>>2]|0)+24>>2]&63](g,E);kc[c[(c[F>>2]|0)+28>>2]&63](w+12|0,E);c[x>>2]=c[f>>2];f=w+24|0;E=l;F=x;c[E+0>>2]=c[F+0>>2];F=zg(e,l,g,f,C,h,1)|0;a[j]=(F|0)==(g|0)|0;c[b>>2]=c[e>>2];xe(w+12|0);xe(w);i=k;return}function zg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;k=i;i=i+104|0;l=(f-e|0)/12|0;m=k;do{if(l>>>0>100){n=Bm(l)|0;if((n|0)!=0){o=n;p=n;break}Nm()}else{o=0;p=m}}while(0);m=(e|0)==(f|0);if(m){q=0;r=l}else{n=e;s=0;t=l;l=p;while(1){u=a[n]|0;if((u&1)==0){v=(u&255)>>>1}else{v=c[n+4>>2]|0}if((v|0)==0){a[l]=2;w=s+1|0;x=t+ -1|0}else{a[l]=1;w=s;x=t}u=n+12|0;if((u|0)==(f|0)){q=w;r=x;break}else{n=u;s=w;t=x;l=l+1|0}}}l=b;b=d;d=g;x=0;t=q;q=r;a:while(1){r=c[l>>2]|0;do{if((r|0)==0){y=1}else{w=c[r+12>>2]|0;if((w|0)==(c[r+16>>2]|0)){z=mc[c[(c[r>>2]|0)+36>>2]&63](r)|0}else{z=c[w>>2]|0}if((z|0)==-1){c[l>>2]=0;y=1;break}else{y=(c[l>>2]|0)==0;break}}}while(0);r=c[b>>2]|0;do{if((r|0)==0){A=0;B=1}else{w=c[r+12>>2]|0;if((w|0)==(c[r+16>>2]|0)){C=mc[c[(c[r>>2]|0)+36>>2]&63](r)|0}else{C=c[w>>2]|0}if(!((C|0)==-1)){A=r;B=0;break}c[b>>2]=0;A=0;B=1}}while(0);D=c[l>>2]|0;if(!((y^B)&(q|0)!=0)){break}r=c[D+12>>2]|0;if((r|0)==(c[D+16>>2]|0)){E=mc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{E=c[r>>2]|0}if(j){F=E}else{F=vc[c[(c[d>>2]|0)+28>>2]&15](g,E)|0}r=x+1|0;if(m){x=r;q=q;t=t;continue}b:do{if(j){w=0;s=e;n=t;v=q;u=p;while(1){do{if((a[u]|0)==1){G=a[s]|0;H=(G&1)==0;if(H){I=s+4|0}else{I=c[s+8>>2]|0}if((F|0)!=(c[I+(x<<2)>>2]|0)){a[u]=0;J=w;K=n;L=v+ -1|0;break}if(H){M=(G&255)>>>1}else{M=c[s+4>>2]|0}if((M|0)!=(r|0)){J=1;K=n;L=v;break}a[u]=2;J=1;K=n+1|0;L=v+ -1|0}else{J=w;K=n;L=v}}while(0);G=s+12|0;if((G|0)==(f|0)){N=J;O=K;P=L;break b}w=J;s=G;n=K;v=L;u=u+1|0}}else{u=0;v=e;n=t;s=q;w=p;while(1){do{if((a[w]|0)==1){G=v;if((a[G]&1)==0){Q=v+4|0}else{Q=c[v+8>>2]|0}if((F|0)!=(vc[c[(c[d>>2]|0)+28>>2]&15](g,c[Q+(x<<2)>>2]|0)|0)){a[w]=0;R=u;S=n;T=s+ -1|0;break}H=a[G]|0;if((H&1)==0){U=(H&255)>>>1}else{U=c[v+4>>2]|0}if((U|0)!=(r|0)){R=1;S=n;T=s;break}a[w]=2;R=1;S=n+1|0;T=s+ -1|0}else{R=u;S=n;T=s}}while(0);H=v+12|0;if((H|0)==(f|0)){N=R;O=S;P=T;break b}u=R;v=H;n=S;s=T;w=w+1|0}}}while(0);if(!N){x=r;t=O;q=P;continue}w=c[l>>2]|0;s=w+12|0;n=c[s>>2]|0;if((n|0)==(c[w+16>>2]|0)){mc[c[(c[w>>2]|0)+40>>2]&63](w)|0}else{c[s>>2]=n+4}if((P+O|0)>>>0<2){x=r;t=O;q=P;continue}else{V=e;W=O;X=p}while(1){do{if((a[X]|0)==2){n=a[V]|0;if((n&1)==0){Y=(n&255)>>>1}else{Y=c[V+4>>2]|0}if((Y|0)==(r|0)){Z=W;break}a[X]=0;Z=W+ -1|0}else{Z=W}}while(0);n=V+12|0;if((n|0)==(f|0)){x=r;t=Z;q=P;continue a}else{V=n;W=Z;X=X+1|0}}}do{if((D|0)==0){_=1}else{X=c[D+12>>2]|0;if((X|0)==(c[D+16>>2]|0)){$=mc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{$=c[X>>2]|0}if(($|0)==-1){c[l>>2]=0;_=1;break}else{_=(c[l>>2]|0)==0;break}}}while(0);do{if((A|0)==0){aa=85}else{l=c[A+12>>2]|0;if((l|0)==(c[A+16>>2]|0)){ba=mc[c[(c[A>>2]|0)+36>>2]&63](A)|0}else{ba=c[l>>2]|0}if((ba|0)==-1){c[b>>2]=0;aa=85;break}else{if(_){break}else{aa=87;break}}}}while(0);if((aa|0)==85){if(_){aa=87}}if((aa|0)==87){c[h>>2]=c[h>>2]|2}c:do{if(m){aa=92}else{if((a[p]|0)==2){ca=e;break}else{da=e;ea=p}while(1){_=da+12|0;b=ea+1|0;if((_|0)==(f|0)){aa=92;break c}if((a[b]|0)==2){ca=_;break}else{ea=b;da=_}}}}while(0);if((aa|0)==92){c[h>>2]=c[h>>2]|4;ca=f}if((o|0)==0){i=k;return ca|0}Cm(o);i=k;return ca|0}function Ag(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Bg(a,0,k,j,f,g,h);i=b;return}function Bg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==0){t=0}else if((s|0)==64){t=8}else if((s|0)==8){t=16}else{t=10}s=k;Xg(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=mc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=mc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}oe(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}oe(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{R=c[F>>2]|0}if((Tg(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){mc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Ml(J,c[o>>2]|0,h,t)|0;dj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=mc[c[(c[I>>2]|0)+36>>2]&63](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;me(n);me(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;me(n);me(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;me(n);me(m);i=d;return}function Cg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Dg(a,0,k,j,f,g,h);i=b;return}function Dg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==0){t=0}else if((s|0)==8){t=16}else if((s|0)==64){t=8}else{t=10}s=k;Xg(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=mc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=mc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{J=w;K=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){J=0;K=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){L=(w&255)>>>1}else{L=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(L|0)){if(F){M=(w&255)>>>1;N=(w&255)>>>1}else{w=c[y>>2]|0;M=w;N=w}oe(n,N<<1,0);if((a[g]&1)==0){O=10}else{O=(c[f>>2]&-2)+ -1|0}oe(n,O,0);if((a[g]&1)==0){P=u}else{P=c[v>>2]|0}c[o>>2]=P+M;Q=P}else{Q=A}w=B+12|0;F=c[w>>2]|0;R=B+16|0;if((F|0)==(c[R>>2]|0)){S=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{S=c[F>>2]|0}if((Tg(S,t,Q,o,r,z,m,k,q,s)|0)!=0){J=H;K=Q;break}F=c[w>>2]|0;if((F|0)==(c[R>>2]|0)){mc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=Q;continue}else{c[w>>2]=F+4;l=B;A=Q;continue}}Q=a[m]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[m+4>>2]|0}do{if((T|0)!=0){Q=c[q>>2]|0;if((Q-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=Q+4;c[Q>>2]=A}}while(0);r=Ll(K,c[o>>2]|0,h,t)|0;t=j;c[t>>2]=r;c[t+4>>2]=I;dj(m,k,c[q>>2]|0,h);do{if((B|0)==0){U=0;V=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){W=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{W=c[q>>2]|0}if(!((W|0)==-1)){U=B;V=0;break}c[x>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){E=60}else{x=c[J+12>>2]|0;if((x|0)==(c[J+16>>2]|0)){X=mc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{X=c[x>>2]|0}if((X|0)==-1){c[e>>2]=0;E=60;break}if(!V){break}Y=b;c[Y>>2]=U;me(n);me(m);i=d;return}}while(0);do{if((E|0)==60){if(V){break}Y=b;c[Y>>2]=U;me(n);me(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;Y=b;c[Y>>2]=U;me(n);me(m);i=d;return}function Eg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Fg(a,0,k,j,f,g,h);i=b;return}function Fg(d,e,f,g,h,j,k){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;e=i;i=i+328|0;l=e;m=e+104|0;n=e+112|0;o=e+128|0;p=e+144|0;q=e+152|0;r=e+312|0;s=e+320|0;t=c[h+4>>2]&74;if((t|0)==0){u=0}else if((t|0)==64){u=8}else if((t|0)==8){u=16}else{u=10}t=l;Xg(n,h,t,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){l=o+1|0;v=l;w=o+8|0;x=l}else{l=o+8|0;v=o+1|0;w=l;x=c[l>>2]|0}c[p>>2]=x;l=q;c[r>>2]=l;c[s>>2]=0;y=f;f=g;g=o;z=o+4|0;A=c[m>>2]|0;m=c[y>>2]|0;B=x;a:while(1){do{if((m|0)==0){C=0;D=1}else{x=c[m+12>>2]|0;if((x|0)==(c[m+16>>2]|0)){E=mc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{E=c[x>>2]|0}if(!((E|0)==-1)){C=m;D=0;break}c[y>>2]=0;C=0;D=1}}while(0);x=c[f>>2]|0;do{if((x|0)==0){F=21}else{G=c[x+12>>2]|0;if((G|0)==(c[x+16>>2]|0)){H=mc[c[(c[x>>2]|0)+36>>2]&63](x)|0}else{H=c[G>>2]|0}if((H|0)==-1){c[f>>2]=0;F=21;break}else{if(D){I=x;break}else{J=x;K=B;break a}}}}while(0);if((F|0)==21){F=0;if(D){J=0;K=B;break}else{I=0}}x=a[h]|0;G=(x&1)==0;if(G){L=(x&255)>>>1}else{L=c[z>>2]|0}if(((c[p>>2]|0)-B|0)==(L|0)){if(G){M=(x&255)>>>1;N=(x&255)>>>1}else{x=c[z>>2]|0;M=x;N=x}oe(o,N<<1,0);if((a[h]&1)==0){O=10}else{O=(c[g>>2]&-2)+ -1|0}oe(o,O,0);if((a[h]&1)==0){P=v}else{P=c[w>>2]|0}c[p>>2]=P+M;Q=P}else{Q=B}x=C+12|0;G=c[x>>2]|0;R=C+16|0;if((G|0)==(c[R>>2]|0)){S=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{S=c[G>>2]|0}if((Tg(S,u,Q,p,s,A,n,l,r,t)|0)!=0){J=I;K=Q;break}G=c[x>>2]|0;if((G|0)==(c[R>>2]|0)){mc[c[(c[C>>2]|0)+40>>2]&63](C)|0;m=C;B=Q;continue}else{c[x>>2]=G+4;m=C;B=Q;continue}}Q=a[n]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[n+4>>2]|0}do{if((T|0)!=0){Q=c[r>>2]|0;if((Q-q|0)>=160){break}B=c[s>>2]|0;c[r>>2]=Q+4;c[Q>>2]=B}}while(0);b[k>>1]=Kl(K,c[p>>2]|0,j,u)|0;dj(n,l,c[r>>2]|0,j);do{if((C|0)==0){U=0;V=1}else{r=c[C+12>>2]|0;if((r|0)==(c[C+16>>2]|0)){W=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{W=c[r>>2]|0}if(!((W|0)==-1)){U=C;V=0;break}c[y>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){F=60}else{y=c[J+12>>2]|0;if((y|0)==(c[J+16>>2]|0)){X=mc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{X=c[y>>2]|0}if((X|0)==-1){c[f>>2]=0;F=60;break}if(!V){break}Y=d;c[Y>>2]=U;me(o);me(n);i=e;return}}while(0);do{if((F|0)==60){if(V){break}Y=d;c[Y>>2]=U;me(o);me(n);i=e;return}}while(0);c[j>>2]=c[j>>2]|2;Y=d;c[Y>>2]=U;me(o);me(n);i=e;return}function Gg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Hg(a,0,k,j,f,g,h);i=b;return}function Hg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==0){t=0}else if((s|0)==64){t=8}else{t=10}s=k;Xg(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=mc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=mc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}oe(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}oe(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{R=c[F>>2]|0}if((Tg(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){mc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Jl(J,c[o>>2]|0,h,t)|0;dj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=mc[c[(c[I>>2]|0)+36>>2]&63](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;me(n);me(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;me(n);me(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;me(n);me(m);i=d;return}function Ig(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Jg(a,0,k,j,f,g,h);i=b;return}function Jg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==8){t=16}else if((s|0)==0){t=0}else if((s|0)==64){t=8}else{t=10}s=k;Xg(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=mc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=mc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{I=w;J=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){I=0;J=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){K=(w&255)>>>1}else{K=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(K|0)){if(F){L=(w&255)>>>1;M=(w&255)>>>1}else{w=c[y>>2]|0;L=w;M=w}oe(n,M<<1,0);if((a[g]&1)==0){N=10}else{N=(c[f>>2]&-2)+ -1|0}oe(n,N,0);if((a[g]&1)==0){O=u}else{O=c[v>>2]|0}c[o>>2]=O+L;P=O}else{P=A}w=B+12|0;F=c[w>>2]|0;Q=B+16|0;if((F|0)==(c[Q>>2]|0)){R=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{R=c[F>>2]|0}if((Tg(R,t,P,o,r,z,m,k,q,s)|0)!=0){I=H;J=P;break}F=c[w>>2]|0;if((F|0)==(c[Q>>2]|0)){mc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=P;continue}else{c[w>>2]=F+4;l=B;A=P;continue}}P=a[m]|0;if((P&1)==0){S=(P&255)>>>1}else{S=c[m+4>>2]|0}do{if((S|0)!=0){P=c[q>>2]|0;if((P-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=P+4;c[P>>2]=A}}while(0);c[j>>2]=Il(J,c[o>>2]|0,h,t)|0;dj(m,k,c[q>>2]|0,h);do{if((B|0)==0){T=0;U=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){V=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{V=c[q>>2]|0}if(!((V|0)==-1)){T=B;U=0;break}c[x>>2]=0;T=0;U=1}}while(0);do{if((I|0)==0){E=60}else{x=c[I+12>>2]|0;if((x|0)==(c[I+16>>2]|0)){W=mc[c[(c[I>>2]|0)+36>>2]&63](I)|0}else{W=c[x>>2]|0}if((W|0)==-1){c[e>>2]=0;E=60;break}if(!U){break}X=b;c[X>>2]=T;me(n);me(m);i=d;return}}while(0);do{if((E|0)==60){if(U){break}X=b;c[X>>2]=T;me(n);me(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;X=b;c[X>>2]=T;me(n);me(m);i=d;return}function Kg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Lg(a,0,k,j,f,g,h);i=b;return}function Lg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+328|0;k=d;l=d+104|0;m=d+112|0;n=d+128|0;o=d+144|0;p=d+152|0;q=d+312|0;r=d+320|0;s=c[g+4>>2]&74;if((s|0)==64){t=8}else if((s|0)==0){t=0}else if((s|0)==8){t=16}else{t=10}s=k;Xg(m,g,s,l);g=n;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(n,10,0);if((a[g]&1)==0){k=n+1|0;u=k;v=n+8|0;w=k}else{k=n+8|0;u=n+1|0;v=k;w=c[k>>2]|0}c[o>>2]=w;k=p;c[q>>2]=k;c[r>>2]=0;x=e;e=f;f=n;y=n+4|0;z=c[l>>2]|0;l=c[x>>2]|0;A=w;a:while(1){do{if((l|0)==0){B=0;C=1}else{w=c[l+12>>2]|0;if((w|0)==(c[l+16>>2]|0)){D=mc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{D=c[w>>2]|0}if(!((D|0)==-1)){B=l;C=0;break}c[x>>2]=0;B=0;C=1}}while(0);w=c[e>>2]|0;do{if((w|0)==0){E=21}else{F=c[w+12>>2]|0;if((F|0)==(c[w+16>>2]|0)){G=mc[c[(c[w>>2]|0)+36>>2]&63](w)|0}else{G=c[F>>2]|0}if((G|0)==-1){c[e>>2]=0;E=21;break}else{if(C){H=w;break}else{J=w;K=A;break a}}}}while(0);if((E|0)==21){E=0;if(C){J=0;K=A;break}else{H=0}}w=a[g]|0;F=(w&1)==0;if(F){L=(w&255)>>>1}else{L=c[y>>2]|0}if(((c[o>>2]|0)-A|0)==(L|0)){if(F){M=(w&255)>>>1;N=(w&255)>>>1}else{w=c[y>>2]|0;M=w;N=w}oe(n,N<<1,0);if((a[g]&1)==0){O=10}else{O=(c[f>>2]&-2)+ -1|0}oe(n,O,0);if((a[g]&1)==0){P=u}else{P=c[v>>2]|0}c[o>>2]=P+M;Q=P}else{Q=A}w=B+12|0;F=c[w>>2]|0;R=B+16|0;if((F|0)==(c[R>>2]|0)){S=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{S=c[F>>2]|0}if((Tg(S,t,Q,o,r,z,m,k,q,s)|0)!=0){J=H;K=Q;break}F=c[w>>2]|0;if((F|0)==(c[R>>2]|0)){mc[c[(c[B>>2]|0)+40>>2]&63](B)|0;l=B;A=Q;continue}else{c[w>>2]=F+4;l=B;A=Q;continue}}Q=a[m]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[m+4>>2]|0}do{if((T|0)!=0){Q=c[q>>2]|0;if((Q-p|0)>=160){break}A=c[r>>2]|0;c[q>>2]=Q+4;c[Q>>2]=A}}while(0);r=Hl(K,c[o>>2]|0,h,t)|0;t=j;c[t>>2]=r;c[t+4>>2]=I;dj(m,k,c[q>>2]|0,h);do{if((B|0)==0){U=0;V=1}else{q=c[B+12>>2]|0;if((q|0)==(c[B+16>>2]|0)){W=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{W=c[q>>2]|0}if(!((W|0)==-1)){U=B;V=0;break}c[x>>2]=0;U=0;V=1}}while(0);do{if((J|0)==0){E=60}else{x=c[J+12>>2]|0;if((x|0)==(c[J+16>>2]|0)){X=mc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{X=c[x>>2]|0}if((X|0)==-1){c[e>>2]=0;E=60;break}if(!V){break}Y=b;c[Y>>2]=U;me(n);me(m);i=d;return}}while(0);do{if((E|0)==60){if(V){break}Y=b;c[Y>>2]=U;me(n);me(m);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;Y=b;c[Y>>2]=U;me(n);me(m);i=d;return}function Mg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Ng(a,0,k,j,f,g,h);i=b;return}function Ng(b,d,e,f,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;Yg(n,h,v,l,m);h=o;c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;oe(o,10,0);if((a[h]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=mc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=mc[c[(c[z>>2]|0)+36>>2]&63](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[h]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}oe(o,P<<1,0);if((a[h]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}oe(o,Q,0);if((a[h]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=mc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{U=c[I>>2]|0}if((Zg(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){mc[c[(c[E>>2]|0)+40>>2]&63](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);g[k>>2]=+Gl(M,c[p>>2]|0,j);dj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=mc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=mc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;me(o);me(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;me(o);me(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;me(o);me(n);i=d;return}function Og(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Pg(a,0,k,j,f,g,h);i=b;return}function Pg(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;Yg(n,g,v,l,m);g=o;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(o,10,0);if((a[g]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=mc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=mc[c[(c[z>>2]|0)+36>>2]&63](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[g]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}oe(o,P<<1,0);if((a[g]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}oe(o,Q,0);if((a[g]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=mc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{U=c[I>>2]|0}if((Zg(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){mc[c[(c[E>>2]|0)+40>>2]&63](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);h[k>>3]=+Fl(M,c[p>>2]|0,j);dj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=mc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=mc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;me(o);me(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;me(o);me(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;me(o);me(n);i=d;return}function Qg(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 j=0,k=0,l=0,m=0;b=i;i=i+32|0;j=b;k=b+8|0;l=b+16|0;m=b+24|0;c[l>>2]=c[d>>2];c[m>>2]=c[e>>2];e=k;d=l;c[e+0>>2]=c[d+0>>2];d=j;e=m;c[d+0>>2]=c[e+0>>2];Rg(a,0,k,j,f,g,h);i=b;return}function Rg(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var 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,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;d=i;i=i+376|0;l=d+128|0;m=d+136|0;n=d+144|0;o=d+160|0;p=d+176|0;q=d+184|0;r=d+344|0;s=d+352|0;t=d+360|0;u=d+368|0;v=d;Yg(n,g,v,l,m);g=o;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(o,10,0);if((a[g]&1)==0){w=o+1|0;x=w;y=o+8|0;z=w}else{w=o+8|0;x=o+1|0;y=w;z=c[w>>2]|0}c[p>>2]=z;w=q;c[r>>2]=w;c[s>>2]=0;a[t]=1;a[u]=69;A=e;e=f;f=o;B=o+4|0;C=c[l>>2]|0;l=c[m>>2]|0;m=c[A>>2]|0;D=z;a:while(1){do{if((m|0)==0){E=0;F=1}else{z=c[m+12>>2]|0;if((z|0)==(c[m+16>>2]|0)){G=mc[c[(c[m>>2]|0)+36>>2]&63](m)|0}else{G=c[z>>2]|0}if(!((G|0)==-1)){E=m;F=0;break}c[A>>2]=0;E=0;F=1}}while(0);z=c[e>>2]|0;do{if((z|0)==0){H=17}else{I=c[z+12>>2]|0;if((I|0)==(c[z+16>>2]|0)){J=mc[c[(c[z>>2]|0)+36>>2]&63](z)|0}else{J=c[I>>2]|0}if((J|0)==-1){c[e>>2]=0;H=17;break}else{if(F){K=z;break}else{L=z;M=D;break a}}}}while(0);if((H|0)==17){H=0;if(F){L=0;M=D;break}else{K=0}}z=a[g]|0;I=(z&1)==0;if(I){N=(z&255)>>>1}else{N=c[B>>2]|0}if(((c[p>>2]|0)-D|0)==(N|0)){if(I){O=(z&255)>>>1;P=(z&255)>>>1}else{z=c[B>>2]|0;O=z;P=z}oe(o,P<<1,0);if((a[g]&1)==0){Q=10}else{Q=(c[f>>2]&-2)+ -1|0}oe(o,Q,0);if((a[g]&1)==0){R=x}else{R=c[y>>2]|0}c[p>>2]=R+O;S=R}else{S=D}z=E+12|0;I=c[z>>2]|0;T=E+16|0;if((I|0)==(c[T>>2]|0)){U=mc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{U=c[I>>2]|0}if((Zg(U,t,u,S,p,C,l,n,w,r,s,v)|0)!=0){L=K;M=S;break}I=c[z>>2]|0;if((I|0)==(c[T>>2]|0)){mc[c[(c[E>>2]|0)+40>>2]&63](E)|0;m=E;D=S;continue}else{c[z>>2]=I+4;m=E;D=S;continue}}S=a[n]|0;if((S&1)==0){V=(S&255)>>>1}else{V=c[n+4>>2]|0}do{if((V|0)!=0){if((a[t]|0)==0){break}S=c[r>>2]|0;if((S-q|0)>=160){break}D=c[s>>2]|0;c[r>>2]=S+4;c[S>>2]=D}}while(0);h[k>>3]=+El(M,c[p>>2]|0,j);dj(n,w,c[r>>2]|0,j);do{if((E|0)==0){W=0;X=1}else{r=c[E+12>>2]|0;if((r|0)==(c[E+16>>2]|0)){Y=mc[c[(c[E>>2]|0)+36>>2]&63](E)|0}else{Y=c[r>>2]|0}if(!((Y|0)==-1)){W=E;X=0;break}c[A>>2]=0;W=0;X=1}}while(0);do{if((L|0)==0){H=57}else{A=c[L+12>>2]|0;if((A|0)==(c[L+16>>2]|0)){Z=mc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{Z=c[A>>2]|0}if((Z|0)==-1){c[e>>2]=0;H=57;break}if(!X){break}_=b;c[_>>2]=W;me(o);me(n);i=d;return}}while(0);do{if((H|0)==57){if(X){break}_=b;c[_>>2]=W;me(o);me(n);i=d;return}}while(0);c[j>>2]=c[j>>2]|2;_=b;c[_>>2]=W;me(o);me(n);i=d;return}function Sg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,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;d=i;i=i+8|0;k=d;l=i;i=i+16|0;m=i;i=i+104|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+160|0;r=n;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;Ge(o,g);g=o;o=c[g>>2]|0;if(!((c[57586]|0)==-1)){c[l>>2]=230344;c[l+4>>2]=112;c[l+8>>2]=0;he(230344,l,113)}l=(c[230348>>2]|0)+ -1|0;s=c[o+8>>2]|0;if(!((c[o+12>>2]|0)-s>>2>>>0>l>>>0)){t=Va(4)|0;u=t;gm(u);xb(t|0,238312,101)}o=c[s+(l<<2)>>2]|0;if((o|0)==0){t=Va(4)|0;u=t;gm(u);xb(t|0,238312,101)}t=m;sc[c[(c[o>>2]|0)+48>>2]&7](o,228896,228922|0,t)|0;Pd(c[g>>2]|0)|0;g=p;c[g+0>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;oe(p,10,0);if((a[g]&1)==0){o=p+1|0;v=o;w=p+8|0;x=o}else{o=p+8|0;v=p+1|0;w=o;x=c[o>>2]|0}o=e;e=f;f=p;u=p+4|0;l=m+96|0;s=m+100|0;y=q;z=m+104|0;A=m;m=n+4|0;B=c[o>>2]|0;C=x;D=q;q=0;E=x;a:while(1){do{if((B|0)==0){F=0;G=1}else{x=c[B+12>>2]|0;if((x|0)==(c[B+16>>2]|0)){H=mc[c[(c[B>>2]|0)+36>>2]&63](B)|0}else{H=c[x>>2]|0}if(!((H|0)==-1)){F=B;G=0;break}c[o>>2]=0;F=0;G=1}}while(0);x=c[e>>2]|0;do{if((x|0)==0){I=22}else{J=c[x+12>>2]|0;if((J|0)==(c[x+16>>2]|0)){K=mc[c[(c[x>>2]|0)+36>>2]&63](x)|0}else{K=c[J>>2]|0}if((K|0)==-1){c[e>>2]=0;I=22;break}else{if(G){break}else{L=E;break a}}}}while(0);if((I|0)==22){I=0;if(G){L=E;break}}x=a[g]|0;J=(x&1)==0;if(J){M=(x&255)>>>1}else{M=c[u>>2]|0}if((C-E|0)==(M|0)){if(J){N=(x&255)>>>1;O=(x&255)>>>1}else{x=c[u>>2]|0;N=x;O=x}oe(p,O<<1,0);if((a[g]&1)==0){P=10}else{P=(c[f>>2]&-2)+ -1|0}oe(p,P,0);if((a[g]&1)==0){Q=v}else{Q=c[w>>2]|0}R=Q+N|0;S=Q}else{R=C;S=E}x=c[F+12>>2]|0;if((x|0)==(c[F+16>>2]|0)){T=mc[c[(c[F>>2]|0)+36>>2]&63](F)|0}else{T=c[x>>2]|0}x=(R|0)==(S|0);do{if(x){J=(c[l>>2]|0)==(T|0);if(!J){if((c[s>>2]|0)!=(T|0)){I=43;break}}a[R]=J?43:45;U=R+1|0;V=D;W=0}else{I=43}}while(0);do{if((I|0)==43){I=0;J=a[r]|0;if((J&1)==0){X=(J&255)>>>1}else{X=c[m>>2]|0}if((X|0)!=0&(T|0)==0){if((D-y|0)>=160){U=R;V=D;W=q;break}c[D>>2]=q;U=R;V=D+4|0;W=0;break}else{Y=t}while(1){J=Y+4|0;if((c[Y>>2]|0)==(T|0)){Z=Y;break}if((J|0)==(z|0)){Z=z;break}else{Y=J}}J=Z-A|0;_=J>>2;if((J|0)>92){L=S;break a}if((J|0)<88){a[R]=a[228896+_|0]|0;U=R+1|0;V=D;W=q+1|0;break}if(x){L=R;break a}if((R-S|0)>=3){L=S;break a}if((a[R+ -1|0]|0)!=48){L=S;break a}a[R]=a[228896+_|0]|0;U=R+1|0;V=D;W=0}}while(0);x=c[o>>2]|0;_=x+12|0;J=c[_>>2]|0;if((J|0)==(c[x+16>>2]|0)){mc[c[(c[x>>2]|0)+40>>2]&63](x)|0;B=x;C=U;D=V;q=W;E=S;continue}else{c[_>>2]=J+4;B=x;C=U;D=V;q=W;E=S;continue}}a[L+3|0]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);S=c[57560]|0;c[k>>2]=j;if((vg(L,S,228936,k)|0)!=1){c[h>>2]=4}k=c[o>>2]|0;do{if((k|0)==0){$=0;aa=1}else{S=c[k+12>>2]|0;if((S|0)==(c[k+16>>2]|0)){ba=mc[c[(c[k>>2]|0)+36>>2]&63](k)|0}else{ba=c[S>>2]|0}if(!((ba|0)==-1)){$=k;aa=0;break}c[o>>2]=0;$=0;aa=1}}while(0);o=c[e>>2]|0;do{if((o|0)==0){I=78}else{k=c[o+12>>2]|0;if((k|0)==(c[o+16>>2]|0)){ca=mc[c[(c[o>>2]|0)+36>>2]&63](o)|0}else{ca=c[k>>2]|0}if((ca|0)==-1){c[e>>2]=0;I=78;break}if(!aa){break}da=b;c[da>>2]=$;me(p);me(n);i=d;return}}while(0);do{if((I|0)==78){if(aa){break}da=b;c[da>>2]=$;me(p);me(n);i=d;return}}while(0);c[h>>2]=c[h>>2]|2;da=b;c[da>>2]=$;me(p);me(n);i=d;return}\n\n\n\nfunction Tg(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;o=c[f>>2]|0;p=(o|0)==(e|0);do{if(p){q=(c[m+96>>2]|0)==(b|0);if(!q){if((c[m+100>>2]|0)!=(b|0)){break}}c[f>>2]=e+1;a[e]=q?43:45;c[g>>2]=0;r=0;i=n;return r|0}}while(0);q=a[j]|0;if((q&1)==0){s=(q&255)>>>1}else{s=c[j+4>>2]|0}if((s|0)!=0&(b|0)==(h|0)){h=c[l>>2]|0;if((h-k|0)>=160){r=0;i=n;return r|0}k=c[g>>2]|0;c[l>>2]=h+4;c[h>>2]=k;c[g>>2]=0;r=0;i=n;return r|0}k=m+104|0;h=m;while(1){l=h+4|0;if((c[h>>2]|0)==(b|0)){t=h;break}if((l|0)==(k|0)){t=k;break}else{h=l}}h=t-m|0;m=h>>2;if((h|0)>92){r=-1;i=n;return r|0}do{if((d|0)==10|(d|0)==8){if((m|0)<(d|0)){break}else{r=-1}i=n;return r|0}else if((d|0)==16){if((h|0)<88){break}if(p){r=-1;i=n;return r|0}if((o-e|0)>=3){r=-1;i=n;return r|0}if((a[o+ -1|0]|0)!=48){r=-1;i=n;return r|0}c[g>>2]=0;t=a[228896+m|0]|0;c[f>>2]=o+1;a[o]=t;r=0;i=n;return r|0}}while(0);e=a[228896+m|0]|0;c[f>>2]=o+1;a[o]=e;c[g>>2]=(c[g>>2]|0)+1;r=0;i=n;return r|0}function Ug(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+40|0;h=g;j=g+16|0;k=g+32|0;Ge(k,d);d=k;k=c[d>>2]|0;if(!((c[57588]|0)==-1)){c[j>>2]=230352;c[j+4>>2]=112;c[j+8>>2]=0;he(230352,j,113)}j=(c[230356>>2]|0)+ -1|0;l=c[k+8>>2]|0;if(!((c[k+12>>2]|0)-l>>2>>>0>j>>>0)){m=Va(4)|0;n=m;gm(n);xb(m|0,238312,101)}k=c[l+(j<<2)>>2]|0;if((k|0)==0){m=Va(4)|0;n=m;gm(n);xb(m|0,238312,101)}sc[c[(c[k>>2]|0)+32>>2]&7](k,228896,228922|0,e)|0;e=c[d>>2]|0;if(!((c[57624]|0)==-1)){c[h>>2]=230496;c[h+4>>2]=112;c[h+8>>2]=0;he(230496,h,113)}h=(c[230500>>2]|0)+ -1|0;k=c[e+8>>2]|0;if(!((c[e+12>>2]|0)-k>>2>>>0>h>>>0)){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}e=c[k+(h<<2)>>2]|0;if((e|0)==0){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}else{o=e;a[f]=mc[c[(c[e>>2]|0)+16>>2]&63](o)|0;kc[c[(c[e>>2]|0)+20>>2]&63](b,o);Pd(c[d>>2]|0)|0;i=g;return}}function Vg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+40|0;j=h;k=h+16|0;l=h+32|0;Ge(l,d);d=l;l=c[d>>2]|0;if(!((c[57588]|0)==-1)){c[k>>2]=230352;c[k+4>>2]=112;c[k+8>>2]=0;he(230352,k,113)}k=(c[230356>>2]|0)+ -1|0;m=c[l+8>>2]|0;if(!((c[l+12>>2]|0)-m>>2>>>0>k>>>0)){n=Va(4)|0;o=n;gm(o);xb(n|0,238312,101)}l=c[m+(k<<2)>>2]|0;if((l|0)==0){n=Va(4)|0;o=n;gm(o);xb(n|0,238312,101)}sc[c[(c[l>>2]|0)+32>>2]&7](l,228896,228928|0,e)|0;e=c[d>>2]|0;if(!((c[57624]|0)==-1)){c[j>>2]=230496;c[j+4>>2]=112;c[j+8>>2]=0;he(230496,j,113)}j=(c[230500>>2]|0)+ -1|0;l=c[e+8>>2]|0;if(!((c[e+12>>2]|0)-l>>2>>>0>j>>>0)){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}e=c[l+(j<<2)>>2]|0;if((e|0)==0){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}else{p=e;q=e;a[f]=mc[c[(c[q>>2]|0)+12>>2]&63](p)|0;a[g]=mc[c[(c[q>>2]|0)+16>>2]&63](p)|0;kc[c[(c[e>>2]|0)+20>>2]&63](b,p);Pd(c[d>>2]|0)|0;i=h;return}}function Wg(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0;p=i;if(b<<24>>24==h<<24>>24){if((a[d]|0)==0){q=-1;i=p;return q|0}a[d]=0;h=c[g>>2]|0;c[g>>2]=h+1;a[h]=46;h=a[k]|0;if((h&1)==0){r=(h&255)>>>1}else{r=c[k+4>>2]|0}if((r|0)==0){q=0;i=p;return q|0}r=c[m>>2]|0;if((r-l|0)>=160){q=0;i=p;return q|0}h=c[n>>2]|0;c[m>>2]=r+4;c[r>>2]=h;q=0;i=p;return q|0}do{if(b<<24>>24==j<<24>>24){h=a[k]|0;if((h&1)==0){s=(h&255)>>>1}else{s=c[k+4>>2]|0}if((s|0)==0){break}if((a[d]|0)==0){q=-1;i=p;return q|0}h=c[m>>2]|0;if((h-l|0)>=160){q=0;i=p;return q|0}r=c[n>>2]|0;c[m>>2]=h+4;c[h>>2]=r;c[n>>2]=0;q=0;i=p;return q|0}}while(0);s=o+32|0;j=o;while(1){r=j+1|0;if((a[j]|0)==b<<24>>24){t=j;break}if((r|0)==(s|0)){t=s;break}else{j=r}}j=t-o|0;if((j|0)>31){q=-1;i=p;return q|0}o=a[228896+j|0]|0;if((j|0)==23|(j|0)==22){a[e]=80;t=c[g>>2]|0;c[g>>2]=t+1;a[t]=o;q=0;i=p;return q|0}else if((j|0)==24|(j|0)==25){t=c[g>>2]|0;do{if((t|0)!=(f|0)){if((a[t+ -1|0]&95|0)==(a[e]&127|0)){break}else{q=-1}i=p;return q|0}}while(0);c[g>>2]=t+1;a[t]=o;q=0;i=p;return q|0}else{t=o&95;do{if((t|0)==(a[e]|0)){a[e]=t|128;if((a[d]|0)==0){break}a[d]=0;f=a[k]|0;if((f&1)==0){u=(f&255)>>>1}else{u=c[k+4>>2]|0}if((u|0)==0){break}f=c[m>>2]|0;if((f-l|0)>=160){break}s=c[n>>2]|0;c[m>>2]=f+4;c[f>>2]=s}}while(0);m=c[g>>2]|0;c[g>>2]=m+1;a[m]=o;if((j|0)>21){q=0;i=p;return q|0}c[n>>2]=(c[n>>2]|0)+1;q=0;i=p;return q|0}return 0}function Xg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;i=i+40|0;g=f;h=f+16|0;j=f+32|0;Ge(j,b);b=j;j=c[b>>2]|0;if(!((c[57586]|0)==-1)){c[h>>2]=230344;c[h+4>>2]=112;c[h+8>>2]=0;he(230344,h,113)}h=(c[230348>>2]|0)+ -1|0;k=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-k>>2>>>0>h>>>0)){l=Va(4)|0;m=l;gm(m);xb(l|0,238312,101)}j=c[k+(h<<2)>>2]|0;if((j|0)==0){l=Va(4)|0;m=l;gm(m);xb(l|0,238312,101)}sc[c[(c[j>>2]|0)+48>>2]&7](j,228896,228922|0,d)|0;d=c[b>>2]|0;if(!((c[57626]|0)==-1)){c[g>>2]=230504;c[g+4>>2]=112;c[g+8>>2]=0;he(230504,g,113)}g=(c[230508>>2]|0)+ -1|0;j=c[d+8>>2]|0;if(!((c[d+12>>2]|0)-j>>2>>>0>g>>>0)){n=Va(4)|0;o=n;gm(o);xb(n|0,238312,101)}d=c[j+(g<<2)>>2]|0;if((d|0)==0){n=Va(4)|0;o=n;gm(o);xb(n|0,238312,101)}else{n=d;c[e>>2]=mc[c[(c[d>>2]|0)+16>>2]&63](n)|0;kc[c[(c[d>>2]|0)+20>>2]&63](a,n);Pd(c[b>>2]|0)|0;i=f;return}}function Yg(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+40|0;h=g;j=g+16|0;k=g+32|0;Ge(k,b);b=k;k=c[b>>2]|0;if(!((c[57586]|0)==-1)){c[j>>2]=230344;c[j+4>>2]=112;c[j+8>>2]=0;he(230344,j,113)}j=(c[230348>>2]|0)+ -1|0;l=c[k+8>>2]|0;if(!((c[k+12>>2]|0)-l>>2>>>0>j>>>0)){m=Va(4)|0;n=m;gm(n);xb(m|0,238312,101)}k=c[l+(j<<2)>>2]|0;if((k|0)==0){m=Va(4)|0;n=m;gm(n);xb(m|0,238312,101)}sc[c[(c[k>>2]|0)+48>>2]&7](k,228896,228928|0,d)|0;d=c[b>>2]|0;if(!((c[57626]|0)==-1)){c[h>>2]=230504;c[h+4>>2]=112;c[h+8>>2]=0;he(230504,h,113)}h=(c[230508>>2]|0)+ -1|0;k=c[d+8>>2]|0;if(!((c[d+12>>2]|0)-k>>2>>>0>h>>>0)){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}d=c[k+(h<<2)>>2]|0;if((d|0)==0){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}else{o=d;p=d;c[e>>2]=mc[c[(c[p>>2]|0)+12>>2]&63](o)|0;c[f>>2]=mc[c[(c[p>>2]|0)+16>>2]&63](o)|0;kc[c[(c[d>>2]|0)+20>>2]&63](a,o);Pd(c[b>>2]|0)|0;i=g;return}}function Zg(b,d,e,f,g,h,j,k,l,m,n,o){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var p=0,q=0,r=0,s=0,t=0,u=0;p=i;if((b|0)==(h|0)){if((a[d]|0)==0){q=-1;i=p;return q|0}a[d]=0;h=c[g>>2]|0;c[g>>2]=h+1;a[h]=46;h=a[k]|0;if((h&1)==0){r=(h&255)>>>1}else{r=c[k+4>>2]|0}if((r|0)==0){q=0;i=p;return q|0}r=c[m>>2]|0;if((r-l|0)>=160){q=0;i=p;return q|0}h=c[n>>2]|0;c[m>>2]=r+4;c[r>>2]=h;q=0;i=p;return q|0}do{if((b|0)==(j|0)){h=a[k]|0;if((h&1)==0){s=(h&255)>>>1}else{s=c[k+4>>2]|0}if((s|0)==0){break}if((a[d]|0)==0){q=-1;i=p;return q|0}h=c[m>>2]|0;if((h-l|0)>=160){q=0;i=p;return q|0}r=c[n>>2]|0;c[m>>2]=h+4;c[h>>2]=r;c[n>>2]=0;q=0;i=p;return q|0}}while(0);s=o+128|0;j=o;while(1){r=j+4|0;if((c[j>>2]|0)==(b|0)){t=j;break}if((r|0)==(s|0)){t=s;break}else{j=r}}j=t-o|0;o=j>>2;if((j|0)>124){q=-1;i=p;return q|0}t=a[228896+o|0]|0;do{if((o|0)==23|(o|0)==22){a[e]=80}else if((o|0)==24|(o|0)==25){s=c[g>>2]|0;do{if((s|0)!=(f|0)){if((a[s+ -1|0]&95|0)==(a[e]&127|0)){break}else{q=-1}i=p;return q|0}}while(0);c[g>>2]=s+1;a[s]=t;q=0;i=p;return q|0}else{b=t&95;if((b|0)!=(a[e]|0)){break}a[e]=b|128;if((a[d]|0)==0){break}a[d]=0;b=a[k]|0;if((b&1)==0){u=(b&255)>>>1}else{u=c[k+4>>2]|0}if((u|0)==0){break}b=c[m>>2]|0;if((b-l|0)>=160){break}r=c[n>>2]|0;c[m>>2]=b+4;c[b>>2]=r}}while(0);m=c[g>>2]|0;c[g>>2]=m+1;a[m]=t;if((j|0)>84){q=0;i=p;return q|0}c[n>>2]=(c[n>>2]|0)+1;q=0;i=p;return q|0}function _g(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function $g(a){a=a|0;i=i;return}function ah(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 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;j=i;i=i+56|0;k=j;l=j+8|0;m=j+24|0;n=j+32|0;o=j+40|0;if((c[f+4>>2]&1|0)==0){p=c[(c[d>>2]|0)+24>>2]|0;c[m>>2]=c[e>>2];q=h&1;r=k;s=m;c[r+0>>2]=c[s+0>>2];uc[p&15](b,d,k,f,g,q);i=j;return}Ge(n,f);f=n;n=c[f>>2]|0;if(!((c[57624]|0)==-1)){c[l>>2]=230496;c[l+4>>2]=112;c[l+8>>2]=0;he(230496,l,113)}l=(c[230500>>2]|0)+ -1|0;q=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-q>>2>>>0>l>>>0)){t=Va(4)|0;u=t;gm(u);xb(t|0,238312,101)}n=c[q+(l<<2)>>2]|0;if((n|0)==0){t=Va(4)|0;u=t;gm(u);xb(t|0,238312,101)}t=n;Pd(c[f>>2]|0)|0;f=c[n>>2]|0;if(h){kc[c[f+24>>2]&63](o,t)}else{kc[c[f+28>>2]&63](o,t)}t=o;f=a[t]|0;if((f&1)==0){h=o+1|0;v=h;w=h;x=o+8|0}else{h=o+8|0;v=c[h>>2]|0;w=o+1|0;x=h}h=e;e=o+4|0;n=f;f=v;while(1){if((n&1)==0){y=w;z=(n&255)>>>1}else{y=c[x>>2]|0;z=c[e>>2]|0}if((f|0)==(y+z|0)){break}v=a[f]|0;u=c[h>>2]|0;do{if((u|0)!=0){l=u+24|0;q=c[l>>2]|0;if((q|0)!=(c[u+28>>2]|0)){c[l>>2]=q+1;a[q]=v;break}if(!((vc[c[(c[u>>2]|0)+52>>2]&15](u,v&255)|0)==-1)){break}c[h>>2]=0}}while(0);n=a[t]|0;f=f+1|0}c[b>>2]=c[h>>2];me(o);i=j;return}function bh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+24|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[229144|0]|0;a[s+1|0]=a[229145|0]|0;a[s+2|0]=a[229146|0]|0;a[s+3|0]=a[229147|0]|0;a[s+4|0]=a[229148|0]|0;a[s+5|0]=a[229149|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=m;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);v=c[57560]|0;c[k>>2]=h;h=ch(w,12,v,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==32){y=k}else if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Ge(q,f);dh(w,y,k,z,o,p,q);Pd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];gd(b,j,z,e,o,f,g);i=d;return}function ch(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;g=i;i=i+16|0;h=g;c[h>>2]=f;f=ib(d|0)|0;d=Lb(a|0,b|0,e|0,h|0)|0;if((f|0)==0){i=g;return d|0}ib(f|0)|0;i=g;return d|0}function dh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[57588]|0)==-1)){c[m>>2]=230352;c[m+4>>2]=112;c[m+8>>2]=0;he(230352,m,113)}m=(c[230356>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}q=j;r=c[o>>2]|0;if(!((c[57624]|0)==-1)){c[l>>2]=230496;c[l+4>>2]=112;c[l+8>>2]=0;he(230496,l,113)}l=(c[230500>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}s=r;kc[c[(c[r>>2]|0)+20>>2]&63](n,s);t=n;l=a[t]|0;if((l&1)==0){u=(l&255)>>>1}else{u=c[n+4>>2]|0}do{if((u|0)==0){sc[c[(c[j>>2]|0)+32>>2]&7](q,b,e,f)|0;c[h>>2]=f+(e-b)}else{c[h>>2]=f;l=a[b]|0;if(l<<24>>24==43|l<<24>>24==45){o=vc[c[(c[j>>2]|0)+28>>2]&15](q,l)|0;l=c[h>>2]|0;c[h>>2]=l+1;a[l]=o;v=b+1|0}else{v=b}do{if((e-v|0)>1){if((a[v]|0)!=48){w=v;break}o=v+1|0;l=a[o]|0;if(!(l<<24>>24==88|l<<24>>24==120)){w=v;break}l=j;m=vc[c[(c[l>>2]|0)+28>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=m;m=vc[c[(c[l>>2]|0)+28>>2]&15](q,a[o]|0)|0;o=c[h>>2]|0;c[h>>2]=o+1;a[o]=m;w=v+2|0}else{w=v}}while(0);do{if((w|0)!=(e|0)){m=e+ -1|0;if(m>>>0>w>>>0){x=w;y=m}else{break}do{m=a[x]|0;a[x]=a[y]|0;a[y]=m;x=x+1|0;y=y+ -1|0;}while(x>>>0<y>>>0)}}while(0);m=mc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(w>>>0<e>>>0){o=n+1|0;l=j;p=n+4|0;z=n+8|0;A=0;B=0;C=w;while(1){D=(a[t]&1)==0;do{if((a[(D?o:c[z>>2]|0)+B|0]|0)==0){E=A;F=B}else{if((A|0)!=(a[(D?o:c[z>>2]|0)+B|0]|0)){E=A;F=B;break}G=c[h>>2]|0;c[h>>2]=G+1;a[G]=m;G=a[t]|0;if((G&1)==0){H=(G&255)>>>1}else{H=c[p>>2]|0}E=0;F=(B>>>0<(H+ -1|0)>>>0)+B|0}}while(0);D=vc[c[(c[l>>2]|0)+28>>2]&15](q,a[C]|0)|0;G=c[h>>2]|0;c[h>>2]=G+1;a[G]=D;D=C+1|0;if(D>>>0<e>>>0){A=E+1|0;B=F;C=D}else{break}}}C=f+(w-b)|0;B=c[h>>2]|0;if((C|0)==(B|0)){break}A=B+ -1|0;if(A>>>0>C>>>0){I=C;J=A}else{break}do{A=a[I]|0;a[I]=a[J]|0;a[J]=A;I=I+1|0;J=J+ -1|0;}while(I>>>0<J>>>0)}}while(0);if((d|0)==(e|0)){K=c[h>>2]|0;c[g>>2]=K;me(n);i=k;return}else{K=f+(d-b)|0;c[g>>2]=K;me(n);i=k;return}}function eh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+48|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=100}}while(0);w=n;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);x=c[57560]|0;v=l;c[v>>2]=h;c[v+4>>2]=j;j=ch(w,22,x,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else if((t|0)==32){y=l}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Ge(r,f);dh(w,y,l,z,p,q,r);Pd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];gd(b,k,z,e,p,f,g);i=d;return}function fh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+24|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[229144|0]|0;a[s+1|0]=a[229145|0]|0;a[s+2|0]=a[229146|0]|0;a[s+3|0]=a[229147|0]|0;a[s+4|0]=a[229148|0]|0;a[s+5|0]=a[229149|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=117}}while(0);w=m;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);v=c[57560]|0;c[k>>2]=h;h=ch(w,12,v,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==32){y=k}else if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Ge(q,f);dh(w,y,k,z,o,p,q);Pd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];gd(b,j,z,e,o,f,g);i=d;return}function gh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+48|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=n;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);x=c[57560]|0;v=l;c[v>>2]=h;c[v+4>>2]=j;j=ch(w,23,x,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Ge(r,f);dh(w,y,l,z,p,q,r);Pd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];gd(b,k,z,e,p,f,g);i=d;return}function hh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+24|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+64|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){if((q&1|0)==0){a[D]=97;E=0;break}else{a[D]=65;E=0;break}}else{a[D]=46;B=D+2|0;a[D+1|0]=42;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=ch(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=ch(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[230248]|0)==0;if(E){do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=ih(s,r,z,n)|0}else{do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);o=c[57560]|0;c[m>>2]=c[f+8>>2];r=m+4|0;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=ih(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Nm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Bm(J<<1)|0;if((L|0)!=0){M=H;N=L;O=L;break}Nm()}}while(0);Ge(w,f);jh(M,K,F,O,u,v,w);Pd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];gd(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Cm(N)}if((I|0)==0){i=d;return}Cm(I);i=d;return}function ih(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+16|0;g=f;c[g>>2]=e;e=ib(b|0)|0;b=Gb(a|0,d|0,g|0)|0;if((e|0)==0){i=f;return b|0}ib(e|0)|0;i=f;return b|0}function jh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[57588]|0)==-1)){c[m>>2]=230352;c[m+4>>2]=112;c[m+8>>2]=0;he(230352,m,113)}m=(c[230356>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}q=j;r=c[o>>2]|0;if(!((c[57624]|0)==-1)){c[l>>2]=230496;c[l+4>>2]=112;c[l+8>>2]=0;he(230496,l,113)}l=(c[230500>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}s=r;kc[c[(c[r>>2]|0)+20>>2]&63](n,s);c[h>>2]=f;t=a[b]|0;if(t<<24>>24==43|t<<24>>24==45){l=vc[c[(c[j>>2]|0)+28>>2]&15](q,t)|0;t=c[h>>2]|0;c[h>>2]=t+1;a[t]=l;u=b+1|0}else{u=b}l=e;a:do{if((l-u|0)>1){if((a[u]|0)!=48){v=14;break}t=u+1|0;o=a[t]|0;if(!(o<<24>>24==88|o<<24>>24==120)){v=14;break}o=j;m=vc[c[(c[o>>2]|0)+28>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=m;m=u+2|0;p=vc[c[(c[o>>2]|0)+28>>2]&15](q,a[t]|0)|0;t=c[h>>2]|0;c[h>>2]=t+1;a[t]=p;if(m>>>0<e>>>0){w=m}else{x=m;y=m;break}while(1){p=a[w]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);t=w+1|0;if((Xa(p<<24>>24|0,c[57560]|0)|0)==0){x=m;y=w;break a}if(t>>>0<e>>>0){w=t}else{x=m;y=t;break}}}else{v=14}}while(0);b:do{if((v|0)==14){if(u>>>0<e>>>0){z=u}else{x=u;y=u;break}while(1){w=a[z]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);p=z+1|0;if((ub(w<<24>>24|0,c[57560]|0)|0)==0){x=u;y=z;break b}if(p>>>0<e>>>0){z=p}else{x=u;y=p;break}}}}while(0);u=n;z=a[u]|0;if((z&1)==0){A=(z&255)>>>1}else{A=c[n+4>>2]|0}do{if((A|0)==0){sc[c[(c[j>>2]|0)+32>>2]&7](q,x,y,c[h>>2]|0)|0;c[h>>2]=(c[h>>2]|0)+(y-x)}else{do{if((x|0)!=(y|0)){z=y+ -1|0;if(z>>>0>x>>>0){B=x;C=z}else{break}do{z=a[B]|0;a[B]=a[C]|0;a[C]=z;B=B+1|0;C=C+ -1|0;}while(B>>>0<C>>>0)}}while(0);w=mc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(x>>>0<y>>>0){z=n+1|0;v=n+4|0;p=n+8|0;m=j;t=0;o=0;D=x;while(1){E=(a[u]&1)==0;do{if((a[(E?z:c[p>>2]|0)+o|0]|0)>0){if((t|0)!=(a[(E?z:c[p>>2]|0)+o|0]|0)){F=t;G=o;break}H=c[h>>2]|0;c[h>>2]=H+1;a[H]=w;H=a[u]|0;if((H&1)==0){I=(H&255)>>>1}else{I=c[v>>2]|0}F=0;G=(o>>>0<(I+ -1|0)>>>0)+o|0}else{F=t;G=o}}while(0);E=vc[c[(c[m>>2]|0)+28>>2]&15](q,a[D]|0)|0;H=c[h>>2]|0;c[h>>2]=H+1;a[H]=E;E=D+1|0;if(E>>>0<y>>>0){t=F+1|0;o=G;D=E}else{break}}}D=f+(x-b)|0;o=c[h>>2]|0;if((D|0)==(o|0)){break}t=o+ -1|0;if(t>>>0>D>>>0){J=D;K=t}else{break}do{t=a[J]|0;a[J]=a[K]|0;a[K]=t;J=J+1|0;K=K+ -1|0;}while(J>>>0<K>>>0)}}while(0);c:do{if(y>>>0<e>>>0){K=j;J=y;while(1){x=a[J]|0;if(x<<24>>24==46){break}G=vc[c[(c[K>>2]|0)+28>>2]&15](q,x)|0;x=c[h>>2]|0;c[h>>2]=x+1;a[x]=G;G=J+1|0;if(G>>>0<e>>>0){J=G}else{L=G;break c}}K=mc[c[(c[r>>2]|0)+12>>2]&63](s)|0;G=c[h>>2]|0;c[h>>2]=G+1;a[G]=K;L=J+1|0}else{L=y}}while(0);sc[c[(c[j>>2]|0)+32>>2]&7](q,L,e,c[h>>2]|0)|0;q=(c[h>>2]|0)+(l-L)|0;c[h>>2]=q;if((d|0)==(e|0)){M=q;c[g>>2]=M;me(n);i=k;return}M=f+(d-b)|0;c[g>>2]=M;me(n);i=k;return}function kh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+64|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){a[D]=76;B=D+1|0;if((q&1|0)==0){a[B]=97;E=0;break}else{a[B]=65;E=0;break}}else{a[D]=46;a[D+1|0]=42;a[D+2|0]=76;B=D+3|0;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=ch(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=ch(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[230248]|0)==0;if(E){do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=ih(s,r,z,n)|0}else{do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);o=c[57560]|0;r=m;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=ih(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Nm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==32){K=F}else if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Bm(J<<1)|0;if((L|0)!=0){M=H;N=L;O=L;break}Nm()}}while(0);Ge(w,f);jh(M,K,F,O,u,v,w);Pd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];gd(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Cm(N)}if((I|0)==0){i=d;return}Cm(I);i=d;return}function lh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+16|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+40|0;p=i;i=i+8|0;q=i;i=i+8|0;r=m;a[r+0|0]=a[229152|0]|0;a[r+1|0]=a[229153|0]|0;a[r+2|0]=a[229154|0]|0;a[r+3|0]=a[229155|0]|0;a[r+4|0]=a[229156|0]|0;a[r+5|0]=a[229157|0]|0;m=n;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);s=c[57560]|0;c[k>>2]=h;h=ch(m,20,s,r,k)|0;k=n+h|0;r=c[f+4>>2]&176;do{if((r|0)==32){t=k}else if((r|0)==16){s=a[m]|0;if(s<<24>>24==43|s<<24>>24==45){t=n+1|0;break}if(!((h|0)>1&s<<24>>24==48)){u=10;break}s=a[n+1|0]|0;if(!(s<<24>>24==88|s<<24>>24==120)){u=10;break}t=n+2|0}else{u=10}}while(0);if((u|0)==10){t=m}u=o;Ge(p,f);r=p;p=c[r>>2]|0;if(!((c[57588]|0)==-1)){c[l>>2]=230352;c[l+4>>2]=112;c[l+8>>2]=0;he(230352,l,113)}l=(c[230356>>2]|0)+ -1|0;s=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-s>>2>>>0>l>>>0)){v=Va(4)|0;w=v;gm(w);xb(v|0,238312,101)}p=c[s+(l<<2)>>2]|0;if((p|0)==0){v=Va(4)|0;w=v;gm(w);xb(v|0,238312,101)}Pd(c[r>>2]|0)|0;sc[c[(c[p>>2]|0)+32>>2]&7](p,m,k,u)|0;m=o+h|0;if((t|0)==(k|0)){x=m;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];gd(b,j,u,x,m,f,g);E=j;i=d;return}x=o+(t-n)|0;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];gd(b,j,u,x,m,f,g);E=j;i=d;return}function mh(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function nh(a){a=a|0;i=i;return}function oh(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 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;j=i;i=i+56|0;k=j;l=j+8|0;m=j+24|0;n=j+32|0;o=j+40|0;if((c[f+4>>2]&1|0)==0){p=c[(c[d>>2]|0)+24>>2]|0;c[m>>2]=c[e>>2];q=h&1;r=k;s=m;c[r+0>>2]=c[s+0>>2];uc[p&15](b,d,k,f,g,q);i=j;return}Ge(n,f);f=n;n=c[f>>2]|0;if(!((c[57626]|0)==-1)){c[l>>2]=230504;c[l+4>>2]=112;c[l+8>>2]=0;he(230504,l,113)}l=(c[230508>>2]|0)+ -1|0;q=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-q>>2>>>0>l>>>0)){t=Va(4)|0;u=t;gm(u);xb(t|0,238312,101)}n=c[q+(l<<2)>>2]|0;if((n|0)==0){t=Va(4)|0;u=t;gm(u);xb(t|0,238312,101)}t=n;Pd(c[f>>2]|0)|0;f=c[n>>2]|0;if(h){kc[c[f+24>>2]&63](o,t)}else{kc[c[f+28>>2]&63](o,t)}t=o;f=a[t]|0;if((f&1)==0){h=o+4|0;v=h;w=o+8|0;x=h}else{h=o+8|0;v=c[h>>2]|0;w=h;x=o+4|0}h=e;e=f;f=v;while(1){if((e&1)==0){y=x;z=(e&255)>>>1}else{y=c[w>>2]|0;z=c[x>>2]|0}if((f|0)==(y+(z<<2)|0)){break}v=c[f>>2]|0;n=c[h>>2]|0;do{if((n|0)!=0){u=n+24|0;l=c[u>>2]|0;if((l|0)==(c[n+28>>2]|0)){A=vc[c[(c[n>>2]|0)+52>>2]&15](n,v)|0}else{c[u>>2]=l+4;c[l>>2]=v;A=v}if(!((A|0)==-1)){break}c[h>>2]=0}}while(0);e=a[t]|0;f=f+4|0}c[b>>2]=c[h>>2];xe(o);i=j;return}function ph(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+88|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[229144|0]|0;a[s+1|0]=a[229145|0]|0;a[s+2|0]=a[229146|0]|0;a[s+3|0]=a[229147|0]|0;a[s+4|0]=a[229148|0]|0;a[s+5|0]=a[229149|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==64){a[w]=111}else if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else{a[w]=100}}while(0);w=m;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);v=c[57560]|0;c[k>>2]=h;h=ch(w,12,v,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==32){y=k}else if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Ge(q,f);qh(w,y,k,z,o,p,q);Pd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];rh(b,j,z,e,o,f,g);i=d;return}function qh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[57586]|0)==-1)){c[m>>2]=230344;c[m+4>>2]=112;c[m+8>>2]=0;he(230344,m,113)}m=(c[230348>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}q=j;r=c[o>>2]|0;if(!((c[57626]|0)==-1)){c[l>>2]=230504;c[l+4>>2]=112;c[l+8>>2]=0;he(230504,l,113)}l=(c[230508>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}s=r;kc[c[(c[r>>2]|0)+20>>2]&63](n,s);t=n;l=a[t]|0;if((l&1)==0){u=(l&255)>>>1}else{u=c[n+4>>2]|0}do{if((u|0)==0){sc[c[(c[j>>2]|0)+48>>2]&7](q,b,e,f)|0;l=f+(e-b<<2)|0;c[h>>2]=l;v=l}else{c[h>>2]=f;l=a[b]|0;if(l<<24>>24==43|l<<24>>24==45){o=vc[c[(c[j>>2]|0)+44>>2]&15](q,l)|0;l=c[h>>2]|0;c[h>>2]=l+4;c[l>>2]=o;w=b+1|0}else{w=b}do{if((e-w|0)>1){if((a[w]|0)!=48){x=w;break}o=w+1|0;l=a[o]|0;if(!(l<<24>>24==88|l<<24>>24==120)){x=w;break}l=j;m=vc[c[(c[l>>2]|0)+44>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+4;c[p>>2]=m;m=vc[c[(c[l>>2]|0)+44>>2]&15](q,a[o]|0)|0;o=c[h>>2]|0;c[h>>2]=o+4;c[o>>2]=m;x=w+2|0}else{x=w}}while(0);do{if((x|0)!=(e|0)){m=e+ -1|0;if(m>>>0>x>>>0){y=x;z=m}else{break}do{m=a[y]|0;a[y]=a[z]|0;a[z]=m;y=y+1|0;z=z+ -1|0;}while(y>>>0<z>>>0)}}while(0);m=mc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(x>>>0<e>>>0){o=n+1|0;l=j;p=n+4|0;A=n+8|0;B=0;C=0;D=x;while(1){E=(a[t]&1)==0;do{if((a[(E?o:c[A>>2]|0)+C|0]|0)==0){F=B;G=C}else{if((B|0)!=(a[(E?o:c[A>>2]|0)+C|0]|0)){F=B;G=C;break}H=c[h>>2]|0;c[h>>2]=H+4;c[H>>2]=m;H=a[t]|0;if((H&1)==0){I=(H&255)>>>1}else{I=c[p>>2]|0}F=0;G=(C>>>0<(I+ -1|0)>>>0)+C|0}}while(0);E=vc[c[(c[l>>2]|0)+44>>2]&15](q,a[D]|0)|0;H=c[h>>2]|0;J=H+4|0;c[h>>2]=J;c[H>>2]=E;E=D+1|0;if(E>>>0<e>>>0){B=F+1|0;C=G;D=E}else{K=J;break}}}else{K=c[h>>2]|0}D=f+(x-b<<2)|0;if((D|0)==(K|0)){v=K;break}C=K+ -4|0;if(C>>>0>D>>>0){L=D;M=C}else{v=K;break}while(1){C=c[L>>2]|0;c[L>>2]=c[M>>2];c[M>>2]=C;C=L+4|0;D=M+ -4|0;if(C>>>0<D>>>0){M=D;L=C}else{v=K;break}}}}while(0);if((d|0)==(e|0)){N=v;c[g>>2]=N;me(n);i=k;return}N=f+(d-b<<2)|0;c[g>>2]=N;me(n);i=k;return}function rh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;i=i+16|0;l=k;m=d;d=c[m>>2]|0;if((d|0)==0){c[b>>2]=0;i=k;return}n=g;g=e;o=n-g>>2;p=h+12|0;h=c[p>>2]|0;q=(h|0)>(o|0)?h-o|0:0;o=f;h=o-g|0;g=h>>2;do{if((h|0)>0){if((gc[c[(c[d>>2]|0)+48>>2]&31](d,e,g)|0)==(g|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);do{if((q|0)>0){we(l,q,j);if((a[l]&1)==0){r=l+4|0}else{r=c[l+8>>2]|0}if((gc[c[(c[d>>2]|0)+48>>2]&31](d,r,q)|0)==(q|0)){xe(l);break}c[m>>2]=0;c[b>>2]=0;xe(l);i=k;return}}while(0);l=n-o|0;o=l>>2;do{if((l|0)>0){if((gc[c[(c[d>>2]|0)+48>>2]&31](d,f,o)|0)==(o|0)){break}c[m>>2]=0;c[b>>2]=0;i=k;return}}while(0);c[p>>2]=0;c[b>>2]=d;i=k;return}function sh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+168|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=100}}while(0);w=n;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);x=c[57560]|0;v=l;c[v>>2]=h;c[v+4>>2]=j;j=ch(w,22,x,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Ge(r,f);qh(w,y,l,z,p,q,r);Pd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];rh(b,k,z,e,p,f,g);i=d;return}function th(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+8|0;m=i;i=i+16|0;n=i;i=i+88|0;o=i;i=i+8|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=l;a[s+0|0]=a[229144|0]|0;a[s+1|0]=a[229145|0]|0;a[s+2|0]=a[229146|0]|0;a[s+3|0]=a[229147|0]|0;a[s+4|0]=a[229148|0]|0;a[s+5|0]=a[229149|0]|0;t=l+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=t}else{a[t]=43;w=l+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}a[x]=108;w=x+1|0;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=m;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);x=c[57560]|0;c[k>>2]=h;h=ch(w,12,x,s,k)|0;k=m+h|0;s=c[u>>2]&176;do{if((s|0)==32){y=k}else if((s|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=m+1|0;break}if(!((h|0)>1&u<<24>>24==48)){z=20;break}u=a[m+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=m+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=n;Ge(q,f);qh(w,y,k,z,o,p,q);Pd(c[q>>2]|0)|0;c[r>>2]=c[e>>2];e=c[o>>2]|0;o=c[p>>2]|0;p=j;q=r;c[p+0>>2]=c[q+0>>2];rh(b,j,z,e,o,f,g);i=d;return}function uh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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;d=i;i=i+16|0;k=d;l=d+8|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+176|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=m;c[t>>2]=37;c[t+4>>2]=0;t=m;m=t+1|0;u=f+4|0;v=c[u>>2]|0;if((v&2048|0)==0){w=m}else{a[m]=43;w=t+2|0}if((v&512|0)==0){x=w}else{a[w]=35;x=w+1|0}w=x+2|0;a[x]=108;a[x+1|0]=108;x=v&74;do{if((x|0)==8){if((v&16384|0)==0){a[w]=120;break}else{a[w]=88;break}}else if((x|0)==64){a[w]=111}else{a[w]=117}}while(0);w=n;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);x=c[57560]|0;v=l;c[v>>2]=h;c[v+4>>2]=j;j=ch(w,23,x,t,l)|0;l=n+j|0;t=c[u>>2]&176;do{if((t|0)==32){y=l}else if((t|0)==16){u=a[w]|0;if(u<<24>>24==43|u<<24>>24==45){y=n+1|0;break}if(!((j|0)>1&u<<24>>24==48)){z=20;break}u=a[n+1|0]|0;if(!(u<<24>>24==88|u<<24>>24==120)){z=20;break}y=n+2|0}else{z=20}}while(0);if((z|0)==20){y=w}z=o;Ge(r,f);qh(w,y,l,z,p,q,r);Pd(c[r>>2]|0)|0;c[s>>2]=c[e>>2];e=c[p>>2]|0;p=c[q>>2]|0;q=k;r=s;c[q+0>>2]=c[r+0>>2];rh(b,k,z,e,p,f,g);i=d;return}function vh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+24|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+232|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){if((q&1|0)==0){a[D]=97;E=0;break}else{a[D]=65;E=0;break}}else{a[D]=46;B=D+2|0;a[D+1|0]=42;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=ch(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=ch(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[230248]|0)==0;if(E){do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=ih(s,r,z,n)|0}else{do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);o=c[57560]|0;c[m>>2]=c[f+8>>2];r=m+4|0;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=ih(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Nm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else if((s|0)==32){K=F}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Bm(J<<3)|0;s=L;if((L|0)!=0){M=H;N=s;O=s;break}Nm()}}while(0);Ge(w,f);wh(M,K,F,O,u,v,w);Pd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];rh(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Cm(N)}if((I|0)==0){i=d;return}Cm(I);i=d;return}function wh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0;k=i;i=i+48|0;l=k;m=k+16|0;n=k+32|0;o=j;j=c[o>>2]|0;if(!((c[57586]|0)==-1)){c[m>>2]=230344;c[m+4>>2]=112;c[m+8>>2]=0;he(230344,m,113)}m=(c[230348>>2]|0)+ -1|0;p=c[j+8>>2]|0;if(!((c[j+12>>2]|0)-p>>2>>>0>m>>>0)){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}j=c[p+(m<<2)>>2]|0;if((j|0)==0){q=Va(4)|0;r=q;gm(r);xb(q|0,238312,101)}q=j;r=c[o>>2]|0;if(!((c[57626]|0)==-1)){c[l>>2]=230504;c[l+4>>2]=112;c[l+8>>2]=0;he(230504,l,113)}l=(c[230508>>2]|0)+ -1|0;o=c[r+8>>2]|0;if(!((c[r+12>>2]|0)-o>>2>>>0>l>>>0)){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}r=c[o+(l<<2)>>2]|0;if((r|0)==0){s=Va(4)|0;t=s;gm(t);xb(s|0,238312,101)}s=r;kc[c[(c[r>>2]|0)+20>>2]&63](n,s);c[h>>2]=f;t=a[b]|0;if(t<<24>>24==43|t<<24>>24==45){l=vc[c[(c[j>>2]|0)+44>>2]&15](q,t)|0;t=c[h>>2]|0;c[h>>2]=t+4;c[t>>2]=l;u=b+1|0}else{u=b}l=e;a:do{if((l-u|0)>1){if((a[u]|0)!=48){v=14;break}t=u+1|0;o=a[t]|0;if(!(o<<24>>24==88|o<<24>>24==120)){v=14;break}o=j;m=vc[c[(c[o>>2]|0)+44>>2]&15](q,48)|0;p=c[h>>2]|0;c[h>>2]=p+4;c[p>>2]=m;m=u+2|0;p=vc[c[(c[o>>2]|0)+44>>2]&15](q,a[t]|0)|0;t=c[h>>2]|0;c[h>>2]=t+4;c[t>>2]=p;if(m>>>0<e>>>0){w=m}else{x=m;y=m;break}while(1){p=a[w]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);t=w+1|0;if((Xa(p<<24>>24|0,c[57560]|0)|0)==0){x=m;y=w;break a}if(t>>>0<e>>>0){w=t}else{x=m;y=t;break}}}else{v=14}}while(0);b:do{if((v|0)==14){if(u>>>0<e>>>0){z=u}else{x=u;y=u;break}while(1){w=a[z]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);p=z+1|0;if((ub(w<<24>>24|0,c[57560]|0)|0)==0){x=u;y=z;break b}if(p>>>0<e>>>0){z=p}else{x=u;y=p;break}}}}while(0);u=n;z=a[u]|0;if((z&1)==0){A=(z&255)>>>1}else{A=c[n+4>>2]|0}do{if((A|0)==0){sc[c[(c[j>>2]|0)+48>>2]&7](q,x,y,c[h>>2]|0)|0;z=(c[h>>2]|0)+(y-x<<2)|0;c[h>>2]=z;B=z}else{do{if((x|0)!=(y|0)){z=y+ -1|0;if(z>>>0>x>>>0){C=x;D=z}else{break}do{z=a[C]|0;a[C]=a[D]|0;a[D]=z;C=C+1|0;D=D+ -1|0;}while(C>>>0<D>>>0)}}while(0);w=mc[c[(c[r>>2]|0)+16>>2]&63](s)|0;if(x>>>0<y>>>0){z=n+1|0;v=n+4|0;p=n+8|0;m=j;t=0;o=0;E=x;while(1){F=(a[u]&1)==0;do{if((a[(F?z:c[p>>2]|0)+o|0]|0)>0){if((t|0)!=(a[(F?z:c[p>>2]|0)+o|0]|0)){G=t;H=o;break}I=c[h>>2]|0;c[h>>2]=I+4;c[I>>2]=w;I=a[u]|0;if((I&1)==0){J=(I&255)>>>1}else{J=c[v>>2]|0}G=0;H=(o>>>0<(J+ -1|0)>>>0)+o|0}else{G=t;H=o}}while(0);F=vc[c[(c[m>>2]|0)+44>>2]&15](q,a[E]|0)|0;I=c[h>>2]|0;K=I+4|0;c[h>>2]=K;c[I>>2]=F;F=E+1|0;if(F>>>0<y>>>0){t=G+1|0;o=H;E=F}else{L=K;break}}}else{L=c[h>>2]|0}E=f+(x-b<<2)|0;if((E|0)==(L|0)){B=L;break}o=L+ -4|0;if(o>>>0>E>>>0){M=E;N=o}else{B=L;break}while(1){o=c[M>>2]|0;c[M>>2]=c[N>>2];c[N>>2]=o;o=M+4|0;E=N+ -4|0;if(o>>>0<E>>>0){N=E;M=o}else{B=L;break}}}}while(0);c:do{if(y>>>0<e>>>0){L=j;M=y;while(1){N=a[M]|0;if(N<<24>>24==46){break}x=vc[c[(c[L>>2]|0)+44>>2]&15](q,N)|0;N=c[h>>2]|0;H=N+4|0;c[h>>2]=H;c[N>>2]=x;x=M+1|0;if(x>>>0<e>>>0){M=x}else{O=H;P=x;break c}}L=mc[c[(c[r>>2]|0)+12>>2]&63](s)|0;x=c[h>>2]|0;H=x+4|0;c[h>>2]=H;c[x>>2]=L;O=H;P=M+1|0}else{O=B;P=y}}while(0);sc[c[(c[j>>2]|0)+48>>2]&7](q,P,e,O)|0;O=(c[h>>2]|0)+(l-P<<2)|0;c[h>>2]=O;if((d|0)==(e|0)){Q=O;c[g>>2]=Q;me(n);i=k;return}Q=f+(d-b<<2)|0;c[g>>2]=Q;me(n);i=k;return}function xh(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=+j;var 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,N=0,O=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+8|0;r=i;i=i+32|0;s=i;i=i+8|0;t=i;i=i+232|0;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;z=q;c[z>>2]=37;c[z+4>>2]=0;z=q;q=z+1|0;A=f+4|0;B=c[A>>2]|0;if((B&2048|0)==0){C=q}else{a[q]=43;C=z+2|0}if((B&1024|0)==0){D=C}else{a[C]=35;D=C+1|0}C=B&260;q=B>>>14;do{if((C|0)==260){a[D]=76;B=D+1|0;if((q&1|0)==0){a[B]=97;E=0;break}else{a[B]=65;E=0;break}}else{a[D]=46;a[D+1|0]=42;a[D+2|0]=76;B=D+3|0;if((C|0)==256){if((q&1|0)==0){a[B]=101;E=1;break}else{a[B]=69;E=1;break}}else if((C|0)==4){if((q&1|0)==0){a[B]=102;E=1;break}else{a[B]=70;E=1;break}}else{if((q&1|0)==0){a[B]=103;E=1;break}else{a[B]=71;E=1;break}}}}while(0);q=r;c[s>>2]=q;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;if(E){c[p>>2]=c[f+8>>2];C=p+4|0;h[k>>3]=j;c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];F=ch(q,30,r,z,p)|0}else{p=o;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];F=ch(q,30,r,z,o)|0}do{if((F|0)>29){o=(a[230248]|0)==0;if(E){do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);r=c[57560]|0;c[n>>2]=c[f+8>>2];p=n+4|0;h[k>>3]=j;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];G=ih(s,r,z,n)|0}else{do{if(o){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);o=c[57560]|0;r=m;h[k>>3]=j;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];G=ih(s,o,z,m)|0}o=c[s>>2]|0;if((o|0)!=0){H=o;I=o;J=G;break}Nm()}else{H=c[s>>2]|0;I=0;J=F}}while(0);F=H+J|0;s=c[A>>2]&176;do{if((s|0)==16){A=a[H]|0;if(A<<24>>24==43|A<<24>>24==45){K=H+1|0;break}if(!((J|0)>1&A<<24>>24==48)){L=44;break}A=a[H+1|0]|0;if(!(A<<24>>24==88|A<<24>>24==120)){L=44;break}K=H+2|0}else if((s|0)==32){K=F}else{L=44}}while(0);if((L|0)==44){K=H}do{if((H|0)==(q|0)){M=q;N=0;O=t}else{L=Bm(J<<3)|0;s=L;if((L|0)!=0){M=H;N=s;O=s;break}Nm()}}while(0);Ge(w,f);wh(M,K,F,O,u,v,w);Pd(c[w>>2]|0)|0;w=e;c[y>>2]=c[w>>2];e=c[u>>2]|0;u=c[v>>2]|0;v=l;F=y;c[v+0>>2]=c[F+0>>2];rh(x,l,O,e,u,f,g);g=c[x>>2]|0;c[w>>2]=g;c[b>>2]=g;if((N|0)!=0){Cm(N)}if((I|0)==0){i=d;return}Cm(I);i=d;return}function yh(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 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;d=i;i=i+16|0;j=d;k=d+8|0;l=i;i=i+16|0;m=i;i=i+8|0;n=i;i=i+24|0;o=i;i=i+152|0;p=i;i=i+8|0;q=i;i=i+8|0;r=m;a[r+0|0]=a[229152|0]|0;a[r+1|0]=a[229153|0]|0;a[r+2|0]=a[229154|0]|0;a[r+3|0]=a[229155|0]|0;a[r+4|0]=a[229156|0]|0;a[r+5|0]=a[229157|0]|0;m=n;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);s=c[57560]|0;c[k>>2]=h;h=ch(m,20,s,r,k)|0;k=n+h|0;r=c[f+4>>2]&176;do{if((r|0)==32){t=k}else if((r|0)==16){s=a[m]|0;if(s<<24>>24==43|s<<24>>24==45){t=n+1|0;break}if(!((h|0)>1&s<<24>>24==48)){u=10;break}s=a[n+1|0]|0;if(!(s<<24>>24==88|s<<24>>24==120)){u=10;break}t=n+2|0}else{u=10}}while(0);if((u|0)==10){t=m}Ge(p,f);u=p;p=c[u>>2]|0;if(!((c[57586]|0)==-1)){c[l>>2]=230344;c[l+4>>2]=112;c[l+8>>2]=0;he(230344,l,113)}l=(c[230348>>2]|0)+ -1|0;r=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-r>>2>>>0>l>>>0)){v=Va(4)|0;w=v;gm(w);xb(v|0,238312,101)}p=c[r+(l<<2)>>2]|0;if((p|0)==0){v=Va(4)|0;w=v;gm(w);xb(v|0,238312,101)}Pd(c[u>>2]|0)|0;u=o;sc[c[(c[p>>2]|0)+48>>2]&7](p,m,k,u)|0;m=o+(h<<2)|0;if((t|0)==(k|0)){x=m;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];rh(b,j,u,x,m,f,g);E=j;i=d;return}x=o+(t-n<<2)|0;y=e;z=c[y>>2]|0;A=q;c[A>>2]=z;B=j;C=j;D=q;c[C+0>>2]=c[D+0>>2];rh(b,j,u,x,m,f,g);E=j;i=d;return}function zh(e,f,g,h,j,k,l,m,n){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,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;o=i;i=i+64|0;p=o;q=o+8|0;r=o+16|0;s=o+32|0;t=o+40|0;u=o+48|0;v=o+56|0;Ge(s,j);w=s;s=c[w>>2]|0;if(!((c[57588]|0)==-1)){c[r>>2]=230352;c[r+4>>2]=112;c[r+8>>2]=0;he(230352,r,113)}r=(c[230356>>2]|0)+ -1|0;x=c[s+8>>2]|0;if(!((c[s+12>>2]|0)-x>>2>>>0>r>>>0)){y=Va(4)|0;z=y;gm(z);xb(y|0,238312,101)}s=c[x+(r<<2)>>2]|0;if((s|0)==0){y=Va(4)|0;z=y;gm(z);xb(y|0,238312,101)}y=s;Pd(c[w>>2]|0)|0;c[k>>2]=0;w=g;a:do{if((m|0)==(n|0)){A=65}else{z=h;r=s;x=s+8|0;B=s;C=f;D=u;E=v;F=t;G=m;H=0;b:while(1){I=H;while(1){if((I|0)!=0){A=65;break a}J=c[w>>2]|0;do{if((J|0)==0){K=0}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){K=J;break}if(!((mc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1)){K=J;break}c[w>>2]=0;K=0}}while(0);J=(K|0)==0;L=c[z>>2]|0;c:do{if((L|0)==0){A=19}else{do{if((c[L+12>>2]|0)==(c[L+16>>2]|0)){if(!((mc[c[(c[L>>2]|0)+36>>2]&63](L)|0)==-1)){break}c[z>>2]=0;A=19;break c}}while(0);if(J){M=L}else{A=20;break b}}}while(0);if((A|0)==19){A=0;if(J){A=20;break b}else{M=0}}if((gc[c[(c[r>>2]|0)+36>>2]&31](y,a[G]|0,0)|0)<<24>>24==37){A=22;break}L=a[G]|0;if(L<<24>>24>-1){N=c[x>>2]|0;if(!((b[N+(L<<24>>24<<1)>>1]&8192)==0)){O=G;A=33;break}}P=K+12|0;L=c[P>>2]|0;Q=K+16|0;if((L|0)==(c[Q>>2]|0)){R=mc[c[(c[K>>2]|0)+36>>2]&63](K)|0}else{R=d[L]|0}L=vc[c[(c[B>>2]|0)+12>>2]&15](y,R&255)|0;if(L<<24>>24==(vc[c[(c[B>>2]|0)+12>>2]&15](y,a[G]|0)|0)<<24>>24){A=60;break}c[k>>2]=4;I=4}d:do{if((A|0)==22){A=0;I=G+1|0;if((I|0)==(n|0)){A=23;break b}L=gc[c[(c[r>>2]|0)+36>>2]&31](y,a[I]|0,0)|0;if(L<<24>>24==48|L<<24>>24==69){S=G+2|0;if((S|0)==(n|0)){A=26;break b}T=S;U=gc[c[(c[r>>2]|0)+36>>2]&31](y,a[S]|0,0)|0;V=L}else{T=I;U=L;V=0}L=c[(c[C>>2]|0)+36>>2]|0;c[D>>2]=K;c[E>>2]=M;I=q;S=u;c[I+0>>2]=c[S+0>>2];S=p;I=v;c[S+0>>2]=c[I+0>>2];lc[L&3](t,f,q,p,j,k,l,U,V);c[w>>2]=c[F>>2];W=T+1|0}else if((A|0)==33){while(1){A=0;L=O+1|0;if((L|0)==(n|0)){X=n;break}I=a[L]|0;if(!(I<<24>>24>-1)){X=L;break}if((b[N+(I<<24>>24<<1)>>1]&8192)==0){X=L;break}else{O=L;A=33}}J=K;L=M;I=M;while(1){do{if((J|0)==0){Y=0}else{if((c[J+12>>2]|0)!=(c[J+16>>2]|0)){Y=J;break}if(!((mc[c[(c[J>>2]|0)+36>>2]&63](J)|0)==-1)){Y=J;break}c[w>>2]=0;Y=0}}while(0);S=(Y|0)==0;do{if((I|0)==0){Z=L;A=46}else{if((c[I+12>>2]|0)!=(c[I+16>>2]|0)){if(S){_=L;$=I;break}else{W=X;break d}}if((mc[c[(c[I>>2]|0)+36>>2]&63](I)|0)==-1){c[z>>2]=0;Z=0;A=46;break}else{if(S^(L|0)==0){_=L;$=L;break}else{W=X;break d}}}}while(0);if((A|0)==46){A=0;if(S){W=X;break d}else{_=Z;$=0}}aa=Y+12|0;ba=c[aa>>2]|0;ca=Y+16|0;if((ba|0)==(c[ca>>2]|0)){da=mc[c[(c[Y>>2]|0)+36>>2]&63](Y)|0}else{da=d[ba]|0}if(!((da&255)<<24>>24>-1)){W=X;break d}if((b[(c[x>>2]|0)+(da<<24>>24<<1)>>1]&8192)==0){W=X;break d}ba=c[aa>>2]|0;if((ba|0)==(c[ca>>2]|0)){mc[c[(c[Y>>2]|0)+40>>2]&63](Y)|0;J=Y;L=_;I=$;continue}else{c[aa>>2]=ba+1;J=Y;L=_;I=$;continue}}}else if((A|0)==60){A=0;I=c[P>>2]|0;if((I|0)==(c[Q>>2]|0)){mc[c[(c[K>>2]|0)+40>>2]&63](K)|0}else{c[P>>2]=I+1}W=G+1|0}}while(0);if((W|0)==(n|0)){A=65;break a}G=W;H=c[k>>2]|0}if((A|0)==20){c[k>>2]=4;ea=K;break}else if((A|0)==23){c[k>>2]=4;ea=K;break}else if((A|0)==26){c[k>>2]=4;ea=K;break}}}while(0);if((A|0)==65){ea=c[w>>2]|0}w=g;do{if((ea|0)==0){fa=0}else{if((c[ea+12>>2]|0)!=(c[ea+16>>2]|0)){fa=ea;break}if(!((mc[c[(c[ea>>2]|0)+36>>2]&63](ea)|0)==-1)){fa=ea;break}c[w>>2]=0;fa=0}}while(0);w=(fa|0)==0;ea=h;h=c[ea>>2]|0;e:do{if((h|0)==0){A=75}else{do{if((c[h+12>>2]|0)==(c[h+16>>2]|0)){if(!((mc[c[(c[h>>2]|0)+36>>2]&63](h)|0)==-1)){break}c[ea>>2]=0;A=75;break e}}while(0);if(!w){break}ga=e;c[ga>>2]=fa;i=o;return}}while(0);do{if((A|0)==75){if(w){break}ga=e;c[ga>>2]=fa;i=o;return}}while(0);c[k>>2]=c[k>>2]|2;ga=e;c[ga>>2]=fa;i=o;return}function Ah(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Bh(a){a=a|0;i=i;return}function Ch(a){a=a|0;i=i;return 2}function Dh(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 j=0,k=0,l=0,m=0,n=0;j=i;i=i+32|0;k=j;l=j+8|0;m=j+16|0;n=j+24|0;c[m>>2]=c[d>>2];c[n>>2]=c[e>>2];e=l;d=m;c[e+0>>2]=c[d+0>>2];d=k;e=n;c[d+0>>2]=c[e+0>>2];zh(a,b,l,k,f,g,h,229256,229264|0);i=j;return}function Eh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=i;i=i+32|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=d+8|0;q=mc[c[(c[p>>2]|0)+20>>2]&63](p)|0;c[n>>2]=c[e>>2];c[o>>2]=c[f>>2];f=a[q]|0;if((f&1)==0){r=q+1|0;s=q+1|0;t=(f&255)>>>1}else{f=c[q+8>>2]|0;r=f;s=f;t=c[q+4>>2]|0}q=r+t|0;t=m;r=n;c[t+0>>2]=c[r+0>>2];r=l;t=o;c[r+0>>2]=c[t+0>>2];zh(b,d,m,l,g,h,j,s,q);i=k;return}function Fh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Ge(n,f);f=n;n=c[f>>2]|0;if(!((c[57588]|0)==-1)){c[m>>2]=230352;c[m+4>>2]=112;c[m+8>>2]=0;he(230352,m,113)}m=(c[230356>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}p=n;Pd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=mc[c[c[e>>2]>>2]&63](e)|0;c[l>>2]=f;f=b+168|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=ag(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=168){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+24>>2]=((g|0)/12|0|0)%7|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Gh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Ge(n,f);f=n;n=c[f>>2]|0;if(!((c[57588]|0)==-1)){c[m>>2]=230352;c[m+4>>2]=112;c[m+8>>2]=0;he(230352,m,113)}m=(c[230356>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}p=n;Pd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=mc[c[(c[e>>2]|0)+4>>2]&63](e)|0;c[l>>2]=f;f=b+288|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=ag(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=288){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+16>>2]=((g|0)/12|0|0)%12|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Hh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+40|0;j=b;k=b+8|0;l=b+16|0;m=b+32|0;Ge(m,f);f=m;m=c[f>>2]|0;if(!((c[57588]|0)==-1)){c[l>>2]=230352;c[l+4>>2]=112;c[l+8>>2]=0;he(230352,l,113)}l=(c[230356>>2]|0)+ -1|0;n=c[m+8>>2]|0;if(!((c[m+12>>2]|0)-n>>2>>>0>l>>>0)){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}m=c[n+(l<<2)>>2]|0;if((m|0)==0){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}o=m;Pd(c[f>>2]|0)|0;f=h+20|0;c[k>>2]=c[e>>2];e=j;h=k;c[e+0>>2]=c[h+0>>2];h=Lh(d,j,g,o,4)|0;if((c[g>>2]&4|0)!=0){q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}if((h|0)<69){t=h+2e3|0}else{t=(h+ -69|0)>>>0<31?h+1900|0:h}c[f>>2]=t+ -1900;q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}function Ih(b,d,e,f,g,h,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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,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;l=i;i=i+576|0;m=l;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+312|0;_=l+320|0;$=l+328|0;aa=l+336|0;ba=l+344|0;ca=l+352|0;da=l+368|0;ea=l+376|0;fa=l+384|0;ga=l+392|0;ha=l+400|0;ia=l+408|0;ja=l+416|0;ka=l+424|0;la=l+432|0;ma=l+440|0;na=l+448|0;oa=l+456|0;pa=l+464|0;qa=l+472|0;ra=l+480|0;sa=l+488|0;ta=l+496|0;ua=l+504|0;va=l+512|0;wa=l+520|0;xa=l+528|0;ya=l+536|0;za=l+544|0;Aa=l+552|0;Ba=l+560|0;Ca=l+568|0;c[h>>2]=0;Ge(da,g);Da=da;da=c[Da>>2]|0;if(!((c[57588]|0)==-1)){c[ca>>2]=230352;c[ca+4>>2]=112;c[ca+8>>2]=0;he(230352,ca,113)}ca=(c[230356>>2]|0)+ -1|0;Ea=c[da+8>>2]|0;if(!((c[da+12>>2]|0)-Ea>>2>>>0>ca>>>0)){Fa=Va(4)|0;Ga=Fa;gm(Ga);xb(Fa|0,238312,101)}da=c[Ea+(ca<<2)>>2]|0;if((da|0)==0){Fa=Va(4)|0;Ga=Fa;gm(Ga);xb(Fa|0,238312,101)}Fa=da;Pd(c[Da>>2]|0)|0;a:do{switch(k<<24>>24|0){case 99:{Da=d+8|0;da=mc[c[(c[Da>>2]|0)+12>>2]&63](Da)|0;Da=e;c[fa>>2]=c[Da>>2];c[ga>>2]=c[f>>2];Ga=a[da]|0;if((Ga&1)==0){Ha=da+1|0;Ia=da+1|0;Ja=(Ga&255)>>>1}else{Ga=c[da+8>>2]|0;Ha=Ga;Ia=Ga;Ja=c[da+4>>2]|0}c[O+0>>2]=c[fa+0>>2];c[N+0>>2]=c[ga+0>>2];zh(ea,d,O,N,g,h,j,Ia,Ha+Ja|0);c[Da>>2]=c[ea>>2];break};case 101:case 100:{Da=j+12|0;c[$>>2]=c[f>>2];c[M+0>>2]=c[$+0>>2];da=Lh(e,M,h,Fa,2)|0;Ga=c[h>>2]|0;do{if((Ga&4|0)==0){if(!((da+ -1|0)>>>0<31)){break}c[Da>>2]=da;break a}}while(0);c[h>>2]=Ga|4;break};case 73:{da=j+8|0;c[Z>>2]=c[f>>2];c[G+0>>2]=c[Z+0>>2];Da=Lh(e,G,h,Fa,2)|0;ca=c[h>>2]|0;do{if((ca&4|0)==0){if(!((Da+ -1|0)>>>0<12)){break}c[da>>2]=Da;break a}}while(0);c[h>>2]=ca|4;break};case 106:{c[Y>>2]=c[f>>2];c[F+0>>2]=c[Y+0>>2];Da=Lh(e,F,h,Fa,3)|0;da=c[h>>2]|0;if((da&4|0)==0&(Da|0)<366){c[j+28>>2]=Da;break a}else{c[h>>2]=da|4;break a}break};case 65:case 97:{da=c[f>>2]|0;Da=d+8|0;Ga=mc[c[c[Da>>2]>>2]&63](Da)|0;c[ba>>2]=da;c[Q+0>>2]=c[ba+0>>2];da=(ag(e,Q,Ga,Ga+168|0,Fa,h,0)|0)-Ga|0;if((da|0)>=168){break a}c[j+24>>2]=((da|0)/12|0|0)%7|0;break};case 104:case 66:case 98:{da=c[f>>2]|0;Ga=d+8|0;Da=mc[c[(c[Ga>>2]|0)+4>>2]&63](Ga)|0;c[aa>>2]=da;c[P+0>>2]=c[aa+0>>2];da=(ag(e,P,Da,Da+288|0,Fa,h,0)|0)-Da|0;if((da|0)>=288){break a}c[j+16>>2]=((da|0)/12|0|0)%12|0;break};case 68:{da=e;c[ia>>2]=c[da>>2];c[ja>>2]=c[f>>2];c[L+0>>2]=c[ia+0>>2];c[K+0>>2]=c[ja+0>>2];zh(ha,d,L,K,g,h,j,229264,229272|0);c[da>>2]=c[ha>>2];break};case 72:{c[_>>2]=c[f>>2];c[H+0>>2]=c[_+0>>2];da=Lh(e,H,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<24){c[j+8>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 70:{Da=e;c[la>>2]=c[Da>>2];c[ma>>2]=c[f>>2];c[J+0>>2]=c[la+0>>2];c[I+0>>2]=c[ma+0>>2];zh(ka,d,J,I,g,h,j,229272,229280|0);c[Da>>2]=c[ka>>2];break};case 109:{c[X>>2]=c[f>>2];c[E+0>>2]=c[X+0>>2];Da=Lh(e,E,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(Da|0)<13){c[j+16>>2]=Da+ -1;break a}else{c[h>>2]=da|4;break a}break};case 77:{c[W>>2]=c[f>>2];c[D+0>>2]=c[W+0>>2];da=Lh(e,D,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(da|0)<60){c[j+4>>2]=da;break a}else{c[h>>2]=Da|4;break a}break};case 116:case 110:{c[na>>2]=c[f>>2];c[C+0>>2]=c[na+0>>2];Jh(0,e,C,h,Fa);break};case 112:{Da=j+8|0;da=c[f>>2]|0;Ga=d+8|0;Ea=mc[c[(c[Ga>>2]|0)+8>>2]&63](Ga)|0;Ga=a[Ea]|0;if((Ga&1)==0){Ka=(Ga&255)>>>1}else{Ka=c[Ea+4>>2]|0}Ga=a[Ea+12|0]|0;if((Ga&1)==0){La=(Ga&255)>>>1}else{La=c[Ea+16>>2]|0}if((Ka|0)==(0-La|0)){c[h>>2]=c[h>>2]|4;break a}c[V>>2]=da;c[B+0>>2]=c[V+0>>2];da=ag(e,B,Ea,Ea+24|0,Fa,h,0)|0;Ga=da-Ea|0;do{if((da|0)==(Ea|0)){if((c[Da>>2]|0)!=12){break}c[Da>>2]=0;break a}}while(0);if((Ga|0)!=12){break a}Ea=c[Da>>2]|0;if((Ea|0)>=12){break a}c[Da>>2]=Ea+12;break};case 114:{Ea=e;c[pa>>2]=c[Ea>>2];c[qa>>2]=c[f>>2];c[A+0>>2]=c[pa+0>>2];c[z+0>>2]=c[qa+0>>2];zh(oa,d,A,z,g,h,j,229280,229291|0);c[Ea>>2]=c[oa>>2];break};case 82:{Ea=e;c[sa>>2]=c[Ea>>2];c[ta>>2]=c[f>>2];c[y+0>>2]=c[sa+0>>2];c[x+0>>2]=c[ta+0>>2];zh(ra,d,y,x,g,h,j,229296,229301|0);c[Ea>>2]=c[ra>>2];break};case 83:{c[U>>2]=c[f>>2];c[w+0>>2]=c[U+0>>2];Ea=Lh(e,w,h,Fa,2)|0;da=c[h>>2]|0;if((da&4|0)==0&(Ea|0)<61){c[j>>2]=Ea;break a}else{c[h>>2]=da|4;break a}break};case 84:{da=e;c[va>>2]=c[da>>2];c[wa>>2]=c[f>>2];c[v+0>>2]=c[va+0>>2];c[u+0>>2]=c[wa+0>>2];zh(ua,d,v,u,g,h,j,229304,229312|0);c[da>>2]=c[ua>>2];break};case 119:{c[T>>2]=c[f>>2];c[t+0>>2]=c[T+0>>2];da=Lh(e,t,h,Fa,1)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(da|0)<7){c[j+24>>2]=da;break a}else{c[h>>2]=Ea|4;break a}break};case 120:{Ea=c[(c[d>>2]|0)+20>>2]|0;c[xa>>2]=c[e>>2];c[ya>>2]=c[f>>2];c[s+0>>2]=c[xa+0>>2];c[r+0>>2]=c[ya+0>>2];hc[Ea&63](b,d,s,r,g,h,j);i=l;return};case 88:{Ea=d+8|0;da=mc[c[(c[Ea>>2]|0)+24>>2]&63](Ea)|0;Ea=e;c[Aa>>2]=c[Ea>>2];c[Ba>>2]=c[f>>2];ca=a[da]|0;if((ca&1)==0){Ma=da+1|0;Na=da+1|0;Oa=(ca&255)>>>1}else{ca=c[da+8>>2]|0;Ma=ca;Na=ca;Oa=c[da+4>>2]|0}c[q+0>>2]=c[Aa+0>>2];c[p+0>>2]=c[Ba+0>>2];zh(za,d,q,p,g,h,j,Na,Ma+Oa|0);c[Ea>>2]=c[za>>2];break};case 121:{c[S>>2]=c[f>>2];c[o+0>>2]=c[S+0>>2];Ea=Lh(e,o,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}if((Ea|0)<69){Pa=Ea+2e3|0}else{Pa=(Ea+ -69|0)>>>0<31?Ea+1900|0:Ea}c[j+20>>2]=Pa+ -1900;break};case 89:{c[R>>2]=c[f>>2];c[n+0>>2]=c[R+0>>2];Ea=Lh(e,n,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}c[j+20>>2]=Ea+ -1900;break};case 37:{c[Ca>>2]=c[f>>2];c[m+0>>2]=c[Ca+0>>2];Kh(0,e,m,h,Fa);break};default:{c[h>>2]=c[h>>2]|4}}}while(0);c[b>>2]=c[e>>2];i=l;return}function Jh(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a=i;j=e;e=f;f=h+8|0;a:while(1){h=c[j>>2]|0;do{if((h|0)==0){k=0}else{if((c[h+12>>2]|0)!=(c[h+16>>2]|0)){k=h;break}if((mc[c[(c[h>>2]|0)+36>>2]&63](h)|0)==-1){c[j>>2]=0;k=0;break}else{k=c[j>>2]|0;break}}}while(0);h=(k|0)==0;l=c[e>>2]|0;do{if((l|0)==0){m=12}else{if((c[l+12>>2]|0)!=(c[l+16>>2]|0)){if(h){n=l;break}else{o=l;break a}}if((mc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1){c[e>>2]=0;m=12;break}else{if(h){n=l;break}else{o=l;break a}}}}while(0);if((m|0)==12){m=0;if(h){o=0;break}else{n=0}}l=c[j>>2]|0;p=c[l+12>>2]|0;if((p|0)==(c[l+16>>2]|0)){q=mc[c[(c[l>>2]|0)+36>>2]&63](l)|0}else{q=d[p]|0}if(!((q&255)<<24>>24>-1)){o=n;break}if((b[(c[f>>2]|0)+(q<<24>>24<<1)>>1]&8192)==0){o=n;break}p=c[j>>2]|0;l=p+12|0;r=c[l>>2]|0;if((r|0)==(c[p+16>>2]|0)){mc[c[(c[p>>2]|0)+40>>2]&63](p)|0;continue}else{c[l>>2]=r+1;continue}}n=c[j>>2]|0;do{if((n|0)==0){s=0}else{if((c[n+12>>2]|0)!=(c[n+16>>2]|0)){s=n;break}if((mc[c[(c[n>>2]|0)+36>>2]&63](n)|0)==-1){c[j>>2]=0;s=0;break}else{s=c[j>>2]|0;break}}}while(0);j=(s|0)==0;b:do{if((o|0)==0){m=32}else{do{if((c[o+12>>2]|0)==(c[o+16>>2]|0)){if(!((mc[c[(c[o>>2]|0)+36>>2]&63](o)|0)==-1)){break}c[e>>2]=0;m=32;break b}}while(0);if(!j){break}i=a;return}}while(0);do{if((m|0)==32){if(j){break}i=a;return}}while(0);c[g>>2]=c[g>>2]|2;i=a;return}function Kh(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;a=i;h=b;b=c[h>>2]|0;do{if((b|0)==0){j=0}else{if((c[b+12>>2]|0)!=(c[b+16>>2]|0)){j=b;break}if((mc[c[(c[b>>2]|0)+36>>2]&63](b)|0)==-1){c[h>>2]=0;j=0;break}else{j=c[h>>2]|0;break}}}while(0);b=(j|0)==0;j=e;e=c[j>>2]|0;a:do{if((e|0)==0){k=11}else{do{if((c[e+12>>2]|0)==(c[e+16>>2]|0)){if(!((mc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){break}c[j>>2]=0;k=11;break a}}while(0);if(b){l=e}else{k=12}}}while(0);if((k|0)==11){if(b){k=12}else{l=0}}if((k|0)==12){c[f>>2]=c[f>>2]|6;i=a;return}b=c[h>>2]|0;e=c[b+12>>2]|0;if((e|0)==(c[b+16>>2]|0)){m=mc[c[(c[b>>2]|0)+36>>2]&63](b)|0}else{m=d[e]|0}if(!((gc[c[(c[g>>2]|0)+36>>2]&31](g,m&255,0)|0)<<24>>24==37)){c[f>>2]=c[f>>2]|4;i=a;return}m=c[h>>2]|0;g=m+12|0;e=c[g>>2]|0;if((e|0)==(c[m+16>>2]|0)){mc[c[(c[m>>2]|0)+40>>2]&63](m)|0}else{c[g>>2]=e+1}e=c[h>>2]|0;do{if((e|0)==0){n=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){n=e;break}if((mc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1){c[h>>2]=0;n=0;break}else{n=c[h>>2]|0;break}}}while(0);h=(n|0)==0;b:do{if((l|0)==0){k=31}else{do{if((c[l+12>>2]|0)==(c[l+16>>2]|0)){if(!((mc[c[(c[l>>2]|0)+36>>2]&63](l)|0)==-1)){break}c[j>>2]=0;k=31;break b}}while(0);if(!h){break}i=a;return}}while(0);do{if((k|0)==31){if(h){break}i=a;return}}while(0);c[f>>2]=c[f>>2]|2;i=a;return}function Lh(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|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,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;j=i;k=a;a=c[k>>2]|0;do{if((a|0)==0){l=0}else{if((c[a+12>>2]|0)!=(c[a+16>>2]|0)){l=a;break}if((mc[c[(c[a>>2]|0)+36>>2]&63](a)|0)==-1){c[k>>2]=0;l=0;break}else{l=c[k>>2]|0;break}}}while(0);a=(l|0)==0;l=e;e=c[l>>2]|0;a:do{if((e|0)==0){m=11}else{do{if((c[e+12>>2]|0)==(c[e+16>>2]|0)){if(!((mc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){break}c[l>>2]=0;m=11;break a}}while(0);if(a){n=e}else{m=12}}}while(0);if((m|0)==11){if(a){m=12}else{n=0}}if((m|0)==12){c[f>>2]=c[f>>2]|6;o=0;i=j;return o|0}a=c[k>>2]|0;e=c[a+12>>2]|0;if((e|0)==(c[a+16>>2]|0)){p=mc[c[(c[a>>2]|0)+36>>2]&63](a)|0}else{p=d[e]|0}e=p&255;do{if(e<<24>>24>-1){a=g+8|0;if((b[(c[a>>2]|0)+(p<<24>>24<<1)>>1]&2048)==0){break}q=g;r=(gc[c[(c[q>>2]|0)+36>>2]&31](g,e,0)|0)<<24>>24;s=c[k>>2]|0;t=s+12|0;u=c[t>>2]|0;if((u|0)==(c[s+16>>2]|0)){mc[c[(c[s>>2]|0)+40>>2]&63](s)|0;v=h;w=n;x=n;y=r}else{c[t>>2]=u+1;v=h;w=n;x=n;y=r}while(1){z=y+ -48|0;r=v+ -1|0;u=c[k>>2]|0;do{if((u|0)==0){A=0}else{if((c[u+12>>2]|0)!=(c[u+16>>2]|0)){A=u;break}if((mc[c[(c[u>>2]|0)+36>>2]&63](u)|0)==-1){c[k>>2]=0;A=0;break}else{A=c[k>>2]|0;break}}}while(0);u=(A|0)==0;do{if((x|0)==0){B=w;C=0}else{if((c[x+12>>2]|0)!=(c[x+16>>2]|0)){B=w;C=x;break}if(!((mc[c[(c[x>>2]|0)+36>>2]&63](x)|0)==-1)){B=w;C=w;break}c[l>>2]=0;B=0;C=0}}while(0);D=c[k>>2]|0;if(!((u^(C|0)==0)&(r|0)>0)){m=40;break}t=c[D+12>>2]|0;if((t|0)==(c[D+16>>2]|0)){E=mc[c[(c[D>>2]|0)+36>>2]&63](D)|0}else{E=d[t]|0}t=E&255;if(!(t<<24>>24>-1)){o=z;m=52;break}if((b[(c[a>>2]|0)+(E<<24>>24<<1)>>1]&2048)==0){o=z;m=52;break}s=((gc[c[(c[q>>2]|0)+36>>2]&31](g,t,0)|0)<<24>>24)+(z*10|0)|0;t=c[k>>2]|0;F=t+12|0;G=c[F>>2]|0;if((G|0)==(c[t+16>>2]|0)){mc[c[(c[t>>2]|0)+40>>2]&63](t)|0;H=r;w=B;x=C;y=s;v=H;continue}else{c[F>>2]=G+1;H=r;w=B;x=C;y=s;v=H;continue}}if((m|0)==40){do{if((D|0)==0){I=0}else{if((c[D+12>>2]|0)!=(c[D+16>>2]|0)){I=D;break}if((mc[c[(c[D>>2]|0)+36>>2]&63](D)|0)==-1){c[k>>2]=0;I=0;break}else{I=c[k>>2]|0;break}}}while(0);q=(I|0)==0;b:do{if((B|0)==0){m=50}else{do{if((c[B+12>>2]|0)==(c[B+16>>2]|0)){if(!((mc[c[(c[B>>2]|0)+36>>2]&63](B)|0)==-1)){break}c[l>>2]=0;m=50;break b}}while(0);if(q){o=z}else{break}i=j;return o|0}}while(0);do{if((m|0)==50){if(q){break}else{o=z}i=j;return o|0}}while(0);c[f>>2]=c[f>>2]|2;o=z;i=j;return o|0}else if((m|0)==52){i=j;return o|0}}}while(0);c[f>>2]=c[f>>2]|4;o=0;i=j;return o|0}function Mh(a,b,d,e,f,g,h,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,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;l=i;i=i+64|0;m=l;n=l+8|0;o=l+16|0;p=l+32|0;q=l+40|0;r=l+48|0;s=l+56|0;Ge(p,f);t=p;p=c[t>>2]|0;if(!((c[57586]|0)==-1)){c[o>>2]=230344;c[o+4>>2]=112;c[o+8>>2]=0;he(230344,o,113)}o=(c[230348>>2]|0)+ -1|0;u=c[p+8>>2]|0;if(!((c[p+12>>2]|0)-u>>2>>>0>o>>>0)){v=Va(4)|0;w=v;gm(w);xb(v|0,238312,101)}p=c[u+(o<<2)>>2]|0;if((p|0)==0){v=Va(4)|0;w=v;gm(w);xb(v|0,238312,101)}v=p;Pd(c[t>>2]|0)|0;c[g>>2]=0;t=d;a:do{if((j|0)==(k|0)){x=69}else{w=e;o=p;u=p;y=p;z=b;A=r;B=s;C=q;D=j;E=0;b:while(1){F=E;while(1){if((F|0)!=0){x=69;break a}G=c[t>>2]|0;do{if((G|0)==0){H=0;I=1}else{J=c[G+12>>2]|0;if((J|0)==(c[G+16>>2]|0)){K=mc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{K=c[J>>2]|0}if(!((K|0)==-1)){H=G;I=0;break}c[t>>2]=0;H=0;I=1}}while(0);G=c[w>>2]|0;do{if((G|0)==0){x=22}else{J=c[G+12>>2]|0;if((J|0)==(c[G+16>>2]|0)){L=mc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{L=c[J>>2]|0}if((L|0)==-1){c[w>>2]=0;x=22;break}else{if(I){M=G;break}else{x=24;break b}}}}while(0);if((x|0)==22){x=0;if(I){x=24;break b}else{M=0}}if((gc[c[(c[o>>2]|0)+52>>2]&31](v,c[D>>2]|0,0)|0)<<24>>24==37){x=26;break}if(gc[c[(c[u>>2]|0)+12>>2]&31](v,8192,c[D>>2]|0)|0){N=D;x=36;break}O=H+12|0;G=c[O>>2]|0;P=H+16|0;if((G|0)==(c[P>>2]|0)){Q=mc[c[(c[H>>2]|0)+36>>2]&63](H)|0}else{Q=c[G>>2]|0}G=vc[c[(c[y>>2]|0)+28>>2]&15](v,Q)|0;if((G|0)==(vc[c[(c[y>>2]|0)+28>>2]&15](v,c[D>>2]|0)|0)){x=64;break}c[g>>2]=4;F=4}c:do{if((x|0)==26){x=0;F=D+4|0;if((F|0)==(k|0)){x=27;break b}G=gc[c[(c[o>>2]|0)+52>>2]&31](v,c[F>>2]|0,0)|0;if(G<<24>>24==48|G<<24>>24==69){J=D+8|0;if((J|0)==(k|0)){x=30;break b}R=J;S=gc[c[(c[o>>2]|0)+52>>2]&31](v,c[J>>2]|0,0)|0;T=G}else{R=F;S=G;T=0}G=c[(c[z>>2]|0)+36>>2]|0;c[A>>2]=H;c[B>>2]=M;F=n;J=r;c[F+0>>2]=c[J+0>>2];J=m;F=s;c[J+0>>2]=c[F+0>>2];lc[G&3](q,b,n,m,f,g,h,S,T);c[t>>2]=c[C>>2];U=R+4|0}else if((x|0)==36){while(1){x=0;G=N+4|0;if((G|0)==(k|0)){V=k;break}if(gc[c[(c[u>>2]|0)+12>>2]&31](v,8192,c[G>>2]|0)|0){N=G;x=36}else{V=G;break}}G=H;F=M;J=M;while(1){do{if((G|0)==0){W=0;X=1}else{Y=c[G+12>>2]|0;if((Y|0)==(c[G+16>>2]|0)){Z=mc[c[(c[G>>2]|0)+36>>2]&63](G)|0}else{Z=c[Y>>2]|0}if(!((Z|0)==-1)){W=G;X=0;break}c[t>>2]=0;W=0;X=1}}while(0);do{if((J|0)==0){_=F;x=51}else{Y=c[J+12>>2]|0;if((Y|0)==(c[J+16>>2]|0)){$=mc[c[(c[J>>2]|0)+36>>2]&63](J)|0}else{$=c[Y>>2]|0}if(($|0)==-1){c[w>>2]=0;_=0;x=51;break}else{if(X^(F|0)==0){aa=F;ba=F;break}else{U=V;break c}}}}while(0);if((x|0)==51){x=0;if(X){U=V;break c}else{aa=_;ba=0}}Y=W+12|0;ca=c[Y>>2]|0;da=W+16|0;if((ca|0)==(c[da>>2]|0)){ea=mc[c[(c[W>>2]|0)+36>>2]&63](W)|0}else{ea=c[ca>>2]|0}if(!(gc[c[(c[u>>2]|0)+12>>2]&31](v,8192,ea)|0)){U=V;break c}ca=c[Y>>2]|0;if((ca|0)==(c[da>>2]|0)){mc[c[(c[W>>2]|0)+40>>2]&63](W)|0;G=W;F=aa;J=ba;continue}else{c[Y>>2]=ca+4;G=W;F=aa;J=ba;continue}}}else if((x|0)==64){x=0;J=c[O>>2]|0;if((J|0)==(c[P>>2]|0)){mc[c[(c[H>>2]|0)+40>>2]&63](H)|0}else{c[O>>2]=J+4}U=D+4|0}}while(0);if((U|0)==(k|0)){x=69;break a}D=U;E=c[g>>2]|0}if((x|0)==24){c[g>>2]=4;fa=H;break}else if((x|0)==27){c[g>>2]=4;fa=H;break}else if((x|0)==30){c[g>>2]=4;fa=H;break}}}while(0);if((x|0)==69){fa=c[t>>2]|0}t=d;do{if((fa|0)==0){ga=0;ha=1}else{d=c[fa+12>>2]|0;if((d|0)==(c[fa+16>>2]|0)){ia=mc[c[(c[fa>>2]|0)+36>>2]&63](fa)|0}else{ia=c[d>>2]|0}if(!((ia|0)==-1)){ga=fa;ha=0;break}c[t>>2]=0;ga=0;ha=1}}while(0);t=e;e=c[t>>2]|0;do{if((e|0)==0){x=82}else{fa=c[e+12>>2]|0;if((fa|0)==(c[e+16>>2]|0)){ja=mc[c[(c[e>>2]|0)+36>>2]&63](e)|0}else{ja=c[fa>>2]|0}if((ja|0)==-1){c[t>>2]=0;x=82;break}if(!ha){break}ka=a;c[ka>>2]=ga;i=l;return}}while(0);do{if((x|0)==82){if(ha){break}ka=a;c[ka>>2]=ga;i=l;return}}while(0);c[g>>2]=c[g>>2]|2;ka=a;c[ka>>2]=ga;i=l;return}function Nh(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Oh(a){a=a|0;i=i;return}function Ph(a){a=a|0;i=i;return 2}function Qh(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 j=0,k=0,l=0,m=0,n=0;j=i;i=i+32|0;k=j;l=j+8|0;m=j+16|0;n=j+24|0;c[m>>2]=c[d>>2];c[n>>2]=c[e>>2];e=l;d=m;c[e+0>>2]=c[d+0>>2];d=k;e=n;c[d+0>>2]=c[e+0>>2];Mh(a,b,l,k,f,g,h,229408,229440|0);i=j;return}function Rh(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=i;i=i+32|0;l=k;m=k+8|0;n=k+16|0;o=k+24|0;p=d+8|0;q=mc[c[(c[p>>2]|0)+20>>2]&63](p)|0;c[n>>2]=c[e>>2];c[o>>2]=c[f>>2];f=a[q]|0;if((f&1)==0){r=q+4|0;s=q+4|0;t=(f&255)>>>1}else{f=c[q+8>>2]|0;r=f;s=f;t=c[q+4>>2]|0}q=r+(t<<2)|0;t=m;r=n;c[t+0>>2]=c[r+0>>2];r=l;t=o;c[r+0>>2]=c[t+0>>2];Mh(b,d,m,l,g,h,j,s,q);i=k;return}function Sh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Ge(n,f);f=n;n=c[f>>2]|0;if(!((c[57586]|0)==-1)){c[m>>2]=230344;c[m+4>>2]=112;c[m+8>>2]=0;he(230344,m,113)}m=(c[230348>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}p=n;Pd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=mc[c[c[e>>2]>>2]&63](e)|0;c[l>>2]=f;f=b+168|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=zg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=168){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+24>>2]=((g|0)/12|0|0)%7|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Th(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+40|0;k=j;l=j+8|0;m=j+16|0;n=j+32|0;Ge(n,f);f=n;n=c[f>>2]|0;if(!((c[57586]|0)==-1)){c[m>>2]=230344;c[m+4>>2]=112;c[m+8>>2]=0;he(230344,m,113)}m=(c[230348>>2]|0)+ -1|0;o=c[n+8>>2]|0;if(!((c[n+12>>2]|0)-o>>2>>>0>m>>>0)){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}n=c[o+(m<<2)>>2]|0;if((n|0)==0){p=Va(4)|0;q=p;gm(q);xb(p|0,238312,101)}p=n;Pd(c[f>>2]|0)|0;f=c[e>>2]|0;e=b+8|0;b=mc[c[(c[e>>2]|0)+4>>2]&63](e)|0;c[l>>2]=f;f=b+288|0;e=k;n=l;c[e+0>>2]=c[n+0>>2];n=zg(d,k,b,f,p,g,0)|0;g=n-b|0;if((g|0)>=288){r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}c[h+16>>2]=((g|0)/12|0|0)%12|0;r=d;s=c[r>>2]|0;t=a;c[t>>2]=s;i=j;return}function Uh(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+40|0;j=b;k=b+8|0;l=b+16|0;m=b+32|0;Ge(m,f);f=m;m=c[f>>2]|0;if(!((c[57586]|0)==-1)){c[l>>2]=230344;c[l+4>>2]=112;c[l+8>>2]=0;he(230344,l,113)}l=(c[230348>>2]|0)+ -1|0;n=c[m+8>>2]|0;if(!((c[m+12>>2]|0)-n>>2>>>0>l>>>0)){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}m=c[n+(l<<2)>>2]|0;if((m|0)==0){o=Va(4)|0;p=o;gm(p);xb(o|0,238312,101)}o=m;Pd(c[f>>2]|0)|0;f=h+20|0;c[k>>2]=c[e>>2];e=j;h=k;c[e+0>>2]=c[h+0>>2];h=Yh(d,j,g,o,4)|0;if((c[g>>2]&4|0)!=0){q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}if((h|0)<69){t=h+2e3|0}else{t=(h+ -69|0)>>>0<31?h+1900|0:h}c[f>>2]=t+ -1900;q=d;r=c[q>>2]|0;s=a;c[s>>2]=r;i=b;return}function Vh(b,d,e,f,g,h,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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,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;l=i;i=i+576|0;m=l;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+312|0;_=l+320|0;$=l+328|0;aa=l+336|0;ba=l+344|0;ca=l+352|0;da=l+368|0;ea=l+376|0;fa=l+384|0;ga=l+392|0;ha=l+400|0;ia=l+408|0;ja=l+416|0;ka=l+424|0;la=l+432|0;ma=l+440|0;na=l+448|0;oa=l+456|0;pa=l+464|0;qa=l+472|0;ra=l+480|0;sa=l+488|0;ta=l+496|0;ua=l+504|0;va=l+512|0;wa=l+520|0;xa=l+528|0;ya=l+536|0;za=l+544|0;Aa=l+552|0;Ba=l+560|0;Ca=l+568|0;c[h>>2]=0;Ge(da,g);Da=da;da=c[Da>>2]|0;if(!((c[57586]|0)==-1)){c[ca>>2]=230344;c[ca+4>>2]=112;c[ca+8>>2]=0;he(230344,ca,113)}ca=(c[230348>>2]|0)+ -1|0;Ea=c[da+8>>2]|0;if(!((c[da+12>>2]|0)-Ea>>2>>>0>ca>>>0)){Fa=Va(4)|0;Ga=Fa;gm(Ga);xb(Fa|0,238312,101)}da=c[Ea+(ca<<2)>>2]|0;if((da|0)==0){Fa=Va(4)|0;Ga=Fa;gm(Ga);xb(Fa|0,238312,101)}Fa=da;Pd(c[Da>>2]|0)|0;a:do{switch(k<<24>>24|0){case 104:case 66:case 98:{Da=c[f>>2]|0;da=d+8|0;Ga=mc[c[(c[da>>2]|0)+4>>2]&63](da)|0;c[aa>>2]=Da;c[P+0>>2]=c[aa+0>>2];Da=(zg(e,P,Ga,Ga+288|0,Fa,h,0)|0)-Ga|0;if((Da|0)>=288){break a}c[j+16>>2]=((Da|0)/12|0|0)%12|0;break};case 99:{Da=d+8|0;Ga=mc[c[(c[Da>>2]|0)+12>>2]&63](Da)|0;Da=e;c[fa>>2]=c[Da>>2];c[ga>>2]=c[f>>2];da=a[Ga]|0;if((da&1)==0){Ha=Ga+4|0;Ia=Ga+4|0;Ja=(da&255)>>>1}else{da=c[Ga+8>>2]|0;Ha=da;Ia=da;Ja=c[Ga+4>>2]|0}c[O+0>>2]=c[fa+0>>2];c[N+0>>2]=c[ga+0>>2];Mh(ea,d,O,N,g,h,j,Ia,Ha+(Ja<<2)|0);c[Da>>2]=c[ea>>2];break};case 77:{c[W>>2]=c[f>>2];c[D+0>>2]=c[W+0>>2];Da=Yh(e,D,h,Fa,2)|0;Ga=c[h>>2]|0;if((Ga&4|0)==0&(Da|0)<60){c[j+4>>2]=Da;break a}else{c[h>>2]=Ga|4;break a}break};case 121:{c[S>>2]=c[f>>2];c[o+0>>2]=c[S+0>>2];Ga=Yh(e,o,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}if((Ga|0)<69){Ka=Ga+2e3|0}else{Ka=(Ga+ -69|0)>>>0<31?Ga+1900|0:Ga}c[j+20>>2]=Ka+ -1900;break};case 89:{c[R>>2]=c[f>>2];c[n+0>>2]=c[R+0>>2];Ga=Yh(e,n,h,Fa,4)|0;if((c[h>>2]&4|0)!=0){break a}c[j+20>>2]=Ga+ -1900;break};case 109:{c[X>>2]=c[f>>2];c[E+0>>2]=c[X+0>>2];Ga=Yh(e,E,h,Fa,2)|0;Da=c[h>>2]|0;if((Da&4|0)==0&(Ga|0)<13){c[j+16>>2]=Ga+ -1;break a}else{c[h>>2]=Da|4;break a}break};case 116:case 110:{c[na>>2]=c[f>>2];c[C+0>>2]=c[na+0>>2];Wh(0,e,C,h,Fa);break};case 112:{Da=j+8|0;Ga=c[f>>2]|0;da=d+8|0;ca=mc[c[(c[da>>2]|0)+8>>2]&63](da)|0;da=a[ca]|0;if((da&1)==0){La=(da&255)>>>1}else{La=c[ca+4>>2]|0}da=a[ca+12|0]|0;if((da&1)==0){Ma=(da&255)>>>1}else{Ma=c[ca+16>>2]|0}if((La|0)==(0-Ma|0)){c[h>>2]=c[h>>2]|4;break a}c[V>>2]=Ga;c[B+0>>2]=c[V+0>>2];Ga=zg(e,B,ca,ca+24|0,Fa,h,0)|0;da=Ga-ca|0;do{if((Ga|0)==(ca|0)){if((c[Da>>2]|0)!=12){break}c[Da>>2]=0;break a}}while(0);if((da|0)!=12){break a}ca=c[Da>>2]|0;if((ca|0)>=12){break a}c[Da>>2]=ca+12;break};case 84:{ca=e;c[va>>2]=c[ca>>2];c[wa>>2]=c[f>>2];c[v+0>>2]=c[va+0>>2];c[u+0>>2]=c[wa+0>>2];Mh(ua,d,v,u,g,h,j,229576,229608|0);c[ca>>2]=c[ua>>2];break};case 120:{ca=c[(c[d>>2]|0)+20>>2]|0;c[xa>>2]=c[e>>2];c[ya>>2]=c[f>>2];c[s+0>>2]=c[xa+0>>2];c[r+0>>2]=c[ya+0>>2];hc[ca&63](b,d,s,r,g,h,j);i=l;return};case 88:{ca=d+8|0;Ga=mc[c[(c[ca>>2]|0)+24>>2]&63](ca)|0;ca=e;c[Aa>>2]=c[ca>>2];c[Ba>>2]=c[f>>2];Ea=a[Ga]|0;if((Ea&1)==0){Na=Ga+4|0;Oa=Ga+4|0;Pa=(Ea&255)>>>1}else{Ea=c[Ga+8>>2]|0;Na=Ea;Oa=Ea;Pa=c[Ga+4>>2]|0}c[q+0>>2]=c[Aa+0>>2];c[p+0>>2]=c[Ba+0>>2];Mh(za,d,q,p,g,h,j,Oa,Na+(Pa<<2)|0);c[ca>>2]=c[za>>2];break};case 101:case 100:{ca=j+12|0;c[$>>2]=c[f>>2];c[M+0>>2]=c[$+0>>2];Ga=Yh(e,M,h,Fa,2)|0;Ea=c[h>>2]|0;do{if((Ea&4|0)==0){if(!((Ga+ -1|0)>>>0<31)){break}c[ca>>2]=Ga;break a}}while(0);c[h>>2]=Ea|4;break};case 68:{Ga=e;c[ia>>2]=c[Ga>>2];c[ja>>2]=c[f>>2];c[L+0>>2]=c[ia+0>>2];c[K+0>>2]=c[ja+0>>2];Mh(ha,d,L,K,g,h,j,229440,229472|0);c[Ga>>2]=c[ha>>2];break};case 70:{Ga=e;c[la>>2]=c[Ga>>2];c[ma>>2]=c[f>>2];c[J+0>>2]=c[la+0>>2];c[I+0>>2]=c[ma+0>>2];Mh(ka,d,J,I,g,h,j,229472,229504|0);c[Ga>>2]=c[ka>>2];break};case 72:{c[_>>2]=c[f>>2];c[H+0>>2]=c[_+0>>2];Ga=Yh(e,H,h,Fa,2)|0;ca=c[h>>2]|0;if((ca&4|0)==0&(Ga|0)<24){c[j+8>>2]=Ga;break a}else{c[h>>2]=ca|4;break a}break};case 73:{ca=j+8|0;c[Z>>2]=c[f>>2];c[G+0>>2]=c[Z+0>>2];Ga=Yh(e,G,h,Fa,2)|0;Da=c[h>>2]|0;do{if((Da&4|0)==0){if(!((Ga+ -1|0)>>>0<12)){break}c[ca>>2]=Ga;break a}}while(0);c[h>>2]=Da|4;break};case 106:{c[Y>>2]=c[f>>2];c[F+0>>2]=c[Y+0>>2];Ga=Yh(e,F,h,Fa,3)|0;ca=c[h>>2]|0;if((ca&4|0)==0&(Ga|0)<366){c[j+28>>2]=Ga;break a}else{c[h>>2]=ca|4;break a}break};case 65:case 97:{ca=c[f>>2]|0;Ga=d+8|0;Ea=mc[c[c[Ga>>2]>>2]&63](Ga)|0;c[ba>>2]=ca;c[Q+0>>2]=c[ba+0>>2];ca=(zg(e,Q,Ea,Ea+168|0,Fa,h,0)|0)-Ea|0;if((ca|0)>=168){break a}c[j+24>>2]=((ca|0)/12|0|0)%7|0;break};case 114:{ca=e;c[pa>>2]=c[ca>>2];c[qa>>2]=c[f>>2];c[A+0>>2]=c[pa+0>>2];c[z+0>>2]=c[qa+0>>2];Mh(oa,d,A,z,g,h,j,229504,229548|0);c[ca>>2]=c[oa>>2];break};case 82:{ca=e;c[sa>>2]=c[ca>>2];c[ta>>2]=c[f>>2];c[y+0>>2]=c[sa+0>>2];c[x+0>>2]=c[ta+0>>2];Mh(ra,d,y,x,g,h,j,229552,229572|0);c[ca>>2]=c[ra>>2];break};case 83:{c[U>>2]=c[f>>2];c[w+0>>2]=c[U+0>>2];ca=Yh(e,w,h,Fa,2)|0;Ea=c[h>>2]|0;if((Ea&4|0)==0&(ca|0)<61){c[j>>2]=ca;break a}else{c[h>>2]=Ea|4;break a}break};case 119:{c[T>>2]=c[f>>2];c[t+0>>2]=c[T+0>>2];Ea=Yh(e,t,h,Fa,1)|0;ca=c[h>>2]|0;if((ca&4|0)==0&(Ea|0)<7){c[j+24>>2]=Ea;break a}else{c[h>>2]=ca|4;break a}break};case 37:{c[Ca>>2]=c[f>>2];c[m+0>>2]=c[Ca+0>>2];Xh(0,e,m,h,Fa);break};default:{c[h>>2]=c[h>>2]|4}}}while(0);c[b>>2]=c[e>>2];i=l;return}function Wh(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;a=i;g=b;b=d;d=f;a:while(1){h=c[g>>2]|0;do{if((h|0)==0){j=1}else{k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){l=mc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{l=c[k>>2]|0}if((l|0)==-1){c[g>>2]=0;j=1;break}else{j=(c[g>>2]|0)==0;break}}}while(0);h=c[b>>2]|0;do{if((h|0)==0){m=15}else{k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){n=mc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{n=c[k>>2]|0}if((n|0)==-1){c[b>>2]=0;m=15;break}else{if(j){o=h;break}else{p=h;break a}}}}while(0);if((m|0)==15){m=0;if(j){p=0;break}else{o=0}}h=c[g>>2]|0;k=c[h+12>>2]|0;if((k|0)==(c[h+16>>2]|0)){q=mc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{q=c[k>>2]|0}if(!(gc[c[(c[d>>2]|0)+12>>2]&31](f,8192,q)|0)){p=o;break}k=c[g>>2]|0;h=k+12|0;r=c[h>>2]|0;if((r|0)==(c[k+16>>2]|0)){mc[c[(c[k>>2]|0)+40>>2]&63](k)|0;continue}else{c[h>>2]=r+4;continue}}o=c[g>>2]|0;do{if((o|0)==0){s=1}else{q=c[o+12>>2]|0;if((q|0)==(c[o+16>>2]|0)){t=mc[c[(c[o>>2]|0)+36>>2]&63](o)|0}else{t=c[q>>2]|0}if((t|0)==-1){c[g>>2]=0;s=1;break}else{s=(c[g>>2]|0)==0;break}}}while(0);do{if((p|0)==0){m=37}else{g=c[p+12>>2]|0;if((g|0)==(c[p+16>>2]|0)){u=mc[c[(c[p>>2]|0)+36>>2]&63](p)|0}else{u=c[g>>2]|0}if((u|0)==-1){c[b>>2]=0;m=37;break}if(!s){break}i=a;return}}while(0);do{if((m|0)==37){if(s){break}i=a;return}}while(0);c[e>>2]=c[e>>2]|2;i=a;return}function Xh(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a=i;g=b;b=c[g>>2]|0;do{if((b|0)==0){h=1}else{j=c[b+12>>2]|0;if((j|0)==(c[b+16>>2]|0)){k=mc[c[(c[b>>2]|0)+36>>2]&63](b)|0}else{k=c[j>>2]|0}if((k|0)==-1){c[g>>2]=0;h=1;break}else{h=(c[g>>2]|0)==0;break}}}while(0);k=d;d=c[k>>2]|0;do{if((d|0)==0){l=14}else{b=c[d+12>>2]|0;if((b|0)==(c[d+16>>2]|0)){m=mc[c[(c[d>>2]|0)+36>>2]&63](d)|0}else{m=c[b>>2]|0}if((m|0)==-1){c[k>>2]=0;l=14;break}else{if(h){n=d;break}else{l=16;break}}}}while(0);if((l|0)==14){if(h){l=16}else{n=0}}if((l|0)==16){c[e>>2]=c[e>>2]|6;i=a;return}h=c[g>>2]|0;d=c[h+12>>2]|0;if((d|0)==(c[h+16>>2]|0)){o=mc[c[(c[h>>2]|0)+36>>2]&63](h)|0}else{o=c[d>>2]|0}if(!((gc[c[(c[f>>2]|0)+52>>2]&31](f,o,0)|0)<<24>>24==37)){c[e>>2]=c[e>>2]|4;i=a;return}o=c[g>>2]|0;f=o+12|0;d=c[f>>2]|0;if((d|0)==(c[o+16>>2]|0)){mc[c[(c[o>>2]|0)+40>>2]&63](o)|0}else{c[f>>2]=d+4}d=c[g>>2]|0;do{if((d|0)==0){p=1}else{f=c[d+12>>2]|0;if((f|0)==(c[d+16>>2]|0)){q=mc[c[(c[d>>2]|0)+36>>2]&63](d)|0}else{q=c[f>>2]|0}if((q|0)==-1){c[g>>2]=0;p=1;break}else{p=(c[g>>2]|0)==0;break}}}while(0);do{if((n|0)==0){l=38}else{g=c[n+12>>2]|0;if((g|0)==(c[n+16>>2]|0)){r=mc[c[(c[n>>2]|0)+36>>2]&63](n)|0}else{r=c[g>>2]|0}if((r|0)==-1){c[k>>2]=0;l=38;break}if(!p){break}i=a;return}}while(0);do{if((l|0)==38){if(p){break}i=a;return}}while(0);c[e>>2]=c[e>>2]|2;i=a;return}function Yh(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,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;g=i;h=a;a=c[h>>2]|0;do{if((a|0)==0){j=1}else{k=c[a+12>>2]|0;if((k|0)==(c[a+16>>2]|0)){l=mc[c[(c[a>>2]|0)+36>>2]&63](a)|0}else{l=c[k>>2]|0}if((l|0)==-1){c[h>>2]=0;j=1;break}else{j=(c[h>>2]|0)==0;break}}}while(0);l=b;b=c[l>>2]|0;do{if((b|0)==0){m=14}else{a=c[b+12>>2]|0;if((a|0)==(c[b+16>>2]|0)){n=mc[c[(c[b>>2]|0)+36>>2]&63](b)|0}else{n=c[a>>2]|0}if((n|0)==-1){c[l>>2]=0;m=14;break}else{if(j){o=b;break}else{m=16;break}}}}while(0);if((m|0)==14){if(j){m=16}else{o=0}}if((m|0)==16){c[d>>2]=c[d>>2]|6;p=0;i=g;return p|0}j=c[h>>2]|0;b=c[j+12>>2]|0;if((b|0)==(c[j+16>>2]|0)){q=mc[c[(c[j>>2]|0)+36>>2]&63](j)|0}else{q=c[b>>2]|0}b=e;if(!(gc[c[(c[b>>2]|0)+12>>2]&31](e,2048,q)|0)){c[d>>2]=c[d>>2]|4;p=0;i=g;return p|0}j=e;n=(gc[c[(c[j>>2]|0)+52>>2]&31](e,q,0)|0)<<24>>24;q=c[h>>2]|0;a=q+12|0;k=c[a>>2]|0;if((k|0)==(c[q+16>>2]|0)){mc[c[(c[q>>2]|0)+40>>2]&63](q)|0;r=f;s=o;t=o;u=n}else{c[a>>2]=k+4;r=f;s=o;t=o;u=n}while(1){v=u+ -48|0;n=r+ -1|0;o=c[h>>2]|0;do{if((o|0)==0){w=1}else{f=c[o+12>>2]|0;if((f|0)==(c[o+16>>2]|0)){x=mc[c[(c[o>>2]|0)+36>>2]&63](o)|0}else{x=c[f>>2]|0}if((x|0)==-1){c[h>>2]=0;w=1;break}else{w=(c[h>>2]|0)==0;break}}}while(0);do{if((t|0)==0){y=s;z=0;A=1}else{o=c[t+12>>2]|0;if((o|0)==(c[t+16>>2]|0)){B=mc[c[(c[t>>2]|0)+36>>2]&63](t)|0}else{B=c[o>>2]|0}if((B|0)==-1){c[l>>2]=0;y=0;z=0;A=1;break}else{y=s;z=s;A=(s|0)==0;break}}}while(0);C=c[h>>2]|0;if(!((w^A)&(n|0)>0)){break}o=c[C+12>>2]|0;if((o|0)==(c[C+16>>2]|0)){D=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{D=c[o>>2]|0}if(!(gc[c[(c[b>>2]|0)+12>>2]&31](e,2048,D)|0)){p=v;m=63;break}o=((gc[c[(c[j>>2]|0)+52>>2]&31](e,D,0)|0)<<24>>24)+(v*10|0)|0;f=c[h>>2]|0;k=f+12|0;a=c[k>>2]|0;if((a|0)==(c[f+16>>2]|0)){mc[c[(c[f>>2]|0)+40>>2]&63](f)|0;E=n;s=y;t=z;u=o;r=E;continue}else{c[k>>2]=a+4;E=n;s=y;t=z;u=o;r=E;continue}}if((m|0)==63){i=g;return p|0}do{if((C|0)==0){F=1}else{E=c[C+12>>2]|0;if((E|0)==(c[C+16>>2]|0)){G=mc[c[(c[C>>2]|0)+36>>2]&63](C)|0}else{G=c[E>>2]|0}if((G|0)==-1){c[h>>2]=0;F=1;break}else{F=(c[h>>2]|0)==0;break}}}while(0);do{if((y|0)==0){m=60}else{h=c[y+12>>2]|0;if((h|0)==(c[y+16>>2]|0)){H=mc[c[(c[y>>2]|0)+36>>2]&63](y)|0}else{H=c[h>>2]|0}if((H|0)==-1){c[l>>2]=0;m=60;break}if(F){p=v}else{break}i=g;return p|0}}while(0);do{if((m|0)==60){if(F){break}else{p=v}i=g;return p|0}}while(0);c[d>>2]=c[d>>2]|2;p=v;i=g;return p|0}function Zh(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+8|0;f=c[e>>2]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);if((f|0)==(c[57560]|0)){g=b;Im(g);i=d;return}Ea(c[e>>2]|0);g=b;Im(g);i=d;return}function _h(b){b=b|0;var d=0,e=0;d=i;e=b+8|0;b=c[e>>2]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);if((b|0)==(c[57560]|0)){i=d;return}Ea(c[e>>2]|0);i=d;return}function $h(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+112|0;f=g;l=g+8|0;m=l;n=f;a[n]=37;o=f+1|0;a[o]=j;p=f+2|0;a[p]=k;a[f+3|0]=0;if(!(k<<24>>24==0)){a[o]=k;a[p]=j}j=db(m|0,100,n|0,h|0,c[d+8>>2]|0)|0;d=l+j|0;l=c[e>>2]|0;if((j|0)==0){q=l;r=b;c[r>>2]=q;i=g;return}else{s=m;t=l;u=l}while(1){l=a[s]|0;do{if((u|0)==0){v=t;w=0}else{m=u+24|0;j=c[m>>2]|0;if((j|0)==(c[u+28>>2]|0)){e=(vc[c[(c[u>>2]|0)+52>>2]&15](u,l&255)|0)==-1;v=e?0:t;w=e?0:u;break}else{c[m>>2]=j+1;a[j]=l;v=t;w=u;break}}}while(0);l=s+1|0;if((l|0)==(d|0)){q=v;break}else{s=l;t=v;u=w}}r=b;c[r>>2]=q;i=g;return}function ai(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b+8|0;f=c[e>>2]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);if((f|0)==(c[57560]|0)){g=b;Im(g);i=d;return}Ea(c[e>>2]|0);g=b;Im(g);i=d;return}function bi(b){b=b|0;var d=0,e=0;d=i;e=b+8|0;b=c[e>>2]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);if((b|0)==(c[57560]|0)){i=d;return}Ea(c[e>>2]|0);i=d;return}function ci(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+408|0;e=f;k=f+400|0;l=e;c[k>>2]=e+400;di(b+8|0,l,k,g,h,j);j=c[k>>2]|0;k=c[d>>2]|0;if((l|0)==(j|0)){m=k;n=a;c[n>>2]=m;i=f;return}else{o=l;p=k;q=k}while(1){k=c[o>>2]|0;if((p|0)==0){r=q;s=0}else{l=p+24|0;d=c[l>>2]|0;if((d|0)==(c[p+28>>2]|0)){t=vc[c[(c[p>>2]|0)+52>>2]&15](p,k)|0}else{c[l>>2]=d+4;c[d>>2]=k;t=k}k=(t|0)==-1;r=k?0:q;s=k?0:p}k=o+4|0;if((k|0)==(j|0)){m=r;break}else{o=k;p=s;q=r}}n=a;c[n>>2]=m;i=f;return}function di(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;i=i+120|0;k=j;l=j+112|0;m=i;i=i+8|0;n=j+8|0;o=k;a[o]=37;p=k+1|0;a[p]=g;q=k+2|0;a[q]=h;a[k+3|0]=0;if(!(h<<24>>24==0)){a[p]=h;a[q]=g}g=b;db(n|0,100,o|0,f|0,c[g>>2]|0)|0;f=l;c[f>>2]=0;c[f+4>>2]=0;c[m>>2]=n;n=(c[e>>2]|0)-d>>2;f=ib(c[g>>2]|0)|0;g=Yl(d,m,n,l)|0;if((f|0)!=0){ib(f|0)|0}if((g|0)==-1){$i(231232)}else{c[e>>2]=d+(g<<2);i=j;return}}function ei(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function fi(a){a=a|0;i=i;return}function gi(a){a=a|0;i=i;return 127}function hi(a){a=a|0;i=i;return 127}function ii(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function ji(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function ki(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function li(a,b){a=a|0;b=b|0;b=i;le(a,1,45);i=b;return}function mi(a){a=a|0;i=i;return 0}function ni(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function oi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function pi(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function qi(a){a=a|0;i=i;return}function ri(a){a=a|0;i=i;return 127}function si(a){a=a|0;i=i;return 127}function ti(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function ui(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function vi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function wi(a,b){a=a|0;b=b|0;b=i;le(a,1,45);i=b;return}function xi(a){a=a|0;i=i;return 0}function yi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function zi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ai(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Bi(a){a=a|0;i=i;return}function Ci(a){a=a|0;i=i;return 2147483647}function Di(a){a=a|0;i=i;return 2147483647}function Ei(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Fi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Gi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Hi(a,b){a=a|0;b=b|0;b=i;we(a,1,45);i=b;return}function Ii(a){a=a|0;i=i;return 0}function Ji(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Ki(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Li(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Mi(a){a=a|0;i=i;return}function Ni(a){a=a|0;i=i;return 2147483647}function Oi(a){a=a|0;i=i;return 2147483647}function Pi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Qi(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Ri(a,b){a=a|0;b=b|0;var d=0;b=i;d=a;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;i=b;return}function Si(a,b){a=a|0;b=b|0;b=i;we(a,1,45);i=b;return}function Ti(a){a=a|0;i=i;return 0}function Ui(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Vi(b,c){b=b|0;c=c|0;c=b;a[c]=67109634;a[c+1|0]=262147;a[c+2|0]=1024;a[c+3|0]=4;i=i;return}function Wi(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Xi(a){a=a|0;i=i;return}function Yi(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+104|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=i;i=i+8|0;u=i;i=i+16|0;v=i;i=i+104|0;w=p;c[w>>2]=o;x=p+4|0;c[x>>2]=114;y=o+100|0;Ge(r,h);o=r;z=c[o>>2]|0;if(!((c[57588]|0)==-1)){c[n>>2]=230352;c[n+4>>2]=112;c[n+8>>2]=0;he(230352,n,113)}n=(c[230356>>2]|0)+ -1|0;A=c[z+8>>2]|0;if(!((c[z+12>>2]|0)-A>>2>>>0>n>>>0)){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}z=c[A+(n<<2)>>2]|0;if((z|0)==0){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}B=z;a[s]=0;C=f;c[t>>2]=c[C>>2];f=c[h+4>>2]|0;h=l;n=t;c[h+0>>2]=c[n+0>>2];n=_i(e,l,g,r,f,j,s,B,p,q,y)|0;do{if(n){y=u;sc[c[(c[z>>2]|0)+32>>2]&7](B,229968,229978|0,y)|0;p=v;f=c[q>>2]|0;r=c[w>>2]|0;g=f-r|0;do{if((g|0)>98){l=Bm(g+2|0)|0;if((l|0)!=0){D=l;E=l;break}Nm()}else{D=0;E=p}}while(0);if((a[s]|0)==0){F=E}else{a[E]=45;F=E+1|0}if(r>>>0<f>>>0){g=u+10|0;l=u;h=F;t=r;while(1){A=a[t]|0;G=y;while(1){H=G+1|0;if((a[G]|0)==A<<24>>24){I=G;break}if((H|0)==(g|0)){I=g;break}else{G=H}}a[h]=a[229968+(I-l)|0]|0;G=t+1|0;A=h+1|0;if(G>>>0<(c[q>>2]|0)>>>0){h=A;t=G}else{J=A;break}}}else{J=F}a[J]=0;c[m>>2]=k;if((gb(p|0,229984,m|0)|0)!=1){t=Va(8)|0;Vd(t,229992);xb(t|0,227360,11)}if((D|0)==0){break}Cm(D)}}while(0);D=e;e=c[D>>2]|0;do{if((e|0)==0){K=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){K=e;break}if(!((mc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){K=e;break}c[D>>2]=0;K=0}}while(0);D=(K|0)==0;e=c[C>>2]|0;do{if((e|0)==0){L=31}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){if(D){break}else{L=33;break}}if((mc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1){c[C>>2]=0;L=31;break}else{if(D){break}else{L=33;break}}}}while(0);if((L|0)==31){if(D){L=33}}if((L|0)==33){c[j>>2]=c[j>>2]|2}c[b>>2]=K;Pd(c[o>>2]|0)|0;o=c[w>>2]|0;c[w>>2]=0;if((o|0)==0){i=d;return}jc[c[x>>2]&127](o);i=d;return}function Zi(a){a=a|0;i=i;return}function _i(e,f,g,h,j,k,l,m,n,o,p){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;var 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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,kc=0,lc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0;q=i;i=i+408|0;r=q;s=q+400|0;t=s;u=i;i=i+8|0;v=i;i=i+8|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+8|0;D=r;c[s>>2]=0;E=w;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;F=x;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;G=y;c[G+0>>2]=0;c[G+4>>2]=0;c[G+8>>2]=0;H=z;c[H+0>>2]=0;c[H+4>>2]=0;c[H+8>>2]=0;I=A;c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;cj(g,h,t,u,v,w,x,y,z,B);t=n;c[o>>2]=c[t>>2];h=e;e=f;f=s;s=m+8|0;m=z+1|0;g=z+4|0;J=z+8|0;K=y+1|0;L=y+4|0;M=y+8|0;N=(j&512|0)!=0;j=x+1|0;O=x+8|0;P=x+4|0;Q=A;R=Q+1|0;S=A+8|0;T=A+4|0;U=f+3|0;V=n+4|0;n=w+4|0;W=r+400|0;r=D;X=D;D=p;p=0;Y=0;Z=114;a:while(1){_=c[h>>2]|0;do{if((_|0)==0){$=0}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){$=_;break}if((mc[c[(c[_>>2]|0)+36>>2]&63](_)|0)==-1){c[h>>2]=0;$=0;break}else{$=c[h>>2]|0;break}}}while(0);_=($|0)==0;aa=c[e>>2]|0;do{if((aa|0)==0){ba=12}else{if((c[aa+12>>2]|0)!=(c[aa+16>>2]|0)){if(_){ca=aa;break}else{da=X;ea=r;fa=Y;ga=Z;ba=269;break a}}if((mc[c[(c[aa>>2]|0)+36>>2]&63](aa)|0)==-1){c[e>>2]=0;ba=12;break}else{if(_){ca=aa;break}else{da=X;ea=r;fa=Y;ga=Z;ba=269;break a}}}}while(0);if((ba|0)==12){ba=0;if(_){da=X;ea=r;fa=Y;ga=Z;ba=269;break}else{ca=0}}b:do{switch(a[f+p|0]|0){case 4:{aa=D;ha=X;ia=r;ja=W;ka=0;la=Z;c:while(1){ma=c[h>>2]|0;do{if((ma|0)==0){na=0}else{if((c[ma+12>>2]|0)!=(c[ma+16>>2]|0)){na=ma;break}if((mc[c[(c[ma>>2]|0)+36>>2]&63](ma)|0)==-1){c[h>>2]=0;na=0;break}else{na=c[h>>2]|0;break}}}while(0);ma=(na|0)==0;oa=c[e>>2]|0;do{if((oa|0)==0){ba=173}else{if((c[oa+12>>2]|0)!=(c[oa+16>>2]|0)){if(ma){break}else{break c}}if((mc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0)==-1){c[e>>2]=0;ba=173;break}else{if(ma){break}else{break c}}}}while(0);if((ba|0)==173){ba=0;if(ma){break}}oa=c[h>>2]|0;pa=c[oa+12>>2]|0;if((pa|0)==(c[oa+16>>2]|0)){qa=mc[c[(c[oa>>2]|0)+36>>2]&63](oa)|0}else{qa=d[pa]|0}pa=qa&255;do{if(pa<<24>>24>-1){if((b[(c[s>>2]|0)+(qa<<24>>24<<1)>>1]&2048)==0){ba=189;break}oa=c[o>>2]|0;if((oa|0)==(aa|0)){ra=(c[V>>2]|0)!=114;sa=c[t>>2]|0;ta=aa-sa|0;ua=ta>>>0<2147483647?ta<<1:-1;va=Dm(ra?sa:0,ua)|0;if((va|0)==0){ba=182;break a}do{if(ra){c[t>>2]=va;wa=va}else{sa=c[t>>2]|0;c[t>>2]=va;if((sa|0)==0){wa=va;break}jc[c[V>>2]&127](sa);wa=c[t>>2]|0}}while(0);c[V>>2]=115;va=wa+ta|0;c[o>>2]=va;xa=va;ya=(c[t>>2]|0)+ua|0}else{xa=oa;ya=aa}c[o>>2]=xa+1;a[xa]=pa;za=ya;Aa=ha;Ba=ia;Ca=ja;Da=ka+1|0;Ea=la}else{ba=189}}while(0);if((ba|0)==189){ba=0;ma=a[E]|0;if((ma&1)==0){Fa=(ma&255)>>>1}else{Fa=c[n>>2]|0}if((Fa|0)==0|(ka|0)==0){break}if(!(pa<<24>>24==(a[v]|0))){break}if((ia|0)==(ja|0)){ma=ia-ha|0;va=ma>>>0<2147483647?ma<<1:-1;if((la|0)==114){Ga=0}else{Ga=ha}ra=Dm(Ga,va)|0;sa=ra;if((ra|0)==0){ba=198;break a}Ha=sa;Ia=sa+(ma>>2<<2)|0;Ja=sa+(va>>>2<<2)|0;Ka=115}else{Ha=ha;Ia=ia;Ja=ja;Ka=la}c[Ia>>2]=ka;za=aa;Aa=Ha;Ba=Ia+4|0;Ca=Ja;Da=0;Ea=Ka}va=c[h>>2]|0;sa=va+12|0;ma=c[sa>>2]|0;if((ma|0)==(c[va+16>>2]|0)){mc[c[(c[va>>2]|0)+40>>2]&63](va)|0;aa=za;ha=Aa;ia=Ba;ja=Ca;ka=Da;la=Ea;continue}else{c[sa>>2]=ma+1;aa=za;ha=Aa;ia=Ba;ja=Ca;ka=Da;la=Ea;continue}}if((ha|0)==(ia|0)|(ka|0)==0){La=ha;Ma=ia;Na=ja;Oa=la}else{if((ia|0)==(ja|0)){ma=ia-ha|0;sa=ma>>>0<2147483647?ma<<1:-1;if((la|0)==114){Pa=0}else{Pa=ha}va=Dm(Pa,sa)|0;ra=va;if((va|0)==0){ba=209;break a}Qa=ra;Ra=ra+(ma>>2<<2)|0;Sa=ra+(sa>>>2<<2)|0;Ta=115}else{Qa=ha;Ra=ia;Sa=ja;Ta=la}c[Ra>>2]=ka;La=Qa;Ma=Ra+4|0;Na=Sa;Oa=Ta}sa=c[B>>2]|0;if((sa|0)>0){ra=c[h>>2]|0;do{if((ra|0)==0){Ua=0}else{if((c[ra+12>>2]|0)!=(c[ra+16>>2]|0)){Ua=ra;break}if((mc[c[(c[ra>>2]|0)+36>>2]&63](ra)|0)==-1){c[h>>2]=0;Ua=0;break}else{Ua=c[h>>2]|0;break}}}while(0);ra=(Ua|0)==0;ka=c[e>>2]|0;do{if((ka|0)==0){ba=223}else{if((c[ka+12>>2]|0)!=(c[ka+16>>2]|0)){if(ra){Va=ka;break}else{ba=229;break a}}if((mc[c[(c[ka>>2]|0)+36>>2]&63](ka)|0)==-1){c[e>>2]=0;ba=223;break}else{if(ra){Va=ka;break}else{ba=229;break a}}}}while(0);if((ba|0)==223){ba=0;if(ra){ba=229;break a}else{Va=0}}ka=c[h>>2]|0;la=c[ka+12>>2]|0;if((la|0)==(c[ka+16>>2]|0)){Wa=mc[c[(c[ka>>2]|0)+36>>2]&63](ka)|0}else{Wa=d[la]|0}if(!((Wa&255)<<24>>24==(a[u]|0))){ba=229;break a}la=c[h>>2]|0;ka=la+12|0;ja=c[ka>>2]|0;if((ja|0)==(c[la+16>>2]|0)){mc[c[(c[la>>2]|0)+40>>2]&63](la)|0;Xa=Va;Ya=sa;Za=Va;_a=aa}else{c[ka>>2]=ja+1;Xa=Va;Ya=sa;Za=Va;_a=aa}while(1){ja=c[h>>2]|0;do{if((ja|0)==0){$a=0}else{if((c[ja+12>>2]|0)!=(c[ja+16>>2]|0)){$a=ja;break}if((mc[c[(c[ja>>2]|0)+36>>2]&63](ja)|0)==-1){c[h>>2]=0;$a=0;break}else{$a=c[h>>2]|0;break}}}while(0);ja=($a|0)==0;do{if((Za|0)==0){ab=Xa;ba=243}else{if((c[Za+12>>2]|0)!=(c[Za+16>>2]|0)){if(ja){bb=Xa;cb=Za;break}else{ba=250;break a}}if((mc[c[(c[Za>>2]|0)+36>>2]&63](Za)|0)==-1){c[e>>2]=0;ab=0;ba=243;break}else{if(ja^(Xa|0)==0){bb=Xa;cb=Xa;break}else{ba=250;break a}}}}while(0);if((ba|0)==243){ba=0;if(ja){ba=250;break a}else{bb=ab;cb=0}}pa=c[h>>2]|0;ka=c[pa+12>>2]|0;if((ka|0)==(c[pa+16>>2]|0)){db=mc[c[(c[pa>>2]|0)+36>>2]&63](pa)|0}else{db=d[ka]|0}if(!((db&255)<<24>>24>-1)){ba=250;break a}if((b[(c[s>>2]|0)+(db<<24>>24<<1)>>1]&2048)==0){ba=250;break a}ka=c[o>>2]|0;if((ka|0)==(_a|0)){pa=(c[V>>2]|0)!=114;la=c[t>>2]|0;ia=_a-la|0;ha=ia>>>0<2147483647?ia<<1:-1;ma=Dm(pa?la:0,ha)|0;if((ma|0)==0){ba=253;break a}do{if(pa){c[t>>2]=ma;eb=ma}else{la=c[t>>2]|0;c[t>>2]=ma;if((la|0)==0){eb=ma;break}jc[c[V>>2]&127](la);eb=c[t>>2]|0}}while(0);c[V>>2]=115;ma=eb+ia|0;c[o>>2]=ma;fb=ma;gb=(c[t>>2]|0)+ha|0}else{fb=ka;gb=_a}ma=c[h>>2]|0;pa=c[ma+12>>2]|0;if((pa|0)==(c[ma+16>>2]|0)){ja=mc[c[(c[ma>>2]|0)+36>>2]&63](ma)|0;hb=ja;ib=c[o>>2]|0}else{hb=d[pa]|0;ib=fb}c[o>>2]=ib+1;a[ib]=hb;pa=Ya+ -1|0;c[B>>2]=pa;ja=c[h>>2]|0;ma=ja+12|0;la=c[ma>>2]|0;if((la|0)==(c[ja+16>>2]|0)){mc[c[(c[ja>>2]|0)+40>>2]&63](ja)|0}else{c[ma>>2]=la+1}if((pa|0)>0){Xa=bb;Ya=pa;Za=cb;_a=gb}else{jb=gb;break}}}else{jb=aa}if((c[o>>2]|0)==(c[t>>2]|0)){ba=267;break a}else{kb=jb;lb=La;mb=Ma;nb=Na;ob=Y;pb=Oa}break};case 0:{ba=26;break};case 1:{if((p|0)==3){da=X;ea=r;fa=Y;ga=Z;ba=269;break a}sa=c[h>>2]|0;ra=c[sa+12>>2]|0;if((ra|0)==(c[sa+16>>2]|0)){qb=mc[c[(c[sa>>2]|0)+36>>2]&63](sa)|0}else{qb=d[ra]|0}if(!((qb&255)<<24>>24>-1)){ba=25;break a}if((b[(c[s>>2]|0)+(qb<<24>>24<<1)>>1]&8192)==0){ba=25;break a}ra=c[h>>2]|0;sa=ra+12|0;pa=c[sa>>2]|0;if((pa|0)==(c[ra+16>>2]|0)){rb=mc[c[(c[ra>>2]|0)+40>>2]&63](ra)|0}else{c[sa>>2]=pa+1;rb=d[pa]|0}re(A,rb&255);ba=26;break};case 3:{pa=a[G]|0;sa=(pa&1)==0;if(sa){sb=(pa&255)>>>1}else{sb=c[L>>2]|0}ra=a[H]|0;la=(ra&1)==0;if(la){tb=(ra&255)>>>1}else{tb=c[g>>2]|0}if((sb|0)==(0-tb|0)){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}if(sa){ub=(pa&255)>>>1}else{ub=c[L>>2]|0}do{if((ub|0)!=0){if(la){vb=(ra&255)>>>1}else{vb=c[g>>2]|0}if((vb|0)==0){break}ma=c[h>>2]|0;ja=c[ma+12>>2]|0;va=c[ma+16>>2]|0;if((ja|0)==(va|0)){wb=mc[c[(c[ma>>2]|0)+36>>2]&63](ma)|0;xb=c[h>>2]|0;yb=wb;zb=c[xb+16>>2]|0;Ab=c[xb+12>>2]|0;Bb=xb;Cb=a[G]|0}else{yb=d[ja]|0;zb=va;Ab=ja;Bb=ma;Cb=pa}ma=Bb+12|0;ja=(Ab|0)==(zb|0);if((yb&255)<<24>>24==(a[(Cb&1)==0?K:c[M>>2]|0]|0)){if(ja){mc[c[(c[Bb>>2]|0)+40>>2]&63](Bb)|0}else{c[ma>>2]=Ab+1}ma=a[G]|0;if((ma&1)==0){Db=(ma&255)>>>1}else{Db=c[L>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Db>>>0>1?y:Y;pb=Z;break b}if(ja){Eb=mc[c[(c[Bb>>2]|0)+36>>2]&63](Bb)|0}else{Eb=d[Ab]|0}if(!((Eb&255)<<24>>24==(a[(a[H]&1)==0?m:c[J>>2]|0]|0))){ba=112;break a}ja=c[h>>2]|0;ma=ja+12|0;va=c[ma>>2]|0;if((va|0)==(c[ja+16>>2]|0)){mc[c[(c[ja>>2]|0)+40>>2]&63](ja)|0}else{c[ma>>2]=va+1}a[l]=1;va=a[H]|0;if((va&1)==0){Fb=(va&255)>>>1}else{Fb=c[g>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Fb>>>0>1?z:Y;pb=Z;break b}}while(0);if(sa){Gb=(pa&255)>>>1}else{Gb=c[L>>2]|0}la=c[h>>2]|0;aa=c[la+12>>2]|0;va=(aa|0)==(c[la+16>>2]|0);if((Gb|0)==0){if(va){ma=mc[c[(c[la>>2]|0)+36>>2]&63](la)|0;Hb=ma;Ib=a[H]|0}else{Hb=d[aa]|0;Ib=ra}if(!((Hb&255)<<24>>24==(a[(Ib&1)==0?m:c[J>>2]|0]|0))){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}ma=c[h>>2]|0;ja=ma+12|0;xb=c[ja>>2]|0;if((xb|0)==(c[ma+16>>2]|0)){mc[c[(c[ma>>2]|0)+40>>2]&63](ma)|0}else{c[ja>>2]=xb+1}a[l]=1;xb=a[H]|0;if((xb&1)==0){Jb=(xb&255)>>>1}else{Jb=c[g>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Jb>>>0>1?z:Y;pb=Z;break b}if(va){va=mc[c[(c[la>>2]|0)+36>>2]&63](la)|0;Kb=va;Lb=a[G]|0}else{Kb=d[aa]|0;Lb=pa}if(!((Kb&255)<<24>>24==(a[(Lb&1)==0?K:c[M>>2]|0]|0))){a[l]=1;kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}aa=c[h>>2]|0;va=aa+12|0;la=c[va>>2]|0;if((la|0)==(c[aa+16>>2]|0)){mc[c[(c[aa>>2]|0)+40>>2]&63](aa)|0}else{c[va>>2]=la+1}la=a[G]|0;if((la&1)==0){Mb=(la&255)>>>1}else{Mb=c[L>>2]|0}kb=D;lb=X;mb=r;nb=W;ob=Mb>>>0>1?y:Y;pb=Z;break};case 2:{if(!((Y|0)!=0|p>>>0<2)){if((p|0)==2){Nb=(a[U]|0)!=0}else{Nb=0}if(!(N|Nb)){kb=D;lb=X;mb=r;nb=W;ob=0;pb=Z;break b}}la=a[F]|0;va=(la&1)==0;aa=va?j:c[O>>2]|0;d:do{if((p|0)==0){Ob=ca;Pb=ca;Qb=la;Rb=aa}else{if((d[f+(p+ -1)|0]|0)>=2){Ob=ca;Pb=ca;Qb=la;Rb=aa;break}xb=aa+(va?(la&255)>>>1:c[P>>2]|0)|0;ja=aa;while(1){if((ja|0)==(xb|0)){Sb=xb;break}ma=a[ja]|0;if(!(ma<<24>>24>-1)){Sb=ja;break}if((b[(c[s>>2]|0)+(ma<<24>>24<<1)>>1]&8192)==0){Sb=ja;break}else{ja=ja+1|0}}ja=Sb-aa|0;xb=a[I]|0;ka=(xb&1)==0;if(ka){Tb=(xb&255)>>>1}else{Tb=c[T>>2]|0}if(ja>>>0>Tb>>>0){Ob=ca;Pb=ca;Qb=la;Rb=aa;break}if(ka){ka=(xb&255)>>>1;Ub=Q+(ka-ja)+1|0;Vb=R;Wb=ka}else{ka=c[S>>2]|0;xb=c[T>>2]|0;Ub=ka+(xb-ja)|0;Vb=ka;Wb=xb}xb=Vb+Wb|0;if((Ub|0)==(xb|0)){Ob=ca;Pb=ca;Qb=la;Rb=Sb;break}else{Xb=aa;Yb=Ub}while(1){if((a[Yb]|0)!=(a[Xb]|0)){Ob=ca;Pb=ca;Qb=la;Rb=aa;break d}ka=Yb+1|0;if((ka|0)==(xb|0)){Ob=ca;Pb=ca;Qb=la;Rb=Sb;break}else{Xb=Xb+1|0;Yb=ka}}}}while(0);e:while(1){if((Qb&1)==0){Zb=j;_b=(Qb&255)>>>1}else{Zb=c[O>>2]|0;_b=c[P>>2]|0}if((Rb|0)==(Zb+_b|0)){break}la=c[h>>2]|0;do{if((la|0)==0){$b=0}else{if((c[la+12>>2]|0)!=(c[la+16>>2]|0)){$b=la;break}if((mc[c[(c[la>>2]|0)+36>>2]&63](la)|0)==-1){c[h>>2]=0;$b=0;break}else{$b=c[h>>2]|0;break}}}while(0);la=($b|0)==0;do{if((Pb|0)==0){ac=Ob;ba=147}else{if((c[Pb+12>>2]|0)!=(c[Pb+16>>2]|0)){if(la){bc=Ob;cc=Pb;break}else{break e}}if((mc[c[(c[Pb>>2]|0)+36>>2]&63](Pb)|0)==-1){c[e>>2]=0;ac=0;ba=147;break}else{if(la^(Ob|0)==0){bc=Ob;cc=Ob;break}else{break e}}}}while(0);if((ba|0)==147){ba=0;if(la){break}else{bc=ac;cc=0}}aa=c[h>>2]|0;va=c[aa+12>>2]|0;if((va|0)==(c[aa+16>>2]|0)){dc=mc[c[(c[aa>>2]|0)+36>>2]&63](aa)|0}else{dc=d[va]|0}if(!((dc&255)<<24>>24==(a[Rb]|0))){break}va=c[h>>2]|0;aa=va+12|0;pa=c[aa>>2]|0;if((pa|0)==(c[va+16>>2]|0)){mc[c[(c[va>>2]|0)+40>>2]&63](va)|0}else{c[aa>>2]=pa+1}Ob=bc;Pb=cc;Qb=a[F]|0;Rb=Rb+1|0}if(!N){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break b}pa=a[F]|0;if((pa&1)==0){ec=j;fc=(pa&255)>>>1}else{ec=c[O>>2]|0;fc=c[P>>2]|0}if((Rb|0)==(ec+fc|0)){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z}else{ba=162;break a}break};default:{kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z}}}while(0);f:do{if((ba|0)==26){ba=0;if((p|0)==3){da=X;ea=r;fa=Y;ga=Z;ba=269;break a}else{gc=ca;hc=ca}while(1){_=c[h>>2]|0;do{if((_|0)==0){ic=0}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){ic=_;break}if((mc[c[(c[_>>2]|0)+36>>2]&63](_)|0)==-1){c[h>>2]=0;ic=0;break}else{ic=c[h>>2]|0;break}}}while(0);_=(ic|0)==0;do{if((hc|0)==0){kc=gc;ba=37}else{if((c[hc+12>>2]|0)!=(c[hc+16>>2]|0)){if(_){lc=gc;nc=hc;break}else{kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}}if((mc[c[(c[hc>>2]|0)+36>>2]&63](hc)|0)==-1){c[e>>2]=0;kc=0;ba=37;break}else{if(_^(gc|0)==0){lc=gc;nc=gc;break}else{kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}}}}while(0);if((ba|0)==37){ba=0;if(_){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}else{lc=kc;nc=0}}la=c[h>>2]|0;pa=c[la+12>>2]|0;if((pa|0)==(c[la+16>>2]|0)){oc=mc[c[(c[la>>2]|0)+36>>2]&63](la)|0}else{oc=d[pa]|0}if(!((oc&255)<<24>>24>-1)){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}if((b[(c[s>>2]|0)+(oc<<24>>24<<1)>>1]&8192)==0){kb=D;lb=X;mb=r;nb=W;ob=Y;pb=Z;break f}pa=c[h>>2]|0;la=pa+12|0;aa=c[la>>2]|0;if((aa|0)==(c[pa+16>>2]|0)){pc=mc[c[(c[pa>>2]|0)+40>>2]&63](pa)|0}else{c[la>>2]=aa+1;pc=d[aa]|0}re(A,pc&255);gc=lc;hc=nc}}}while(0);aa=p+1|0;if(aa>>>0<4){W=nb;r=mb;X=lb;D=kb;p=aa;Y=ob;Z=pb}else{da=lb;ea=mb;fa=ob;ga=pb;ba=269;break}}g:do{if((ba|0)==25){c[k>>2]=c[k>>2]|4;qc=0;rc=X;sc=Z}else if((ba|0)==112){c[k>>2]=c[k>>2]|4;qc=0;rc=X;sc=Z}else if((ba|0)==162){c[k>>2]=c[k>>2]|4;qc=0;rc=X;sc=Z}else if((ba|0)==182){Nm()}else if((ba|0)==198){Nm()}else if((ba|0)==209){Nm()}else if((ba|0)==229){c[k>>2]=c[k>>2]|4;qc=0;rc=La;sc=Oa}else if((ba|0)==250){c[k>>2]=c[k>>2]|4;qc=0;rc=La;sc=Oa}else if((ba|0)==253){Nm()}else if((ba|0)==267){c[k>>2]=c[k>>2]|4;qc=0;rc=La;sc=Oa}else if((ba|0)==269){h:do{if((fa|0)!=0){pb=fa;ob=fa+1|0;mb=fa+8|0;lb=fa+4|0;Y=1;i:while(1){p=a[pb]|0;if((p&1)==0){tc=(p&255)>>>1}else{tc=c[lb>>2]|0}if(!(Y>>>0<tc>>>0)){break h}p=c[h>>2]|0;do{if((p|0)==0){uc=0}else{if((c[p+12>>2]|0)!=(c[p+16>>2]|0)){uc=p;break}if((mc[c[(c[p>>2]|0)+36>>2]&63](p)|0)==-1){c[h>>2]=0;uc=0;break}else{uc=c[h>>2]|0;break}}}while(0);p=(uc|0)==0;_=c[e>>2]|0;do{if((_|0)==0){ba=285}else{if((c[_+12>>2]|0)!=(c[_+16>>2]|0)){if(p){break}else{break i}}if((mc[c[(c[_>>2]|0)+36>>2]&63](_)|0)==-1){c[e>>2]=0;ba=285;break}else{if(p){break}else{break i}}}}while(0);if((ba|0)==285){ba=0;if(p){break}}_=c[h>>2]|0;kb=c[_+12>>2]|0;if((kb|0)==(c[_+16>>2]|0)){vc=mc[c[(c[_>>2]|0)+36>>2]&63](_)|0}else{vc=d[kb]|0}if((a[pb]&1)==0){wc=ob}else{wc=c[mb>>2]|0}if(!((vc&255)<<24>>24==(a[wc+Y|0]|0))){break}kb=Y+1|0;_=c[h>>2]|0;D=_+12|0;r=c[D>>2]|0;if((r|0)==(c[_+16>>2]|0)){mc[c[(c[_>>2]|0)+40>>2]&63](_)|0;Y=kb;continue}else{c[D>>2]=r+1;Y=kb;continue}}c[k>>2]=c[k>>2]|4;qc=0;rc=da;sc=ga;break g}}while(0);if((da|0)==(ea|0)){qc=1;rc=ea;sc=ga;break}c[C>>2]=0;dj(w,da,ea,C);if((c[C>>2]|0)==0){qc=1;rc=da;sc=ga;break}c[k>>2]=c[k>>2]|4;qc=0;rc=da;sc=ga}}while(0);me(A);me(z);me(y);me(x);me(w);if((rc|0)==0){i=q;return qc|0}jc[sc&127](rc);i=q;return qc|0}function $i(a){a=a|0;var b=0;b=Va(8)|0;Vd(b,a);xb(b|0,227360,11)}function aj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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=i;i=i+168|0;l=d;m=d+8|0;n=d+24|0;o=d+128|0;p=d+136|0;q=d+144|0;r=d+152|0;s=d+160|0;t=o;c[t>>2]=n;u=o+4|0;c[u>>2]=114;v=n+100|0;Ge(q,h);n=q;w=c[n>>2]|0;if(!((c[57588]|0)==-1)){c[m>>2]=230352;c[m+4>>2]=112;c[m+8>>2]=0;he(230352,m,113)}m=(c[230356>>2]|0)+ -1|0;x=c[w+8>>2]|0;if(!((c[w+12>>2]|0)-x>>2>>>0>m>>>0)){y=Va(4)|0;z=y;gm(z);xb(y|0,238312,101)}w=c[x+(m<<2)>>2]|0;if((w|0)==0){y=Va(4)|0;z=y;gm(z);xb(y|0,238312,101)}y=w;a[r]=0;z=f;f=c[z>>2]|0;c[s>>2]=f;m=c[h+4>>2]|0;h=l;x=s;c[h+0>>2]=c[x+0>>2];x=_i(e,l,g,q,m,j,r,y,o,p,v)|0;if(x){x=k;if((a[x]&1)==0){a[k+1|0]=0;a[x]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}x=w;if((a[r]|0)!=0){re(k,vc[c[(c[x>>2]|0)+28>>2]&15](y,45)|0)}r=vc[c[(c[x>>2]|0)+28>>2]&15](y,48)|0;y=c[t>>2]|0;x=c[p>>2]|0;p=x+ -1|0;a:do{if(y>>>0<p>>>0){w=y;while(1){v=w+1|0;if(!((a[w]|0)==r<<24>>24)){A=w;break a}if(v>>>0<p>>>0){w=v}else{A=v;break}}}else{A=y}}while(0);bj(k,A,x)|0}x=e;e=c[x>>2]|0;do{if((e|0)==0){B=0}else{if((c[e+12>>2]|0)!=(c[e+16>>2]|0)){B=e;break}if(!((mc[c[(c[e>>2]|0)+36>>2]&63](e)|0)==-1)){B=e;break}c[x>>2]=0;B=0}}while(0);x=(B|0)==0;do{if((f|0)==0){C=25}else{if((c[f+12>>2]|0)!=(c[f+16>>2]|0)){if(x){break}else{C=27;break}}if((mc[c[(c[f>>2]|0)+36>>2]&63](f)|0)==-1){c[z>>2]=0;C=25;break}else{if(x^(f|0)==0){break}else{C=27;break}}}}while(0);if((C|0)==25){if(x){C=27}}if((C|0)==27){c[j>>2]=c[j>>2]|2}c[b>>2]=B;Pd(c[n>>2]|0)|0;n=c[t>>2]|0;c[t>>2]=0;if((n|0)==0){i=d;return}jc[c[u>>2]&127](n);i=d;return}function bj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=b;h=d;j=a[g]|0;if((j&1)==0){k=(j&255)>>>1;l=j;m=10}else{j=c[b>>2]|0;k=c[b+4>>2]|0;l=j&255;m=(j&-2)+ -1|0}j=e-h|0;if((e|0)==(d|0)){i=f;return b|0}if((m-k|0)>>>0<j>>>0){ue(b,m,k+j-m|0,k,k,0,0);n=a[g]|0}else{n=l}if((n&1)==0){o=b+1|0}else{o=c[b+8>>2]|0}n=e+(k-h)|0;h=d;d=o+k|0;while(1){a[d]=a[h]|0;l=h+1|0;if((l|0)==(e|0)){break}else{d=d+1|0;h=l}}a[o+n|0]=0;n=k+j|0;if((a[g]&1)==0){a[g]=n<<1;i=f;return b|0}else{c[b+4>>2]=n;i=f;return b|0}return 0}function cj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;i=i+176|0;o=n;p=n+16|0;q=n+32|0;r=n+40|0;s=n+56|0;t=n+72|0;u=n+88|0;v=n+104|0;w=n+112|0;x=n+128|0;y=n+144|0;z=n+160|0;if(b){b=c[d>>2]|0;if(!((c[57448]|0)==-1)){c[p>>2]=229792;c[p+4>>2]=112;c[p+8>>2]=0;he(229792,p,113)}p=(c[229796>>2]|0)+ -1|0;A=c[b+8>>2]|0;if(!((c[b+12>>2]|0)-A>>2>>>0>p>>>0)){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}b=c[A+(p<<2)>>2]|0;if((b|0)==0){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}B=b;kc[c[(c[b>>2]|0)+44>>2]&63](q,B);C=e;p=c[q>>2]|0;a[C]=p;a[C+1|0]=p>>8;a[C+2|0]=p>>16;a[C+3|0]=p>>24;p=b;kc[c[(c[p>>2]|0)+32>>2]&63](r,B);C=l;if((a[C]&1)==0){a[l+1|0]=0;a[C]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}qe(l,0);q=r;c[C+0>>2]=c[q+0>>2];c[C+4>>2]=c[q+4>>2];c[C+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;me(r);kc[c[(c[p>>2]|0)+28>>2]&63](s,B);r=k;if((a[r]&1)==0){a[k+1|0]=0;a[r]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}qe(k,0);q=s;c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;me(s);s=b;a[f]=mc[c[(c[s>>2]|0)+12>>2]&63](B)|0;a[g]=mc[c[(c[s>>2]|0)+16>>2]&63](B)|0;kc[c[(c[p>>2]|0)+20>>2]&63](t,B);s=h;if((a[s]&1)==0){a[h+1|0]=0;a[s]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}qe(h,0);q=t;c[s+0>>2]=c[q+0>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;me(t);kc[c[(c[p>>2]|0)+24>>2]&63](u,B);p=j;if((a[p]&1)==0){a[j+1|0]=0;a[p]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}qe(j,0);t=u;c[p+0>>2]=c[t+0>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;me(u);D=mc[c[(c[b>>2]|0)+36>>2]&63](B)|0;c[m>>2]=D;i=n;return}else{B=c[d>>2]|0;if(!((c[57432]|0)==-1)){c[o>>2]=229728;c[o+4>>2]=112;c[o+8>>2]=0;he(229728,o,113)}o=(c[229732>>2]|0)+ -1|0;d=c[B+8>>2]|0;if(!((c[B+12>>2]|0)-d>>2>>>0>o>>>0)){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}B=c[d+(o<<2)>>2]|0;if((B|0)==0){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}E=B;kc[c[(c[B>>2]|0)+44>>2]&63](v,E);F=e;e=c[v>>2]|0;a[F]=e;a[F+1|0]=e>>8;a[F+2|0]=e>>16;a[F+3|0]=e>>24;e=B;kc[c[(c[e>>2]|0)+32>>2]&63](w,E);F=l;if((a[F]&1)==0){a[l+1|0]=0;a[F]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}qe(l,0);l=w;c[F+0>>2]=c[l+0>>2];c[F+4>>2]=c[l+4>>2];c[F+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;me(w);kc[c[(c[e>>2]|0)+28>>2]&63](x,E);w=k;if((a[w]&1)==0){a[k+1|0]=0;a[w]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}qe(k,0);k=x;c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;me(x);x=B;a[f]=mc[c[(c[x>>2]|0)+12>>2]&63](E)|0;a[g]=mc[c[(c[x>>2]|0)+16>>2]&63](E)|0;kc[c[(c[e>>2]|0)+20>>2]&63](y,E);x=h;if((a[x]&1)==0){a[h+1|0]=0;a[x]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}qe(h,0);h=y;c[x+0>>2]=c[h+0>>2];c[x+4>>2]=c[h+4>>2];c[x+8>>2]=c[h+8>>2];c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;me(y);kc[c[(c[e>>2]|0)+24>>2]&63](z,E);e=j;if((a[e]&1)==0){a[j+1|0]=0;a[e]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}qe(j,0);j=z;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;me(z);D=mc[c[(c[B>>2]|0)+36>>2]&63](E)|0;c[m>>2]=D;i=n;return}}function dj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;g=i;h=b;j=a[h]|0;if((j&1)==0){k=(j&255)>>>1}else{k=c[b+4>>2]|0}if((k|0)==0){i=g;return}do{if((d|0)==(e|0)){l=j}else{k=e+ -4|0;if(k>>>0>d>>>0){m=d;n=k}else{l=j;break}do{k=c[m>>2]|0;c[m>>2]=c[n>>2];c[n>>2]=k;m=m+4|0;n=n+ -4|0;}while(m>>>0<n>>>0);l=a[h]|0}}while(0);if((l&1)==0){o=b+1|0;p=(l&255)>>>1}else{o=c[b+8>>2]|0;p=c[b+4>>2]|0}b=e+ -4|0;e=a[o]|0;l=e<<24>>24<1|e<<24>>24==127;a:do{if(b>>>0>d>>>0){h=o+p|0;n=e;m=o;j=d;k=l;while(1){if(!k){if((n<<24>>24|0)!=(c[j>>2]|0)){break}}q=(h-m|0)>1?m+1|0:m;r=j+4|0;s=a[q]|0;t=s<<24>>24<1|s<<24>>24==127;if(r>>>0<b>>>0){n=s;m=q;j=r;k=t}else{u=s;v=t;break a}}c[f>>2]=4;i=g;return}else{u=e;v=l}}while(0);if(v){i=g;return}v=c[b>>2]|0;if(!(u<<24>>24>>>0<v>>>0|(v|0)==0)){i=g;return}c[f>>2]=4;i=g;return}function ej(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function fj(a){a=a|0;i=i;return}function gj(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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,N=0;d=i;i=i+16|0;l=d;m=d+8|0;n=i;i=i+16|0;o=i;i=i+400|0;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+8|0;s=i;i=i+8|0;t=i;i=i+8|0;u=i;i=i+40|0;v=i;i=i+104|0;w=p;c[w>>2]=o;x=p+4|0;c[x>>2]=114;y=o+400|0;Ge(r,h);o=r;z=c[o>>2]|0;if(!((c[57586]|0)==-1)){c[n>>2]=230344;c[n+4>>2]=112;c[n+8>>2]=0;he(230344,n,113)}n=(c[230348>>2]|0)+ -1|0;A=c[z+8>>2]|0;if(!((c[z+12>>2]|0)-A>>2>>>0>n>>>0)){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}z=c[A+(n<<2)>>2]|0;if((z|0)==0){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}B=z;a[s]=0;C=f;c[t>>2]=c[C>>2];f=c[h+4>>2]|0;h=l;n=t;c[h+0>>2]=c[n+0>>2];n=hj(e,l,g,r,f,j,s,B,p,q,y)|0;do{if(n){y=u;sc[c[(c[z>>2]|0)+48>>2]&7](B,230048,230058|0,y)|0;p=v;f=c[q>>2]|0;r=c[w>>2]|0;g=f-r|0;do{if((g|0)>392){l=Bm((g>>2)+2|0)|0;if((l|0)!=0){D=l;E=l;break}Nm()}else{D=0;E=p}}while(0);if((a[s]|0)==0){F=E}else{a[E]=45;F=E+1|0}if(r>>>0<f>>>0){g=u+40|0;l=u;h=F;t=r;while(1){A=c[t>>2]|0;G=y;while(1){H=G+4|0;if((c[G>>2]|0)==(A|0)){I=G;break}if((H|0)==(g|0)){I=g;break}else{G=H}}a[h]=a[230048+(I-l>>2)|0]|0;G=t+4|0;A=h+1|0;if(G>>>0<(c[q>>2]|0)>>>0){h=A;t=G}else{J=A;break}}}else{J=F}a[J]=0;c[m>>2]=k;if((gb(p|0,229984,m|0)|0)!=1){t=Va(8)|0;Vd(t,229992);xb(t|0,227360,11)}if((D|0)==0){break}Cm(D)}}while(0);D=e;e=c[D>>2]|0;do{if((e|0)==0){K=1}else{m=c[e+12>>2]|0;if((m|0)==(c[e+16>>2]|0)){L=mc[c[(c[e>>2]|0)+36>>2]&63](e)|0}else{L=c[m>>2]|0}if((L|0)==-1){c[D>>2]=0;K=1;break}else{K=(c[D>>2]|0)==0;break}}}while(0);L=c[C>>2]|0;do{if((L|0)==0){M=35}else{e=c[L+12>>2]|0;if((e|0)==(c[L+16>>2]|0)){N=mc[c[(c[L>>2]|0)+36>>2]&63](L)|0}else{N=c[e>>2]|0}if((N|0)==-1){c[C>>2]=0;M=35;break}else{if(K){break}else{M=37;break}}}}while(0);if((M|0)==35){if(K){M=37}}if((M|0)==37){c[j>>2]=c[j>>2]|2}c[b>>2]=c[D>>2];Pd(c[o>>2]|0)|0;o=c[w>>2]|0;c[w>>2]=0;if((o|0)==0){i=d;return}jc[c[x>>2]&127](o);i=d;return}\n\n\n\nfunction hj(b,e,f,g,h,j,k,l,m,n,o){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;var 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,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,hc=0,ic=0,kc=0,lc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0;p=i;i=i+408|0;q=p;r=p+400|0;s=r;t=i;i=i+8|0;u=i;i=i+8|0;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+8|0;B=i;i=i+8|0;C=q;c[r>>2]=0;D=v;c[D+0>>2]=0;c[D+4>>2]=0;c[D+8>>2]=0;E=w;c[E+0>>2]=0;c[E+4>>2]=0;c[E+8>>2]=0;F=x;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;G=y;c[G+0>>2]=0;c[G+4>>2]=0;c[G+8>>2]=0;H=z;c[H+0>>2]=0;c[H+4>>2]=0;c[H+8>>2]=0;kj(f,g,s,t,u,v,w,x,y,A);s=m;c[n>>2]=c[s>>2];g=b;b=e;e=r;r=l;f=y+4|0;I=y+8|0;J=x+4|0;K=x+8|0;L=(h&512|0)!=0;h=w+4|0;M=w+8|0;N=z+4|0;O=z+8|0;P=e+3|0;Q=m+4|0;m=v+4|0;R=q+400|0;q=C;S=C;C=o;o=0;T=0;U=114;a:while(1){V=c[g>>2]|0;do{if((V|0)==0){W=1}else{X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){Y=mc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{Y=c[X>>2]|0}if((Y|0)==-1){c[g>>2]=0;W=1;break}else{W=(c[g>>2]|0)==0;break}}}while(0);V=c[b>>2]|0;do{if((V|0)==0){Z=15}else{X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){_=mc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{_=c[X>>2]|0}if((_|0)==-1){c[b>>2]=0;Z=15;break}else{if(W){$=V;break}else{aa=S;ba=q;ca=T;da=U;Z=292;break a}}}}while(0);if((Z|0)==15){Z=0;if(W){aa=S;ba=q;ca=T;da=U;Z=292;break}else{$=0}}b:do{switch(a[e+o|0]|0){case 1:{if((o|0)==3){aa=S;ba=q;ca=T;da=U;Z=292;break a}V=c[g>>2]|0;X=c[V+12>>2]|0;if((X|0)==(c[V+16>>2]|0)){ea=mc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{ea=c[X>>2]|0}if(!(gc[c[(c[r>>2]|0)+12>>2]&31](l,8192,ea)|0)){Z=27;break a}X=c[g>>2]|0;V=X+12|0;fa=c[V>>2]|0;if((fa|0)==(c[X+16>>2]|0)){ga=mc[c[(c[X>>2]|0)+40>>2]&63](X)|0}else{c[V>>2]=fa+4;ga=c[fa>>2]|0}Be(z,ga);Z=28;break};case 0:{Z=28;break};case 3:{fa=a[F]|0;V=(fa&1)==0;if(V){ha=(fa&255)>>>1}else{ha=c[J>>2]|0}X=a[G]|0;ia=(X&1)==0;if(ia){ja=(X&255)>>>1}else{ja=c[f>>2]|0}if((ha|0)==(0-ja|0)){ka=C;la=S;ma=q;na=R;oa=T;pa=U;break b}if(V){qa=(fa&255)>>>1}else{qa=c[J>>2]|0}do{if((qa|0)!=0){if(ia){ra=(X&255)>>>1}else{ra=c[f>>2]|0}if((ra|0)==0){break}sa=c[g>>2]|0;ta=c[sa+12>>2]|0;if((ta|0)==(c[sa+16>>2]|0)){ua=mc[c[(c[sa>>2]|0)+36>>2]&63](sa)|0;va=ua;wa=a[F]|0}else{va=c[ta>>2]|0;wa=fa}ta=c[g>>2]|0;ua=ta+12|0;sa=c[ua>>2]|0;xa=(sa|0)==(c[ta+16>>2]|0);if((va|0)==(c[((wa&1)==0?J:c[K>>2]|0)>>2]|0)){if(xa){mc[c[(c[ta>>2]|0)+40>>2]&63](ta)|0}else{c[ua>>2]=sa+4}ua=a[F]|0;if((ua&1)==0){ya=(ua&255)>>>1}else{ya=c[J>>2]|0}ka=C;la=S;ma=q;na=R;oa=ya>>>0>1?x:T;pa=U;break b}if(xa){za=mc[c[(c[ta>>2]|0)+36>>2]&63](ta)|0}else{za=c[sa>>2]|0}if((za|0)!=(c[((a[G]&1)==0?f:c[I>>2]|0)>>2]|0)){Z=116;break a}sa=c[g>>2]|0;ta=sa+12|0;xa=c[ta>>2]|0;if((xa|0)==(c[sa+16>>2]|0)){mc[c[(c[sa>>2]|0)+40>>2]&63](sa)|0}else{c[ta>>2]=xa+4}a[k]=1;xa=a[G]|0;if((xa&1)==0){Aa=(xa&255)>>>1}else{Aa=c[f>>2]|0}ka=C;la=S;ma=q;na=R;oa=Aa>>>0>1?y:T;pa=U;break b}}while(0);if(V){Ba=(fa&255)>>>1}else{Ba=c[J>>2]|0}ia=c[g>>2]|0;xa=c[ia+12>>2]|0;ta=(xa|0)==(c[ia+16>>2]|0);if((Ba|0)==0){if(ta){sa=mc[c[(c[ia>>2]|0)+36>>2]&63](ia)|0;Ca=sa;Da=a[G]|0}else{Ca=c[xa>>2]|0;Da=X}if((Ca|0)!=(c[((Da&1)==0?f:c[I>>2]|0)>>2]|0)){ka=C;la=S;ma=q;na=R;oa=T;pa=U;break b}sa=c[g>>2]|0;ua=sa+12|0;Ea=c[ua>>2]|0;if((Ea|0)==(c[sa+16>>2]|0)){mc[c[(c[sa>>2]|0)+40>>2]&63](sa)|0}else{c[ua>>2]=Ea+4}a[k]=1;Ea=a[G]|0;if((Ea&1)==0){Fa=(Ea&255)>>>1}else{Fa=c[f>>2]|0}ka=C;la=S;ma=q;na=R;oa=Fa>>>0>1?y:T;pa=U;break b}if(ta){ta=mc[c[(c[ia>>2]|0)+36>>2]&63](ia)|0;Ga=ta;Ha=a[F]|0}else{Ga=c[xa>>2]|0;Ha=fa}if((Ga|0)!=(c[((Ha&1)==0?J:c[K>>2]|0)>>2]|0)){a[k]=1;ka=C;la=S;ma=q;na=R;oa=T;pa=U;break b}xa=c[g>>2]|0;ta=xa+12|0;ia=c[ta>>2]|0;if((ia|0)==(c[xa+16>>2]|0)){mc[c[(c[xa>>2]|0)+40>>2]&63](xa)|0}else{c[ta>>2]=ia+4}ia=a[F]|0;if((ia&1)==0){Ia=(ia&255)>>>1}else{Ia=c[J>>2]|0}ka=C;la=S;ma=q;na=R;oa=Ia>>>0>1?x:T;pa=U;break};case 2:{if(!((T|0)!=0|o>>>0<2)){if((o|0)==2){Ja=(a[P]|0)!=0}else{Ja=0}if(!(L|Ja)){ka=C;la=S;ma=q;na=R;oa=0;pa=U;break b}}ia=a[E]|0;ta=(ia&1)==0?h:c[M>>2]|0;c:do{if((o|0)==0){Ka=$;La=$;Ma=ia;Na=ta}else{if((d[e+(o+ -1)|0]|0)<2){Oa=ia;Pa=ta}else{Ka=$;La=$;Ma=ia;Na=ta;break}while(1){if((Oa&1)==0){Qa=h;Ra=(Oa&255)>>>1}else{Qa=c[M>>2]|0;Ra=c[h>>2]|0}if((Pa|0)==(Qa+(Ra<<2)|0)){Sa=Oa;break}if(!(gc[c[(c[r>>2]|0)+12>>2]&31](l,8192,c[Pa>>2]|0)|0)){Z=129;break}Oa=a[E]|0;Pa=Pa+4|0}if((Z|0)==129){Z=0;Sa=a[E]|0}xa=(Sa&1)==0;Ea=Pa-(xa?h:c[M>>2]|0)>>2;ua=a[H]|0;sa=(ua&1)==0;if(sa){Ta=(ua&255)>>>1}else{Ta=c[N>>2]|0}d:do{if(!(Ea>>>0>Ta>>>0)){if(sa){Ua=N+(((ua&255)>>>1)-Ea<<2)|0;Va=N;Wa=(ua&255)>>>1}else{Xa=c[O>>2]|0;Ya=c[N>>2]|0;Ua=Xa+(Ya-Ea<<2)|0;Va=Xa;Wa=Ya}Ya=Va+(Wa<<2)|0;if((Ua|0)==(Ya|0)){Ka=$;La=$;Ma=Sa;Na=Pa;break c}else{Za=xa?h:c[M>>2]|0;_a=Ua}while(1){if((c[_a>>2]|0)!=(c[Za>>2]|0)){break d}Xa=_a+4|0;if((Xa|0)==(Ya|0)){Ka=$;La=$;Ma=Sa;Na=Pa;break c}Za=Za+4|0;_a=Xa}}}while(0);Ka=$;La=$;Ma=Sa;Na=xa?h:c[M>>2]|0}}while(0);e:while(1){if((Ma&1)==0){$a=h;ab=(Ma&255)>>>1}else{$a=c[M>>2]|0;ab=c[h>>2]|0}if((Na|0)==($a+(ab<<2)|0)){break}ta=c[g>>2]|0;do{if((ta|0)==0){bb=1}else{ia=c[ta+12>>2]|0;if((ia|0)==(c[ta+16>>2]|0)){cb=mc[c[(c[ta>>2]|0)+36>>2]&63](ta)|0}else{cb=c[ia>>2]|0}if((cb|0)==-1){c[g>>2]=0;bb=1;break}else{bb=(c[g>>2]|0)==0;break}}}while(0);do{if((La|0)==0){db=Ka;Z=159}else{ta=c[La+12>>2]|0;if((ta|0)==(c[La+16>>2]|0)){eb=mc[c[(c[La>>2]|0)+36>>2]&63](La)|0}else{eb=c[ta>>2]|0}if((eb|0)==-1){c[b>>2]=0;db=0;Z=159;break}else{if(bb^(Ka|0)==0){fb=Ka;gb=Ka;break}else{break e}}}}while(0);if((Z|0)==159){Z=0;if(bb){break}else{fb=db;gb=0}}ta=c[g>>2]|0;xa=c[ta+12>>2]|0;if((xa|0)==(c[ta+16>>2]|0)){hb=mc[c[(c[ta>>2]|0)+36>>2]&63](ta)|0}else{hb=c[xa>>2]|0}if((hb|0)!=(c[Na>>2]|0)){break}xa=c[g>>2]|0;ta=xa+12|0;ia=c[ta>>2]|0;if((ia|0)==(c[xa+16>>2]|0)){mc[c[(c[xa>>2]|0)+40>>2]&63](xa)|0}else{c[ta>>2]=ia+4}Ka=fb;La=gb;Ma=a[E]|0;Na=Na+4|0}if(!L){ka=C;la=S;ma=q;na=R;oa=T;pa=U;break b}ia=a[E]|0;if((ia&1)==0){ib=h;jb=(ia&255)>>>1}else{ib=c[M>>2]|0;jb=c[h>>2]|0}if((Na|0)==(ib+(jb<<2)|0)){ka=C;la=S;ma=q;na=R;oa=T;pa=U}else{Z=174;break a}break};case 4:{ia=C;ta=S;xa=q;fa=R;X=0;V=U;f:while(1){Ea=c[g>>2]|0;do{if((Ea|0)==0){kb=1}else{ua=c[Ea+12>>2]|0;if((ua|0)==(c[Ea+16>>2]|0)){lb=mc[c[(c[Ea>>2]|0)+36>>2]&63](Ea)|0}else{lb=c[ua>>2]|0}if((lb|0)==-1){c[g>>2]=0;kb=1;break}else{kb=(c[g>>2]|0)==0;break}}}while(0);Ea=c[b>>2]|0;do{if((Ea|0)==0){Z=188}else{ua=c[Ea+12>>2]|0;if((ua|0)==(c[Ea+16>>2]|0)){mb=mc[c[(c[Ea>>2]|0)+36>>2]&63](Ea)|0}else{mb=c[ua>>2]|0}if((mb|0)==-1){c[b>>2]=0;Z=188;break}else{if(kb){break}else{break f}}}}while(0);if((Z|0)==188){Z=0;if(kb){break}}Ea=c[g>>2]|0;ua=c[Ea+12>>2]|0;if((ua|0)==(c[Ea+16>>2]|0)){nb=mc[c[(c[Ea>>2]|0)+36>>2]&63](Ea)|0}else{nb=c[ua>>2]|0}if(gc[c[(c[r>>2]|0)+12>>2]&31](l,2048,nb)|0){ua=c[n>>2]|0;if((ua|0)==(ia|0)){Ea=(c[Q>>2]|0)!=114;sa=c[s>>2]|0;Ya=ia-sa|0;Xa=Ya>>>0<2147483647?Ya<<1:-1;ob=Ya>>2;if(Ea){pb=sa}else{pb=0}sa=Dm(pb,Xa)|0;Ya=sa;if((sa|0)==0){Z=198;break a}do{if(Ea){c[s>>2]=Ya;qb=Ya}else{sa=c[s>>2]|0;c[s>>2]=Ya;if((sa|0)==0){qb=Ya;break}jc[c[Q>>2]&127](sa);qb=c[s>>2]|0}}while(0);c[Q>>2]=115;Ya=qb+(ob<<2)|0;c[n>>2]=Ya;rb=Ya;sb=(c[s>>2]|0)+(Xa>>>2<<2)|0}else{rb=ua;sb=ia}c[n>>2]=rb+4;c[rb>>2]=nb;tb=sb;ub=ta;vb=xa;wb=fa;xb=X+1|0;yb=V}else{Ya=a[D]|0;if((Ya&1)==0){zb=(Ya&255)>>>1}else{zb=c[m>>2]|0}if((zb|0)==0|(X|0)==0){break}if((nb|0)!=(c[u>>2]|0)){break}if((xa|0)==(fa|0)){Ya=xa-ta|0;Ea=Ya>>>0<2147483647?Ya<<1:-1;if((V|0)!=114){Ab=ta}else{Ab=0}sa=Dm(Ab,Ea)|0;Bb=sa;if((sa|0)==0){Z=214;break a}Cb=Bb;Db=Bb+(Ya>>2<<2)|0;Eb=Bb+(Ea>>>2<<2)|0;Fb=115}else{Cb=ta;Db=xa;Eb=fa;Fb=V}c[Db>>2]=X;tb=ia;ub=Cb;vb=Db+4|0;wb=Eb;xb=0;yb=Fb}Ea=c[g>>2]|0;Bb=Ea+12|0;Ya=c[Bb>>2]|0;if((Ya|0)==(c[Ea+16>>2]|0)){mc[c[(c[Ea>>2]|0)+40>>2]&63](Ea)|0;ia=tb;ta=ub;xa=vb;fa=wb;X=xb;V=yb;continue}else{c[Bb>>2]=Ya+4;ia=tb;ta=ub;xa=vb;fa=wb;X=xb;V=yb;continue}}if((ta|0)==(xa|0)|(X|0)==0){Gb=ta;Hb=xa;Ib=fa;Jb=V}else{if((xa|0)==(fa|0)){Ya=xa-ta|0;Bb=Ya>>>0<2147483647?Ya<<1:-1;if((V|0)!=114){Kb=ta}else{Kb=0}Ea=Dm(Kb,Bb)|0;sa=Ea;if((Ea|0)==0){Z=225;break a}Lb=sa;Mb=sa+(Ya>>2<<2)|0;Nb=sa+(Bb>>>2<<2)|0;Ob=115}else{Lb=ta;Mb=xa;Nb=fa;Ob=V}c[Mb>>2]=X;Gb=Lb;Hb=Mb+4|0;Ib=Nb;Jb=Ob}Bb=c[A>>2]|0;if((Bb|0)>0){sa=c[g>>2]|0;do{if((sa|0)==0){Pb=1}else{Ya=c[sa+12>>2]|0;if((Ya|0)==(c[sa+16>>2]|0)){Qb=mc[c[(c[sa>>2]|0)+36>>2]&63](sa)|0}else{Qb=c[Ya>>2]|0}if((Qb|0)==-1){c[g>>2]=0;Pb=1;break}else{Pb=(c[g>>2]|0)==0;break}}}while(0);sa=c[b>>2]|0;do{if((sa|0)==0){Z=242}else{X=c[sa+12>>2]|0;if((X|0)==(c[sa+16>>2]|0)){Rb=mc[c[(c[sa>>2]|0)+36>>2]&63](sa)|0}else{Rb=c[X>>2]|0}if((Rb|0)==-1){c[b>>2]=0;Z=242;break}else{if(Pb){Sb=sa;break}else{Z=248;break a}}}}while(0);if((Z|0)==242){Z=0;if(Pb){Z=248;break a}else{Sb=0}}sa=c[g>>2]|0;X=c[sa+12>>2]|0;if((X|0)==(c[sa+16>>2]|0)){Tb=mc[c[(c[sa>>2]|0)+36>>2]&63](sa)|0}else{Tb=c[X>>2]|0}if((Tb|0)!=(c[t>>2]|0)){Z=248;break a}X=c[g>>2]|0;sa=X+12|0;V=c[sa>>2]|0;if((V|0)==(c[X+16>>2]|0)){mc[c[(c[X>>2]|0)+40>>2]&63](X)|0;Ub=Sb;Vb=Bb;Wb=Sb;Xb=ia}else{c[sa>>2]=V+4;Ub=Sb;Vb=Bb;Wb=Sb;Xb=ia}while(1){V=c[g>>2]|0;do{if((V|0)==0){Yb=1}else{sa=c[V+12>>2]|0;if((sa|0)==(c[V+16>>2]|0)){Zb=mc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{Zb=c[sa>>2]|0}if((Zb|0)==-1){c[g>>2]=0;Yb=1;break}else{Yb=(c[g>>2]|0)==0;break}}}while(0);do{if((Wb|0)==0){_b=Ub;Z=265}else{V=c[Wb+12>>2]|0;if((V|0)==(c[Wb+16>>2]|0)){$b=mc[c[(c[Wb>>2]|0)+36>>2]&63](Wb)|0}else{$b=c[V>>2]|0}if(($b|0)==-1){c[b>>2]=0;_b=0;Z=265;break}else{if(Yb^(Ub|0)==0){ac=Ub;bc=Ub;break}else{Z=271;break a}}}}while(0);if((Z|0)==265){Z=0;if(Yb){Z=271;break a}else{ac=_b;bc=0}}V=c[g>>2]|0;ua=c[V+12>>2]|0;if((ua|0)==(c[V+16>>2]|0)){cc=mc[c[(c[V>>2]|0)+36>>2]&63](V)|0}else{cc=c[ua>>2]|0}if(!(gc[c[(c[r>>2]|0)+12>>2]&31](l,2048,cc)|0)){Z=271;break a}ua=c[n>>2]|0;if((ua|0)==(Xb|0)){V=(c[Q>>2]|0)!=114;Xa=c[s>>2]|0;ob=Xb-Xa|0;sa=ob>>>0<2147483647?ob<<1:-1;X=ob>>2;if(V){dc=Xa}else{dc=0}Xa=Dm(dc,sa)|0;ob=Xa;if((Xa|0)==0){Z=276;break a}do{if(V){c[s>>2]=ob;ec=ob}else{Xa=c[s>>2]|0;c[s>>2]=ob;if((Xa|0)==0){ec=ob;break}jc[c[Q>>2]&127](Xa);ec=c[s>>2]|0}}while(0);c[Q>>2]=115;ob=ec+(X<<2)|0;c[n>>2]=ob;fc=ob;hc=(c[s>>2]|0)+(sa>>>2<<2)|0}else{fc=ua;hc=Xb}ob=c[g>>2]|0;V=c[ob+12>>2]|0;if((V|0)==(c[ob+16>>2]|0)){Xa=mc[c[(c[ob>>2]|0)+36>>2]&63](ob)|0;ic=Xa;kc=c[n>>2]|0}else{ic=c[V>>2]|0;kc=fc}c[n>>2]=kc+4;c[kc>>2]=ic;V=Vb+ -1|0;c[A>>2]=V;Xa=c[g>>2]|0;ob=Xa+12|0;fa=c[ob>>2]|0;if((fa|0)==(c[Xa+16>>2]|0)){mc[c[(c[Xa>>2]|0)+40>>2]&63](Xa)|0}else{c[ob>>2]=fa+4}if((V|0)>0){Ub=ac;Vb=V;Wb=bc;Xb=hc}else{lc=hc;break}}}else{lc=ia}if((c[n>>2]|0)==(c[s>>2]|0)){Z=290;break a}else{ka=lc;la=Gb;ma=Hb;na=Ib;oa=T;pa=Jb}break};default:{ka=C;la=S;ma=q;na=R;oa=T;pa=U}}}while(0);g:do{if((Z|0)==28){Z=0;if((o|0)==3){aa=S;ba=q;ca=T;da=U;Z=292;break a}else{nc=$;oc=$}while(1){Bb=c[g>>2]|0;do{if((Bb|0)==0){pc=1}else{V=c[Bb+12>>2]|0;if((V|0)==(c[Bb+16>>2]|0)){qc=mc[c[(c[Bb>>2]|0)+36>>2]&63](Bb)|0}else{qc=c[V>>2]|0}if((qc|0)==-1){c[g>>2]=0;pc=1;break}else{pc=(c[g>>2]|0)==0;break}}}while(0);do{if((oc|0)==0){rc=nc;Z=42}else{Bb=c[oc+12>>2]|0;if((Bb|0)==(c[oc+16>>2]|0)){sc=mc[c[(c[oc>>2]|0)+36>>2]&63](oc)|0}else{sc=c[Bb>>2]|0}if((sc|0)==-1){c[b>>2]=0;rc=0;Z=42;break}else{if(pc^(nc|0)==0){tc=nc;uc=nc;break}else{ka=C;la=S;ma=q;na=R;oa=T;pa=U;break g}}}}while(0);if((Z|0)==42){Z=0;if(pc){ka=C;la=S;ma=q;na=R;oa=T;pa=U;break g}else{tc=rc;uc=0}}Bb=c[g>>2]|0;ua=c[Bb+12>>2]|0;if((ua|0)==(c[Bb+16>>2]|0)){vc=mc[c[(c[Bb>>2]|0)+36>>2]&63](Bb)|0}else{vc=c[ua>>2]|0}if(!(gc[c[(c[r>>2]|0)+12>>2]&31](l,8192,vc)|0)){ka=C;la=S;ma=q;na=R;oa=T;pa=U;break g}ua=c[g>>2]|0;Bb=ua+12|0;sa=c[Bb>>2]|0;if((sa|0)==(c[ua+16>>2]|0)){wc=mc[c[(c[ua>>2]|0)+40>>2]&63](ua)|0}else{c[Bb>>2]=sa+4;wc=c[sa>>2]|0}Be(z,wc);nc=tc;oc=uc}}}while(0);ia=o+1|0;if(ia>>>0<4){R=na;q=ma;S=la;C=ka;o=ia;T=oa;U=pa}else{aa=la;ba=ma;ca=oa;da=pa;Z=292;break}}h:do{if((Z|0)==27){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==116){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==174){c[j>>2]=c[j>>2]|4;xc=0;yc=S;zc=U}else if((Z|0)==198){Nm()}else if((Z|0)==214){Nm()}else if((Z|0)==225){Nm()}else if((Z|0)==248){c[j>>2]=c[j>>2]|4;xc=0;yc=Gb;zc=Jb}else if((Z|0)==271){c[j>>2]=c[j>>2]|4;xc=0;yc=Gb;zc=Jb}else if((Z|0)==276){Nm()}else if((Z|0)==290){c[j>>2]=c[j>>2]|4;xc=0;yc=Gb;zc=Jb}else if((Z|0)==292){i:do{if((ca|0)!=0){pa=ca;oa=ca+4|0;ma=ca+8|0;la=1;j:while(1){T=a[pa]|0;if((T&1)==0){Ac=(T&255)>>>1}else{Ac=c[oa>>2]|0}if(!(la>>>0<Ac>>>0)){break i}T=c[g>>2]|0;do{if((T|0)==0){Bc=1}else{o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Cc=mc[c[(c[T>>2]|0)+36>>2]&63](T)|0}else{Cc=c[o>>2]|0}if((Cc|0)==-1){c[g>>2]=0;Bc=1;break}else{Bc=(c[g>>2]|0)==0;break}}}while(0);T=c[b>>2]|0;do{if((T|0)==0){Z=311}else{o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Dc=mc[c[(c[T>>2]|0)+36>>2]&63](T)|0}else{Dc=c[o>>2]|0}if((Dc|0)==-1){c[b>>2]=0;Z=311;break}else{if(Bc){break}else{break j}}}}while(0);if((Z|0)==311){Z=0;if(Bc){break}}T=c[g>>2]|0;o=c[T+12>>2]|0;if((o|0)==(c[T+16>>2]|0)){Ec=mc[c[(c[T>>2]|0)+36>>2]&63](T)|0}else{Ec=c[o>>2]|0}if((a[pa]&1)==0){Fc=oa}else{Fc=c[ma>>2]|0}if((Ec|0)!=(c[Fc+(la<<2)>>2]|0)){break}o=la+1|0;T=c[g>>2]|0;ka=T+12|0;C=c[ka>>2]|0;if((C|0)==(c[T+16>>2]|0)){mc[c[(c[T>>2]|0)+40>>2]&63](T)|0;la=o;continue}else{c[ka>>2]=C+4;la=o;continue}}c[j>>2]=c[j>>2]|4;xc=0;yc=aa;zc=da;break h}}while(0);if((aa|0)==(ba|0)){xc=1;yc=ba;zc=da;break}c[B>>2]=0;dj(v,aa,ba,B);if((c[B>>2]|0)==0){xc=1;yc=aa;zc=da;break}c[j>>2]=c[j>>2]|4;xc=0;yc=aa;zc=da}}while(0);xe(z);xe(y);xe(x);xe(w);me(v);if((yc|0)==0){i=p;return xc|0}jc[zc&127](yc);i=p;return xc|0}function ij(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;d=i;i=i+464|0;l=d;m=d+8|0;n=d+24|0;o=d+424|0;p=d+432|0;q=d+440|0;r=d+448|0;s=d+456|0;t=o;c[t>>2]=n;u=o+4|0;c[u>>2]=114;v=n+400|0;Ge(q,h);n=q;w=c[n>>2]|0;if(!((c[57586]|0)==-1)){c[m>>2]=230344;c[m+4>>2]=112;c[m+8>>2]=0;he(230344,m,113)}m=(c[230348>>2]|0)+ -1|0;x=c[w+8>>2]|0;if(!((c[w+12>>2]|0)-x>>2>>>0>m>>>0)){y=Va(4)|0;z=y;gm(z);xb(y|0,238312,101)}w=c[x+(m<<2)>>2]|0;if((w|0)==0){y=Va(4)|0;z=y;gm(z);xb(y|0,238312,101)}y=w;a[r]=0;z=f;f=c[z>>2]|0;c[s>>2]=f;m=c[h+4>>2]|0;h=l;x=s;c[h+0>>2]=c[x+0>>2];x=hj(e,l,g,q,m,j,r,y,o,p,v)|0;if(x){x=k;if((a[x]&1)==0){c[k+4>>2]=0;a[x]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}x=w;if((a[r]|0)!=0){Be(k,vc[c[(c[x>>2]|0)+44>>2]&15](y,45)|0)}r=vc[c[(c[x>>2]|0)+44>>2]&15](y,48)|0;y=c[t>>2]|0;x=c[p>>2]|0;p=x+ -4|0;a:do{if(y>>>0<p>>>0){w=y;while(1){v=w+4|0;if((c[w>>2]|0)!=(r|0)){A=w;break a}if(v>>>0<p>>>0){w=v}else{A=v;break}}}else{A=y}}while(0);jj(k,A,x)|0}x=e;e=c[x>>2]|0;do{if((e|0)==0){B=1}else{A=c[e+12>>2]|0;if((A|0)==(c[e+16>>2]|0)){C=mc[c[(c[e>>2]|0)+36>>2]&63](e)|0}else{C=c[A>>2]|0}if((C|0)==-1){c[x>>2]=0;B=1;break}else{B=(c[x>>2]|0)==0;break}}}while(0);do{if((f|0)==0){D=29}else{C=c[f+12>>2]|0;if((C|0)==(c[f+16>>2]|0)){E=mc[c[(c[f>>2]|0)+36>>2]&63](f)|0}else{E=c[C>>2]|0}if((E|0)==-1){c[z>>2]=0;D=29;break}else{if(B){break}else{D=31;break}}}}while(0);if((D|0)==29){if(B){D=31}}if((D|0)==31){c[j>>2]=c[j>>2]|2}c[b>>2]=c[x>>2];Pd(c[n>>2]|0)|0;n=c[t>>2]|0;c[t>>2]=0;if((n|0)==0){i=d;return}jc[c[u>>2]&127](n);i=d;return}function jj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;g=b;h=d;j=a[g]|0;if((j&1)==0){k=(j&255)>>>1;l=j;m=1}else{j=c[b>>2]|0;k=c[b+4>>2]|0;l=j&255;m=(j&-2)+ -1|0}j=e-h>>2;if((j|0)==0){i=f;return b|0}if((m-k|0)>>>0<j>>>0){De(b,m,k+j-m|0,k,k,0,0);n=a[g]|0}else{n=l}if((n&1)==0){o=b+4|0}else{o=c[b+8>>2]|0}n=o+(k<<2)|0;if((d|0)==(e|0)){p=n}else{l=k+((e+ -4+(0-h)|0)>>>2)+1|0;h=d;d=n;while(1){c[d>>2]=c[h>>2];n=h+4|0;if((n|0)==(e|0)){break}else{d=d+4|0;h=n}}p=o+(l<<2)|0}c[p>>2]=0;p=k+j|0;if((a[g]&1)==0){a[g]=p<<1;i=f;return b|0}else{c[b+4>>2]=p;i=f;return b|0}return 0}function kj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;i=i+176|0;o=n;p=n+16|0;q=n+32|0;r=n+40|0;s=n+56|0;t=n+72|0;u=n+88|0;v=n+104|0;w=n+112|0;x=n+128|0;y=n+144|0;z=n+160|0;if(b){b=c[d>>2]|0;if(!((c[57480]|0)==-1)){c[p>>2]=229920;c[p+4>>2]=112;c[p+8>>2]=0;he(229920,p,113)}p=(c[229924>>2]|0)+ -1|0;A=c[b+8>>2]|0;if(!((c[b+12>>2]|0)-A>>2>>>0>p>>>0)){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}b=c[A+(p<<2)>>2]|0;if((b|0)==0){B=Va(4)|0;C=B;gm(C);xb(B|0,238312,101)}B=b;kc[c[(c[b>>2]|0)+44>>2]&63](q,B);C=e;p=c[q>>2]|0;a[C]=p;a[C+1|0]=p>>8;a[C+2|0]=p>>16;a[C+3|0]=p>>24;p=b;kc[c[(c[p>>2]|0)+32>>2]&63](r,B);C=l;if((a[C]&1)==0){c[l+4>>2]=0;a[C]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ae(l,0);q=r;c[C+0>>2]=c[q+0>>2];c[C+4>>2]=c[q+4>>2];c[C+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;xe(r);kc[c[(c[p>>2]|0)+28>>2]&63](s,B);r=k;if((a[r]&1)==0){c[k+4>>2]=0;a[r]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ae(k,0);q=s;c[r+0>>2]=c[q+0>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;xe(s);s=b;c[f>>2]=mc[c[(c[s>>2]|0)+12>>2]&63](B)|0;c[g>>2]=mc[c[(c[s>>2]|0)+16>>2]&63](B)|0;kc[c[(c[b>>2]|0)+20>>2]&63](t,B);b=h;if((a[b]&1)==0){a[h+1|0]=0;a[b]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}qe(h,0);q=t;c[b+0>>2]=c[q+0>>2];c[b+4>>2]=c[q+4>>2];c[b+8>>2]=c[q+8>>2];c[q+0>>2]=0;c[q+4>>2]=0;c[q+8>>2]=0;me(t);kc[c[(c[p>>2]|0)+24>>2]&63](u,B);p=j;if((a[p]&1)==0){c[j+4>>2]=0;a[p]=0}else{c[c[j+8>>2]>>2]=0;c[j+4>>2]=0}Ae(j,0);t=u;c[p+0>>2]=c[t+0>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;xe(u);D=mc[c[(c[s>>2]|0)+36>>2]&63](B)|0;c[m>>2]=D;i=n;return}else{B=c[d>>2]|0;if(!((c[57464]|0)==-1)){c[o>>2]=229856;c[o+4>>2]=112;c[o+8>>2]=0;he(229856,o,113)}o=(c[229860>>2]|0)+ -1|0;d=c[B+8>>2]|0;if(!((c[B+12>>2]|0)-d>>2>>>0>o>>>0)){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}B=c[d+(o<<2)>>2]|0;if((B|0)==0){E=Va(4)|0;F=E;gm(F);xb(E|0,238312,101)}E=B;kc[c[(c[B>>2]|0)+44>>2]&63](v,E);F=e;e=c[v>>2]|0;a[F]=e;a[F+1|0]=e>>8;a[F+2|0]=e>>16;a[F+3|0]=e>>24;e=B;kc[c[(c[e>>2]|0)+32>>2]&63](w,E);F=l;if((a[F]&1)==0){c[l+4>>2]=0;a[F]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ae(l,0);l=w;c[F+0>>2]=c[l+0>>2];c[F+4>>2]=c[l+4>>2];c[F+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;xe(w);kc[c[(c[e>>2]|0)+28>>2]&63](x,E);w=k;if((a[w]&1)==0){c[k+4>>2]=0;a[w]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ae(k,0);k=x;c[w+0>>2]=c[k+0>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;xe(x);x=B;c[f>>2]=mc[c[(c[x>>2]|0)+12>>2]&63](E)|0;c[g>>2]=mc[c[(c[x>>2]|0)+16>>2]&63](E)|0;kc[c[(c[B>>2]|0)+20>>2]&63](y,E);B=h;if((a[B]&1)==0){a[h+1|0]=0;a[B]=0}else{a[c[h+8>>2]|0]=0;c[h+4>>2]=0}qe(h,0);h=y;c[B+0>>2]=c[h+0>>2];c[B+4>>2]=c[h+4>>2];c[B+8>>2]=c[h+8>>2];c[h+0>>2]=0;c[h+4>>2]=0;c[h+8>>2]=0;me(y);kc[c[(c[e>>2]|0)+24>>2]&63](z,E);e=j;if((a[e]&1)==0){c[j+4>>2]=0;a[e]=0}else{c[c[j+8>>2]>>2]=0;c[j+4>>2]=0}Ae(j,0);j=z;c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;xe(z);D=mc[c[(c[x>>2]|0)+36>>2]&63](E)|0;c[m>>2]=D;i=n;return}}function lj(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function mj(a){a=a|0;i=i;return}function nj(b,d,e,f,g,j,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;l=+l;var 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;d=i;i=i+16|0;m=d;n=d+8|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+104|0;r=i;i=i+8|0;s=i;i=i+104|0;t=i;i=i+8|0;u=i;i=i+8|0;v=u;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+104|0;D=i;i=i+8|0;E=i;i=i+8|0;F=i;i=i+8|0;G=q;c[r>>2]=G;q=s;s=o;h[k>>3]=l;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];s=lb(G|0,100,230104,o|0)|0;do{if(s>>>0>99){do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);o=c[57560]|0;G=n;h[k>>3]=l;c[G>>2]=c[k>>2];c[G+4>>2]=c[k+4>>2];G=ih(r,o,230104,n)|0;o=c[r>>2]|0;if((o|0)==0){Nm()}H=Bm(G)|0;if((H|0)!=0){I=o;J=H;K=H;L=G;break}Nm()}else{I=0;J=0;K=q;L=s}}while(0);Ge(t,g);s=t;q=c[s>>2]|0;if(!((c[57588]|0)==-1)){c[p>>2]=230352;c[p+4>>2]=112;c[p+8>>2]=0;he(230352,p,113)}p=(c[230356>>2]|0)+ -1|0;n=c[q+8>>2]|0;if(!((c[q+12>>2]|0)-n>>2>>>0>p>>>0)){M=Va(4)|0;N=M;gm(N);xb(M|0,238312,101)}q=c[n+(p<<2)>>2]|0;if((q|0)==0){M=Va(4)|0;N=M;gm(N);xb(M|0,238312,101)}M=q;N=c[r>>2]|0;sc[c[(c[q>>2]|0)+32>>2]&7](M,N,N+L|0,K)|0;if((L|0)==0){O=0}else{O=(a[c[r>>2]|0]|0)==45}c[u>>2]=0;u=y;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;u=z;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;r=A;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;oj(f,O,t,v,w,x,y,z,A,B);t=C;C=c[B>>2]|0;if((L|0)>(C|0)){B=a[r]|0;if((B&1)==0){P=(B&255)>>>1}else{P=c[A+4>>2]|0}B=a[u]|0;if((B&1)==0){Q=(B&255)>>>1}else{Q=c[z+4>>2]|0}R=P+(L-C<<1|1)+Q|0}else{Q=a[r]|0;if((Q&1)==0){S=(Q&255)>>>1}else{S=c[A+4>>2]|0}Q=a[u]|0;if((Q&1)==0){T=(Q&255)>>>1}else{T=c[z+4>>2]|0}R=S+2+T|0}T=R+C|0;do{if(T>>>0>100){R=Bm(T)|0;if((R|0)!=0){U=R;V=R;break}Nm()}else{U=0;V=t}}while(0);pj(V,D,E,c[g+4>>2]|0,K,K+L|0,M,O,v,a[w]|0,a[x]|0,y,z,A,C);c[F>>2]=c[e>>2];e=c[D>>2]|0;D=c[E>>2]|0;E=m;C=F;c[E+0>>2]=c[C+0>>2];gd(b,m,V,e,D,g,j);if((U|0)!=0){Cm(U)}me(A);me(z);me(y);Pd(c[s>>2]|0)|0;if((J|0)!=0){Cm(J)}if((I|0)==0){i=d;return}Cm(I);i=d;return}function oj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,K=0,L=0;n=i;i=i+40|0;o=n;p=n+16|0;q=n+32|0;r=q;s=i;i=i+16|0;t=i;i=i+8|0;u=t;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+8|0;z=y;A=i;i=i+16|0;B=i;i=i+8|0;C=B;D=i;i=i+16|0;E=i;i=i+16|0;F=i;i=i+16|0;G=c[e>>2]|0;if(b){if(!((c[57448]|0)==-1)){c[p>>2]=229792;c[p+4>>2]=112;c[p+8>>2]=0;he(229792,p,113)}p=(c[229796>>2]|0)+ -1|0;b=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-b>>2>>>0>p>>>0)){H=Va(4)|0;I=H;gm(I);xb(H|0,238312,101)}e=c[b+(p<<2)>>2]|0;if((e|0)==0){H=Va(4)|0;I=H;gm(I);xb(H|0,238312,101)}H=e;I=c[e>>2]|0;if(d){kc[c[I+44>>2]&63](r,H);r=f;p=c[q>>2]|0;a[r]=p;a[r+1|0]=p>>8;a[r+2|0]=p>>16;a[r+3|0]=p>>24;kc[c[(c[e>>2]|0)+32>>2]&63](s,H);p=l;if((a[p]&1)==0){a[l+1|0]=0;a[p]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}qe(l,0);r=s;c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;me(s)}else{kc[c[I+40>>2]&63](u,H);u=f;I=c[t>>2]|0;a[u]=I;a[u+1|0]=I>>8;a[u+2|0]=I>>16;a[u+3|0]=I>>24;kc[c[(c[e>>2]|0)+28>>2]&63](v,H);I=l;if((a[I]&1)==0){a[l+1|0]=0;a[I]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}qe(l,0);u=v;c[I+0>>2]=c[u+0>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;me(v)}v=e;a[g]=mc[c[(c[v>>2]|0)+12>>2]&63](H)|0;a[h]=mc[c[(c[v>>2]|0)+16>>2]&63](H)|0;v=e;kc[c[(c[v>>2]|0)+20>>2]&63](w,H);u=j;if((a[u]&1)==0){a[j+1|0]=0;a[u]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}qe(j,0);I=w;c[u+0>>2]=c[I+0>>2];c[u+4>>2]=c[I+4>>2];c[u+8>>2]=c[I+8>>2];c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;me(w);kc[c[(c[v>>2]|0)+24>>2]&63](x,H);v=k;if((a[v]&1)==0){a[k+1|0]=0;a[v]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}qe(k,0);w=x;c[v+0>>2]=c[w+0>>2];c[v+4>>2]=c[w+4>>2];c[v+8>>2]=c[w+8>>2];c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;me(x);J=mc[c[(c[e>>2]|0)+36>>2]&63](H)|0;c[m>>2]=J;i=n;return}else{if(!((c[57432]|0)==-1)){c[o>>2]=229728;c[o+4>>2]=112;c[o+8>>2]=0;he(229728,o,113)}o=(c[229732>>2]|0)+ -1|0;H=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-H>>2>>>0>o>>>0)){K=Va(4)|0;L=K;gm(L);xb(K|0,238312,101)}G=c[H+(o<<2)>>2]|0;if((G|0)==0){K=Va(4)|0;L=K;gm(L);xb(K|0,238312,101)}K=G;L=c[G>>2]|0;if(d){kc[c[L+44>>2]&63](z,K);z=f;d=c[y>>2]|0;a[z]=d;a[z+1|0]=d>>8;a[z+2|0]=d>>16;a[z+3|0]=d>>24;kc[c[(c[G>>2]|0)+32>>2]&63](A,K);d=l;if((a[d]&1)==0){a[l+1|0]=0;a[d]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}qe(l,0);z=A;c[d+0>>2]=c[z+0>>2];c[d+4>>2]=c[z+4>>2];c[d+8>>2]=c[z+8>>2];c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;me(A)}else{kc[c[L+40>>2]&63](C,K);C=f;f=c[B>>2]|0;a[C]=f;a[C+1|0]=f>>8;a[C+2|0]=f>>16;a[C+3|0]=f>>24;kc[c[(c[G>>2]|0)+28>>2]&63](D,K);f=l;if((a[f]&1)==0){a[l+1|0]=0;a[f]=0}else{a[c[l+8>>2]|0]=0;c[l+4>>2]=0}qe(l,0);l=D;c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;me(D)}D=G;a[g]=mc[c[(c[D>>2]|0)+12>>2]&63](K)|0;a[h]=mc[c[(c[D>>2]|0)+16>>2]&63](K)|0;D=G;kc[c[(c[D>>2]|0)+20>>2]&63](E,K);h=j;if((a[h]&1)==0){a[j+1|0]=0;a[h]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}qe(j,0);j=E;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;me(E);kc[c[(c[D>>2]|0)+24>>2]&63](F,K);D=k;if((a[D]&1)==0){a[k+1|0]=0;a[D]=0}else{a[c[k+8>>2]|0]=0;c[k+4>>2]=0}qe(k,0);k=F;c[D+0>>2]=c[k+0>>2];c[D+4>>2]=c[k+4>>2];c[D+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;me(F);J=mc[c[(c[G>>2]|0)+36>>2]&63](K)|0;c[m>>2]=J;i=n;return}}function pj(d,e,f,g,h,j,k,l,m,n,o,p,q,r,s){d=d|0;e=e|0;f=f|0;g=g|0;h=h|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;r=r|0;s=s|0;var 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;t=i;c[f>>2]=d;u=k;v=r;w=r+1|0;x=r+8|0;y=r+4|0;r=q;z=(g&512|0)==0;A=q+1|0;B=q+8|0;C=q+4|0;q=(s|0)>0;D=p;E=p+1|0;F=p+8|0;G=p+4|0;p=k+8|0;H=0-s|0;I=h;h=0;while(1){a:do{switch(a[m+h|0]|0){case 1:{c[e>>2]=c[f>>2];J=vc[c[(c[u>>2]|0)+28>>2]&15](k,32)|0;K=c[f>>2]|0;c[f>>2]=K+1;a[K]=J;L=I;break};case 4:{J=c[f>>2]|0;K=l?I+1|0:I;b:do{if(K>>>0<j>>>0){M=K;while(1){N=a[M]|0;if(!(N<<24>>24>-1)){O=M;break b}P=M+1|0;if((b[(c[p>>2]|0)+(N<<24>>24<<1)>>1]&2048)==0){O=M;break b}if(P>>>0<j>>>0){M=P}else{O=P;break}}}else{O=K}}while(0);M=O;if(q){if(O>>>0>K>>>0){P=K+(0-M)|0;M=P>>>0<H>>>0?H:P;P=M+s|0;N=J;Q=O;R=s;while(1){S=Q+ -1|0;T=a[S]|0;c[f>>2]=N+1;a[N]=T;T=R+ -1|0;U=(T|0)>0;if(!(S>>>0>K>>>0&U)){break}N=c[f>>2]|0;R=T;Q=S}Q=O+M|0;if(U){V=Q;W=P;X=32}else{Y=0;Z=Q;_=P}}else{V=O;W=s;X=32}if((X|0)==32){X=0;Y=vc[c[(c[u>>2]|0)+28>>2]&15](k,48)|0;Z=V;_=W}Q=c[f>>2]|0;c[f>>2]=Q+1;if((_|0)>0){R=Q;N=_;while(1){a[R]=Y;S=N+ -1|0;T=c[f>>2]|0;c[f>>2]=T+1;if((S|0)>0){N=S;R=T}else{$=T;break}}}else{$=Q}a[$]=n;aa=Z}else{aa=O}if((aa|0)==(K|0)){R=vc[c[(c[u>>2]|0)+28>>2]&15](k,48)|0;N=c[f>>2]|0;c[f>>2]=N+1;a[N]=R}else{R=a[D]|0;N=(R&1)==0;if(N){ba=(R&255)>>>1}else{ba=c[G>>2]|0}if((ba|0)==0){ca=aa;da=-1;ea=0;fa=0}else{if(N){ga=E}else{ga=c[F>>2]|0}ca=aa;da=a[ga]|0;ea=0;fa=0}while(1){do{if((fa|0)==(da|0)){N=c[f>>2]|0;c[f>>2]=N+1;a[N]=o;N=ea+1|0;R=a[D]|0;P=(R&1)==0;if(P){ha=(R&255)>>>1}else{ha=c[G>>2]|0}if(!(N>>>0<ha>>>0)){ia=da;ja=N;ka=0;break}if(P){la=E}else{la=c[F>>2]|0}if((a[la+N|0]|0)==127){ia=-1;ja=N;ka=0;break}if(P){ma=E}else{ma=c[F>>2]|0}ia=a[ma+N|0]|0;ja=N;ka=0}else{ia=da;ja=ea;ka=fa}}while(0);N=ca+ -1|0;P=a[N]|0;R=c[f>>2]|0;c[f>>2]=R+1;a[R]=P;if((N|0)==(K|0)){break}else{ca=N;da=ia;ea=ja;fa=ka+1|0}}}Q=c[f>>2]|0;if((J|0)==(Q|0)){L=K;break a}N=Q+ -1|0;if(N>>>0>J>>>0){na=J;oa=N}else{L=K;break a}while(1){N=a[na]|0;a[na]=a[oa]|0;a[oa]=N;N=na+1|0;Q=oa+ -1|0;if(N>>>0<Q>>>0){oa=Q;na=N}else{L=K;break}}break};case 3:{K=a[v]|0;J=(K&1)==0;if(J){pa=(K&255)>>>1}else{pa=c[y>>2]|0}if((pa|0)==0){L=I;break a}if(J){qa=w}else{qa=c[x>>2]|0}J=a[qa]|0;K=c[f>>2]|0;c[f>>2]=K+1;a[K]=J;L=I;break};case 0:{c[e>>2]=c[f>>2];L=I;break};case 2:{J=a[r]|0;K=(J&1)==0;if(K){ra=(J&255)>>>1}else{ra=c[C>>2]|0}if((ra|0)==0|z){L=I;break a}if(K){sa=A;ta=(J&255)>>>1}else{sa=c[B>>2]|0;ta=c[C>>2]|0}J=sa+ta|0;K=c[f>>2]|0;if((sa|0)==(J|0)){ua=K}else{N=K;K=sa;while(1){a[N]=a[K]|0;Q=K+1|0;P=N+1|0;if((Q|0)==(J|0)){ua=P;break}else{K=Q;N=P}}}c[f>>2]=ua;L=I;break};default:{L=I}}}while(0);N=h+1|0;if((N|0)==4){break}else{I=L;h=N}}h=a[v]|0;v=(h&1)==0;if(v){va=(h&255)>>>1}else{va=c[y>>2]|0}if(va>>>0>1){if(v){wa=w;xa=(h&255)>>>1}else{wa=c[x>>2]|0;xa=c[y>>2]|0}y=wa+1|0;x=wa+xa|0;xa=c[f>>2]|0;if((y|0)==(x|0)){ya=xa}else{wa=xa;xa=y;while(1){a[wa]=a[xa]|0;y=xa+1|0;h=wa+1|0;if((y|0)==(x|0)){ya=h;break}else{xa=y;wa=h}}}c[f>>2]=ya}ya=g&176;if((ya|0)==32){c[e>>2]=c[f>>2];i=t;return}else if((ya|0)==16){i=t;return}else{c[e>>2]=d;i=t;return}}function qj(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+40|0;k=d;l=d+8|0;m=d+24|0;n=d+32|0;o=n;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+16|0;s=i;i=i+16|0;t=i;i=i+16|0;u=i;i=i+8|0;v=i;i=i+104|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;Ge(m,g);z=m;A=c[z>>2]|0;if(!((c[57588]|0)==-1)){c[l>>2]=230352;c[l+4>>2]=112;c[l+8>>2]=0;he(230352,l,113)}l=(c[230356>>2]|0)+ -1|0;B=c[A+8>>2]|0;if(!((c[A+12>>2]|0)-B>>2>>>0>l>>>0)){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}A=c[B+(l<<2)>>2]|0;if((A|0)==0){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}C=A;D=j;l=a[D]|0;B=(l&1)==0;if(B){E=(l&255)>>>1}else{E=c[j+4>>2]|0}if((E|0)==0){F=0}else{if(B){G=j+1|0}else{G=c[j+8>>2]|0}B=a[G]|0;F=B<<24>>24==(vc[c[(c[A>>2]|0)+28>>2]&15](C,45)|0)<<24>>24}c[n>>2]=0;n=r;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;n=s;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;A=t;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;oj(f,F,m,o,p,q,r,s,t,u);m=v;v=a[D]|0;D=(v&1)==0;if(D){H=(v&255)>>>1}else{H=c[j+4>>2]|0}f=c[u>>2]|0;if((H|0)>(f|0)){if(D){I=(v&255)>>>1}else{I=c[j+4>>2]|0}D=a[A]|0;if((D&1)==0){J=(D&255)>>>1}else{J=c[t+4>>2]|0}D=a[n]|0;if((D&1)==0){K=(D&255)>>>1}else{K=c[s+4>>2]|0}L=J+(I-f<<1|1)+K|0}else{K=a[A]|0;if((K&1)==0){M=(K&255)>>>1}else{M=c[t+4>>2]|0}K=a[n]|0;if((K&1)==0){N=(K&255)>>>1}else{N=c[s+4>>2]|0}L=M+2+N|0}N=L+f|0;do{if(N>>>0>100){L=Bm(N)|0;if((L|0)!=0){O=L;P=L;break}Nm()}else{O=0;P=m}}while(0);if((v&1)==0){Q=j+1|0;R=(v&255)>>>1}else{Q=c[j+8>>2]|0;R=c[j+4>>2]|0}pj(P,w,x,c[g+4>>2]|0,Q,Q+R|0,C,F,o,a[p]|0,a[q]|0,r,s,t,f);c[y>>2]=c[e>>2];e=c[w>>2]|0;w=c[x>>2]|0;x=k;f=y;c[x+0>>2]=c[f+0>>2];gd(b,k,P,e,w,g,h);if((O|0)==0){me(t);me(s);me(r);S=c[z>>2]|0;T=S;Pd(T)|0;i=d;return}Cm(O);me(t);me(s);me(r);S=c[z>>2]|0;T=S;Pd(T)|0;i=d;return}function rj(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function sj(a){a=a|0;i=i;return}function tj(b,d,e,f,g,j,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;l=+l;var 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;d=i;i=i+16|0;m=d;n=d+8|0;o=i;i=i+8|0;p=i;i=i+16|0;q=i;i=i+104|0;r=i;i=i+8|0;s=i;i=i+400|0;t=i;i=i+8|0;u=i;i=i+8|0;v=u;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+16|0;z=i;i=i+16|0;A=i;i=i+16|0;B=i;i=i+8|0;C=i;i=i+400|0;D=i;i=i+8|0;E=i;i=i+8|0;F=i;i=i+8|0;G=q;c[r>>2]=G;q=s;s=o;h[k>>3]=l;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];s=lb(G|0,100,230104,o|0)|0;do{if(s>>>0>99){do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);o=c[57560]|0;G=n;h[k>>3]=l;c[G>>2]=c[k>>2];c[G+4>>2]=c[k+4>>2];G=ih(r,o,230104,n)|0;o=c[r>>2]|0;if((o|0)==0){Nm()}H=Bm(G<<2)|0;I=H;if((H|0)!=0){J=o;K=I;L=I;M=G;break}Nm()}else{J=0;K=0;L=q;M=s}}while(0);Ge(t,g);s=t;q=c[s>>2]|0;if(!((c[57586]|0)==-1)){c[p>>2]=230344;c[p+4>>2]=112;c[p+8>>2]=0;he(230344,p,113)}p=(c[230348>>2]|0)+ -1|0;n=c[q+8>>2]|0;if(!((c[q+12>>2]|0)-n>>2>>>0>p>>>0)){N=Va(4)|0;O=N;gm(O);xb(N|0,238312,101)}q=c[n+(p<<2)>>2]|0;if((q|0)==0){N=Va(4)|0;O=N;gm(O);xb(N|0,238312,101)}N=q;O=c[r>>2]|0;sc[c[(c[q>>2]|0)+48>>2]&7](N,O,O+M|0,L)|0;if((M|0)==0){P=0}else{P=(a[c[r>>2]|0]|0)==45}c[u>>2]=0;u=y;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;u=z;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;r=A;c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;uj(f,P,t,v,w,x,y,z,A,B);t=C;C=c[B>>2]|0;if((M|0)>(C|0)){B=a[r]|0;if((B&1)==0){Q=(B&255)>>>1}else{Q=c[A+4>>2]|0}B=a[u]|0;if((B&1)==0){R=(B&255)>>>1}else{R=c[z+4>>2]|0}S=Q+(M-C<<1|1)+R|0}else{R=a[r]|0;if((R&1)==0){T=(R&255)>>>1}else{T=c[A+4>>2]|0}R=a[u]|0;if((R&1)==0){U=(R&255)>>>1}else{U=c[z+4>>2]|0}S=T+2+U|0}U=S+C|0;do{if(U>>>0>100){S=Bm(U<<2)|0;T=S;if((S|0)!=0){V=T;W=T;break}Nm()}else{V=0;W=t}}while(0);vj(W,D,E,c[g+4>>2]|0,L,L+(M<<2)|0,N,P,v,c[w>>2]|0,c[x>>2]|0,y,z,A,C);c[F>>2]=c[e>>2];e=c[D>>2]|0;D=c[E>>2]|0;E=m;C=F;c[E+0>>2]=c[C+0>>2];rh(b,m,W,e,D,g,j);if((V|0)!=0){Cm(V)}xe(A);xe(z);me(y);Pd(c[s>>2]|0)|0;if((K|0)!=0){Cm(K)}if((J|0)==0){i=d;return}Cm(J);i=d;return}function uj(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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,K=0,L=0;n=i;i=i+40|0;o=n;p=n+16|0;q=n+32|0;r=q;s=i;i=i+16|0;t=i;i=i+8|0;u=t;v=i;i=i+16|0;w=i;i=i+16|0;x=i;i=i+16|0;y=i;i=i+8|0;z=y;A=i;i=i+16|0;B=i;i=i+8|0;C=B;D=i;i=i+16|0;E=i;i=i+16|0;F=i;i=i+16|0;G=c[e>>2]|0;if(b){if(!((c[57480]|0)==-1)){c[p>>2]=229920;c[p+4>>2]=112;c[p+8>>2]=0;he(229920,p,113)}p=(c[229924>>2]|0)+ -1|0;b=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-b>>2>>>0>p>>>0)){H=Va(4)|0;I=H;gm(I);xb(H|0,238312,101)}e=c[b+(p<<2)>>2]|0;if((e|0)==0){H=Va(4)|0;I=H;gm(I);xb(H|0,238312,101)}H=e;I=c[e>>2]|0;if(d){kc[c[I+44>>2]&63](r,H);r=f;p=c[q>>2]|0;a[r]=p;a[r+1|0]=p>>8;a[r+2|0]=p>>16;a[r+3|0]=p>>24;kc[c[(c[e>>2]|0)+32>>2]&63](s,H);p=l;if((a[p]&1)==0){c[l+4>>2]=0;a[p]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ae(l,0);r=s;c[p+0>>2]=c[r+0>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[r+0>>2]=0;c[r+4>>2]=0;c[r+8>>2]=0;xe(s)}else{kc[c[I+40>>2]&63](u,H);u=f;I=c[t>>2]|0;a[u]=I;a[u+1|0]=I>>8;a[u+2|0]=I>>16;a[u+3|0]=I>>24;kc[c[(c[e>>2]|0)+28>>2]&63](v,H);I=l;if((a[I]&1)==0){c[l+4>>2]=0;a[I]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ae(l,0);u=v;c[I+0>>2]=c[u+0>>2];c[I+4>>2]=c[u+4>>2];c[I+8>>2]=c[u+8>>2];c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;xe(v)}v=e;c[g>>2]=mc[c[(c[v>>2]|0)+12>>2]&63](H)|0;c[h>>2]=mc[c[(c[v>>2]|0)+16>>2]&63](H)|0;kc[c[(c[e>>2]|0)+20>>2]&63](w,H);u=j;if((a[u]&1)==0){a[j+1|0]=0;a[u]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}qe(j,0);I=w;c[u+0>>2]=c[I+0>>2];c[u+4>>2]=c[I+4>>2];c[u+8>>2]=c[I+8>>2];c[I+0>>2]=0;c[I+4>>2]=0;c[I+8>>2]=0;me(w);kc[c[(c[e>>2]|0)+24>>2]&63](x,H);e=k;if((a[e]&1)==0){c[k+4>>2]=0;a[e]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ae(k,0);w=x;c[e+0>>2]=c[w+0>>2];c[e+4>>2]=c[w+4>>2];c[e+8>>2]=c[w+8>>2];c[w+0>>2]=0;c[w+4>>2]=0;c[w+8>>2]=0;xe(x);J=mc[c[(c[v>>2]|0)+36>>2]&63](H)|0;c[m>>2]=J;i=n;return}else{if(!((c[57464]|0)==-1)){c[o>>2]=229856;c[o+4>>2]=112;c[o+8>>2]=0;he(229856,o,113)}o=(c[229860>>2]|0)+ -1|0;H=c[G+8>>2]|0;if(!((c[G+12>>2]|0)-H>>2>>>0>o>>>0)){K=Va(4)|0;L=K;gm(L);xb(K|0,238312,101)}G=c[H+(o<<2)>>2]|0;if((G|0)==0){K=Va(4)|0;L=K;gm(L);xb(K|0,238312,101)}K=G;L=c[G>>2]|0;if(d){kc[c[L+44>>2]&63](z,K);z=f;d=c[y>>2]|0;a[z]=d;a[z+1|0]=d>>8;a[z+2|0]=d>>16;a[z+3|0]=d>>24;kc[c[(c[G>>2]|0)+32>>2]&63](A,K);d=l;if((a[d]&1)==0){c[l+4>>2]=0;a[d]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ae(l,0);z=A;c[d+0>>2]=c[z+0>>2];c[d+4>>2]=c[z+4>>2];c[d+8>>2]=c[z+8>>2];c[z+0>>2]=0;c[z+4>>2]=0;c[z+8>>2]=0;xe(A)}else{kc[c[L+40>>2]&63](C,K);C=f;f=c[B>>2]|0;a[C]=f;a[C+1|0]=f>>8;a[C+2|0]=f>>16;a[C+3|0]=f>>24;kc[c[(c[G>>2]|0)+28>>2]&63](D,K);f=l;if((a[f]&1)==0){c[l+4>>2]=0;a[f]=0}else{c[c[l+8>>2]>>2]=0;c[l+4>>2]=0}Ae(l,0);l=D;c[f+0>>2]=c[l+0>>2];c[f+4>>2]=c[l+4>>2];c[f+8>>2]=c[l+8>>2];c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;xe(D)}D=G;c[g>>2]=mc[c[(c[D>>2]|0)+12>>2]&63](K)|0;c[h>>2]=mc[c[(c[D>>2]|0)+16>>2]&63](K)|0;kc[c[(c[G>>2]|0)+20>>2]&63](E,K);h=j;if((a[h]&1)==0){a[j+1|0]=0;a[h]=0}else{a[c[j+8>>2]|0]=0;c[j+4>>2]=0}qe(j,0);j=E;c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;me(E);kc[c[(c[G>>2]|0)+24>>2]&63](F,K);G=k;if((a[G]&1)==0){c[k+4>>2]=0;a[G]=0}else{c[c[k+8>>2]>>2]=0;c[k+4>>2]=0}Ae(k,0);k=F;c[G+0>>2]=c[k+0>>2];c[G+4>>2]=c[k+4>>2];c[G+8>>2]=c[k+8>>2];c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;xe(F);J=mc[c[(c[D>>2]|0)+36>>2]&63](K)|0;c[m>>2]=J;i=n;return}}function vj(b,d,e,f,g,h,j,k,l,m,n,o,p,q,r){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|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;r=r|0;var 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;s=i;c[e>>2]=b;t=j;u=q;v=q+4|0;w=q+8|0;q=p;x=(f&512|0)==0;y=p+4|0;z=p+8|0;p=(r|0)>0;A=o;B=o+1|0;C=o+8|0;D=o+4|0;o=j;E=g;g=0;while(1){a:do{switch(a[l+g|0]|0){case 1:{c[d>>2]=c[e>>2];F=vc[c[(c[t>>2]|0)+44>>2]&15](j,32)|0;G=c[e>>2]|0;c[e>>2]=G+4;c[G>>2]=F;H=E;break};case 3:{F=a[u]|0;G=(F&1)==0;if(G){I=(F&255)>>>1}else{I=c[v>>2]|0}if((I|0)==0){H=E;break a}if(G){J=v}else{J=c[w>>2]|0}G=c[J>>2]|0;F=c[e>>2]|0;c[e>>2]=F+4;c[F>>2]=G;H=E;break};case 0:{c[d>>2]=c[e>>2];H=E;break};case 4:{G=c[e>>2]|0;F=k?E+4|0:E;b:do{if(F>>>0<h>>>0){K=F;while(1){L=K+4|0;if(!(gc[c[(c[o>>2]|0)+12>>2]&31](j,2048,c[K>>2]|0)|0)){M=K;break b}if(L>>>0<h>>>0){K=L}else{M=L;break}}}else{M=F}}while(0);if(p){do{if(M>>>0>F>>>0){K=c[e>>2]|0;L=M;N=r;while(1){O=L+ -4|0;P=K+4|0;c[K>>2]=c[O>>2];Q=N+ -1|0;R=(Q|0)>0;if(O>>>0>F>>>0&R){N=Q;L=O;K=P}else{break}}c[e>>2]=P;if(R){S=O;T=Q;U=34;break}K=c[e>>2]|0;c[e>>2]=K+4;V=K;W=O}else{S=M;T=r;U=34}}while(0);do{if((U|0)==34){U=0;K=vc[c[(c[t>>2]|0)+44>>2]&15](j,48)|0;L=c[e>>2]|0;N=L+4|0;c[e>>2]=N;if((T|0)>0){X=N;Y=L;Z=T}else{V=L;W=S;break}while(1){c[Y>>2]=K;N=Z+ -1|0;if((N|0)>0){Z=N;Y=X;X=X+4|0}else{break}}c[e>>2]=L+(T+1<<2);V=L+(T<<2)|0;W=S}}while(0);c[V>>2]=m;_=W}else{_=M}if((_|0)==(F|0)){K=vc[c[(c[t>>2]|0)+44>>2]&15](j,48)|0;N=c[e>>2]|0;$=N+4|0;c[e>>2]=$;c[N>>2]=K;aa=$}else{$=a[A]|0;K=($&1)==0;if(K){ba=($&255)>>>1}else{ba=c[D>>2]|0}if((ba|0)==0){ca=_;da=-1;ea=0;fa=0}else{if(K){ga=B}else{ga=c[C>>2]|0}ca=_;da=a[ga]|0;ea=0;fa=0}while(1){K=c[e>>2]|0;do{if((fa|0)==(da|0)){$=K+4|0;c[e>>2]=$;c[K>>2]=n;N=ea+1|0;ha=a[A]|0;ia=(ha&1)==0;if(ia){ja=(ha&255)>>>1}else{ja=c[D>>2]|0}if(!(N>>>0<ja>>>0)){ka=$;la=da;ma=N;na=0;break}if(ia){oa=B}else{oa=c[C>>2]|0}if((a[oa+N|0]|0)==127){ka=$;la=-1;ma=N;na=0;break}if(ia){pa=B}else{pa=c[C>>2]|0}ka=$;la=a[pa+N|0]|0;ma=N;na=0}else{ka=K;la=da;ma=ea;na=fa}}while(0);K=ca+ -4|0;L=c[K>>2]|0;N=ka+4|0;c[e>>2]=N;c[ka>>2]=L;if((K|0)==(F|0)){aa=N;break}else{ca=K;da=la;ea=ma;fa=na+1|0}}}if((G|0)==(aa|0)){H=F;break a}K=aa+ -4|0;if(K>>>0>G>>>0){qa=G;ra=K}else{H=F;break a}while(1){K=c[qa>>2]|0;c[qa>>2]=c[ra>>2];c[ra>>2]=K;K=qa+4|0;N=ra+ -4|0;if(K>>>0<N>>>0){ra=N;qa=K}else{H=F;break}}break};case 2:{F=a[q]|0;G=(F&1)==0;if(G){sa=(F&255)>>>1}else{sa=c[y>>2]|0}if((sa|0)==0|x){H=E;break a}if(G){ta=y;ua=(F&255)>>>1}else{ta=c[z>>2]|0;ua=c[y>>2]|0}F=ta+(ua<<2)|0;G=c[e>>2]|0;if((ta|0)==(F|0)){va=G}else{K=(ta+(ua+ -1<<2)+(0-ta)|0)>>>2;N=G;L=ta;while(1){c[N>>2]=c[L>>2];$=L+4|0;if(($|0)==(F|0)){break}N=N+4|0;L=$}va=G+(K+1<<2)|0}c[e>>2]=va;H=E;break};default:{H=E}}}while(0);L=g+1|0;if((L|0)==4){break}else{E=H;g=L}}g=a[u]|0;u=(g&1)==0;if(u){wa=(g&255)>>>1}else{wa=c[v>>2]|0}if(wa>>>0>1){if(u){xa=v;ya=(g&255)>>>1}else{xa=c[w>>2]|0;ya=c[v>>2]|0}v=xa+4|0;w=xa+(ya<<2)|0;g=c[e>>2]|0;if((v|0)==(w|0)){za=g}else{u=(xa+(ya+ -1<<2)+(0-v)|0)>>>2;ya=g;xa=v;while(1){c[ya>>2]=c[xa>>2];v=xa+4|0;if((v|0)==(w|0)){break}else{xa=v;ya=ya+4|0}}za=g+(u+1<<2)|0}c[e>>2]=za}za=f&176;if((za|0)==32){c[d>>2]=c[e>>2];i=s;return}else if((za|0)==16){i=s;return}else{c[d>>2]=b;i=s;return}}function wj(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var 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,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;d=i;i=i+40|0;k=d;l=d+8|0;m=d+24|0;n=d+32|0;o=n;p=i;i=i+8|0;q=i;i=i+8|0;r=i;i=i+16|0;s=i;i=i+16|0;t=i;i=i+16|0;u=i;i=i+8|0;v=i;i=i+400|0;w=i;i=i+8|0;x=i;i=i+8|0;y=i;i=i+8|0;Ge(m,g);z=m;A=c[z>>2]|0;if(!((c[57586]|0)==-1)){c[l>>2]=230344;c[l+4>>2]=112;c[l+8>>2]=0;he(230344,l,113)}l=(c[230348>>2]|0)+ -1|0;B=c[A+8>>2]|0;if(!((c[A+12>>2]|0)-B>>2>>>0>l>>>0)){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}A=c[B+(l<<2)>>2]|0;if((A|0)==0){C=Va(4)|0;D=C;gm(D);xb(C|0,238312,101)}C=A;D=j;l=a[D]|0;B=(l&1)==0;if(B){E=(l&255)>>>1}else{E=c[j+4>>2]|0}if((E|0)==0){F=0}else{if(B){G=j+4|0}else{G=c[j+8>>2]|0}B=c[G>>2]|0;F=(B|0)==(vc[c[(c[A>>2]|0)+44>>2]&15](C,45)|0)}c[n>>2]=0;n=r;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;n=s;c[n+0>>2]=0;c[n+4>>2]=0;c[n+8>>2]=0;A=t;c[A+0>>2]=0;c[A+4>>2]=0;c[A+8>>2]=0;uj(f,F,m,o,p,q,r,s,t,u);m=v;v=a[D]|0;D=(v&1)==0;if(D){H=(v&255)>>>1}else{H=c[j+4>>2]|0}f=c[u>>2]|0;if((H|0)>(f|0)){if(D){I=(v&255)>>>1}else{I=c[j+4>>2]|0}D=a[A]|0;if((D&1)==0){J=(D&255)>>>1}else{J=c[t+4>>2]|0}D=a[n]|0;if((D&1)==0){K=(D&255)>>>1}else{K=c[s+4>>2]|0}L=J+(I-f<<1|1)+K|0}else{K=a[A]|0;if((K&1)==0){M=(K&255)>>>1}else{M=c[t+4>>2]|0}K=a[n]|0;if((K&1)==0){N=(K&255)>>>1}else{N=c[s+4>>2]|0}L=M+2+N|0}N=L+f|0;do{if(N>>>0>100){L=Bm(N<<2)|0;M=L;if((L|0)!=0){O=M;P=M;break}Nm()}else{O=0;P=m}}while(0);if((v&1)==0){Q=j+4|0;R=(v&255)>>>1}else{Q=c[j+8>>2]|0;R=c[j+4>>2]|0}vj(P,w,x,c[g+4>>2]|0,Q,Q+(R<<2)|0,C,F,o,c[p>>2]|0,c[q>>2]|0,r,s,t,f);c[y>>2]=c[e>>2];e=c[w>>2]|0;w=c[x>>2]|0;x=k;f=y;c[x+0>>2]=c[f+0>>2];rh(b,k,P,e,w,g,h);if((O|0)==0){xe(t);xe(s);me(r);S=c[z>>2]|0;T=S;Pd(T)|0;i=d;return}Cm(O);xe(t);xe(s);me(r);S=c[z>>2]|0;T=S;Pd(T)|0;i=d;return}function xj(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function yj(a){a=a|0;i=i;return}function zj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=cc(f|0,1)|0;i=e;return d>>>((d|0)!=(-1|0)|0)|0}function Aj(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 j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+16|0;j=d;k=j;c[k+0>>2]=0;c[k+4>>2]=0;c[k+8>>2]=0;l=a[h]|0;if((l&1)==0){m=h+1|0;n=h+1|0;o=(l&255)>>>1}else{l=c[h+8>>2]|0;m=l;n=l;o=c[h+4>>2]|0}h=m+o|0;do{if(n>>>0<h>>>0){o=n;do{re(j,a[o]|0);o=o+1|0;}while((o|0)!=(h|0));o=(e|0)==-1?-1:e<<1;if((a[k]&1)==0){p=o;q=9;break}r=o;s=c[j+8>>2]|0}else{p=(e|0)==-1?-1:e<<1;q=9}}while(0);if((q|0)==9){r=p;s=j+1|0}p=jb(r|0,f|0,g|0,s|0)|0;s=b;c[s+0>>2]=0;c[s+4>>2]=0;c[s+8>>2]=0;s=bn(p|0)|0;g=p+s|0;if((s|0)>0){t=p}else{me(j);i=d;return}do{re(b,a[t]|0);t=t+1|0;}while((t|0)!=(g|0));me(j);i=d;return}function Bj(a,b){a=a|0;b=b|0;a=i;Wb(((b|0)==-1?-1:b<<1)|0)|0;i=a;return}function Cj(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Dj(a){a=a|0;i=i;return}function Ej(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((a[d]&1)==0){f=d+1|0}else{f=c[d+8>>2]|0}d=cc(f|0,1)|0;i=e;return d>>>((d|0)!=(-1|0)|0)|0}function Fj(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 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;d=i;i=i+240|0;j=d;k=d+8|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+192|0;q=d+200|0;r=d+208|0;s=d+224|0;t=d+232|0;u=r;c[u+0>>2]=0;c[u+4>>2]=0;c[u+8>>2]=0;c[s+4>>2]=0;c[s>>2]=232008;v=a[h]|0;if((v&1)==0){w=h+4|0;x=h+4|0;y=(v&255)>>>1}else{v=c[h+8>>2]|0;w=v;x=v;y=c[h+4>>2]|0}h=w+(y<<2)|0;y=k;w=j;v=j;c[v>>2]=0;c[v+4>>2]=0;a:do{if(x>>>0<h>>>0){v=s;j=s;z=k+32|0;A=x;B=232008|0;while(1){c[m>>2]=A;C=(rc[c[B+12>>2]&15](v,w,A,h,m,y,z,l)|0)==2;D=c[m>>2]|0;if(C|(D|0)==(A|0)){break}if(y>>>0<(c[l>>2]|0)>>>0){C=y;do{re(r,a[C]|0);C=C+1|0;}while(C>>>0<(c[l>>2]|0)>>>0);E=c[m>>2]|0}else{E=D}if(!(E>>>0<h>>>0)){break a}A=E;B=c[j>>2]|0}$i(231232)}}while(0);if((a[u]&1)==0){F=r+1|0}else{F=c[r+8>>2]|0}u=jb(((e|0)==-1?-1:e<<1)|0,f|0,g|0,F|0)|0;F=b;c[F+0>>2]=0;c[F+4>>2]=0;c[F+8>>2]=0;c[t+4>>2]=0;c[t>>2]=232112;F=bn(u|0)|0;g=u+F|0;f=n;e=n;c[e>>2]=0;c[e+4>>2]=0;if((F|0)<=0){me(r);i=d;return}F=t;e=t;t=g;n=o;E=o+128|0;o=u;u=232112|0;while(1){c[q>>2]=o;h=(rc[c[u+16>>2]&15](F,f,o,(t-o|0)>32?o+32|0:g,q,n,E,p)|0)==2;m=c[q>>2]|0;if(h|(m|0)==(o|0)){G=20;break}if(n>>>0<(c[p>>2]|0)>>>0){h=n;do{Be(b,c[h>>2]|0);h=h+4|0;}while(h>>>0<(c[p>>2]|0)>>>0);H=c[q>>2]|0}else{H=m}if(!(H>>>0<g>>>0)){G=25;break}o=H;u=c[e>>2]|0}if((G|0)==20){$i(231232)}else if((G|0)==25){me(r);i=d;return}}function Gj(a,b){a=a|0;b=b|0;a=i;Wb(((b|0)==-1?-1:b<<1)|0)|0;i=a;return}function Hj(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=230440;e=b+8|0;b=c[e>>2]|0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);if((b|0)==(c[57560]|0)){i=d;return}Ea(c[e>>2]|0);i=d;return}function Ij(a){a=a|0;a=Va(8)|0;Qd(a,230232);c[a>>2]=227280;xb(a|0,227320,9)}function Jj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=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,N=0,O=0;e=i;i=i+448|0;f=e;g=e+16|0;h=e+32|0;j=e+48|0;k=e+64|0;l=e+80|0;m=e+96|0;n=e+112|0;o=e+128|0;p=e+144|0;q=e+160|0;r=e+176|0;s=e+192|0;t=e+208|0;u=e+224|0;v=e+240|0;w=e+256|0;x=e+272|0;y=e+288|0;z=e+304|0;A=e+320|0;B=e+336|0;C=e+352|0;D=e+368|0;E=e+384|0;F=e+400|0;G=e+416|0;H=e+432|0;c[b+4>>2]=d+ -1;c[b>>2]=230272;d=b+8|0;I=b+12|0;J=b+136|0;a[J]=1;K=b+24|0;c[I>>2]=K;c[d>>2]=K;c[b+16>>2]=J;J=28;L=K;do{if((L|0)==0){M=0}else{c[L>>2]=0;M=c[I>>2]|0}L=M+4|0;c[I>>2]=L;J=J+ -1|0;}while((J|0)!=0);ke(b+144|0,230256,1);J=c[d>>2]|0;d=c[I>>2]|0;if((d|0)!=(J|0)){c[I>>2]=d+(~((d+ -4+(0-J)|0)>>>2)<<2)}c[235164>>2]=0;c[58790]=228752;if(!((c[57194]|0)==-1)){c[G>>2]=228776;c[G+4>>2]=112;c[G+8>>2]=0;he(228776,G,113)}Kj(b,235160,(c[228780>>2]|0)+ -1|0);c[235156>>2]=0;c[58788]=228792;if(!((c[57204]|0)==-1)){c[F>>2]=228816;c[F+4>>2]=112;c[F+8>>2]=0;he(228816,F,113)}Kj(b,235152,(c[228820>>2]|0)+ -1|0);c[235140>>2]=0;c[58784]=230368;c[235144>>2]=0;a[235148|0]=0;c[235144>>2]=c[(Ka()|0)>>2];if(!((c[57588]|0)==-1)){c[E>>2]=230352;c[E+4>>2]=112;c[E+8>>2]=0;he(230352,E,113)}Kj(b,235136,(c[230356>>2]|0)+ -1|0);c[235132>>2]=0;c[58782]=231328;if(!((c[57586]|0)==-1)){c[D>>2]=230344;c[D+4>>2]=112;c[D+8>>2]=0;he(230344,D,113)}Kj(b,235128,(c[230348>>2]|0)+ -1|0);c[235124>>2]=0;c[58780]=231544;if(!((c[57604]|0)==-1)){c[C>>2]=230416;c[C+4>>2]=112;c[C+8>>2]=0;he(230416,C,113)}Kj(b,235120,(c[230420>>2]|0)+ -1|0);c[235108>>2]=0;c[58776]=230440;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);c[235112>>2]=c[57560];if(!((c[57606]|0)==-1)){c[B>>2]=230424;c[B+4>>2]=112;c[B+8>>2]=0;he(230424,B,113)}Kj(b,235104,(c[230428>>2]|0)+ -1|0);c[235100>>2]=0;c[58774]=231768;if(!((c[57620]|0)==-1)){c[A>>2]=230480;c[A+4>>2]=112;c[A+8>>2]=0;he(230480,A,113)}Kj(b,235096,(c[230484>>2]|0)+ -1|0);c[235092>>2]=0;c[58772]=231888;if(!((c[57622]|0)==-1)){c[z>>2]=230488;c[z+4>>2]=112;c[z+8>>2]=0;he(230488,z,113)}Kj(b,235088,(c[230492>>2]|0)+ -1|0);c[235068>>2]=0;c[58766]=230520;a[235072|0]=46;a[235073|0]=44;c[235076>>2]=0;c[235080>>2]=0;c[235084>>2]=0;if(!((c[57624]|0)==-1)){c[y>>2]=230496;c[y+4>>2]=112;c[y+8>>2]=0;he(230496,y,113)}Kj(b,235064,(c[230500>>2]|0)+ -1|0);c[235036>>2]=0;c[58758]=230560;c[235040>>2]=46;c[235044>>2]=44;c[235048>>2]=0;c[235052>>2]=0;c[235056>>2]=0;if(!((c[57626]|0)==-1)){c[x>>2]=230504;c[x+4>>2]=112;c[x+8>>2]=0;he(230504,x,113)}Kj(b,235032,(c[230508>>2]|0)+ -1|0);c[235028>>2]=0;c[58756]=228832;if(!((c[57222]|0)==-1)){c[w>>2]=228888;c[w+4>>2]=112;c[w+8>>2]=0;he(228888,w,113)}Kj(b,235024,(c[228892>>2]|0)+ -1|0);c[235020>>2]=0;c[58754]=228952;if(!((c[57252]|0)==-1)){c[v>>2]=229008;c[v+4>>2]=112;c[v+8>>2]=0;he(229008,v,113)}Kj(b,235016,(c[229012>>2]|0)+ -1|0);c[235012>>2]=0;c[58752]=229024;if(!((c[57268]|0)==-1)){c[u>>2]=229072;c[u+4>>2]=112;c[u+8>>2]=0;he(229072,u,113)}Kj(b,235008,(c[229076>>2]|0)+ -1|0);c[235004>>2]=0;c[58750]=229088;if(!((c[57284]|0)==-1)){c[t>>2]=229136;c[t+4>>2]=112;c[t+8>>2]=0;he(229136,t,113)}Kj(b,235e3,(c[229140>>2]|0)+ -1|0);c[234996>>2]=0;c[58748]=229680;if(!((c[57432]|0)==-1)){c[s>>2]=229728;c[s+4>>2]=112;c[s+8>>2]=0;he(229728,s,113)}Kj(b,234992,(c[229732>>2]|0)+ -1|0);c[234988>>2]=0;c[58746]=229744;if(!((c[57448]|0)==-1)){c[r>>2]=229792;c[r+4>>2]=112;c[r+8>>2]=0;he(229792,r,113)}Kj(b,234984,(c[229796>>2]|0)+ -1|0);c[234980>>2]=0;c[58744]=229808;if(!((c[57464]|0)==-1)){c[q>>2]=229856;c[q+4>>2]=112;c[q+8>>2]=0;he(229856,q,113)}Kj(b,234976,(c[229860>>2]|0)+ -1|0);c[234972>>2]=0;c[58742]=229872;if(!((c[57480]|0)==-1)){c[p>>2]=229920;c[p+4>>2]=112;c[p+8>>2]=0;he(229920,p,113)}Kj(b,234968,(c[229924>>2]|0)+ -1|0);c[234964>>2]=0;c[58740]=229936;if(!((c[57490]|0)==-1)){c[o>>2]=229960;c[o+4>>2]=112;c[o+8>>2]=0;he(229960,o,113)}Kj(b,234960,(c[229964>>2]|0)+ -1|0);c[234956>>2]=0;c[58738]=230016;if(!((c[57510]|0)==-1)){c[n>>2]=230040;c[n+4>>2]=112;c[n+8>>2]=0;he(230040,n,113)}Kj(b,234952,(c[230044>>2]|0)+ -1|0);c[234948>>2]=0;c[58736]=230072;if(!((c[57524]|0)==-1)){c[m>>2]=230096;c[m+4>>2]=112;c[m+8>>2]=0;he(230096,m,113)}Kj(b,234944,(c[230100>>2]|0)+ -1|0);c[234940>>2]=0;c[58734]=230120;if(!((c[57536]|0)==-1)){c[l>>2]=230144;c[l+4>>2]=112;c[l+8>>2]=0;he(230144,l,113)}Kj(b,234936,(c[230148>>2]|0)+ -1|0);c[234924>>2]=0;c[58730]=229168;c[234928>>2]=229216;if(!((c[57312]|0)==-1)){c[k>>2]=229248;c[k+4>>2]=112;c[k+8>>2]=0;he(229248,k,113)}Kj(b,234920,(c[229252>>2]|0)+ -1|0);c[234908>>2]=0;c[58726]=229320;c[234912>>2]=229368;if(!((c[57350]|0)==-1)){c[j>>2]=229400;c[j+4>>2]=112;c[j+8>>2]=0;he(229400,j,113)}Kj(b,234904,(c[229404>>2]|0)+ -1|0);c[234892>>2]=0;c[58722]=231264;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);c[234896>>2]=c[57560];c[58722]=229616;if(!((c[57408]|0)==-1)){c[h>>2]=229632;c[h+4>>2]=112;c[h+8>>2]=0;he(229632,h,113)}Kj(b,234888,(c[229636>>2]|0)+ -1|0);c[234876>>2]=0;c[58718]=231264;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);c[234880>>2]=c[57560];c[58718]=229648;if(!((c[57416]|0)==-1)){c[g>>2]=229664;c[g+4>>2]=112;c[g+8>>2]=0;he(229664,g,113)}Kj(b,234872,(c[229668>>2]|0)+ -1|0);c[234868>>2]=0;c[58716]=230160;if(!((c[57546]|0)==-1)){c[f>>2]=230184;c[f+4>>2]=112;c[f+8>>2]=0;he(230184,f,113)}Kj(b,234864,(c[230188>>2]|0)+ -1|0);c[234860>>2]=0;c[58714]=230200;if((c[57556]|0)==-1){N=c[230228>>2]|0;O=N+ -1|0;Kj(b,234856,O);i=e;return}c[H>>2]=230224;c[H+4>>2]=112;c[H+8>>2]=0;he(230224,H,113);N=c[230228>>2]|0;O=N+ -1|0;Kj(b,234856,O);i=e;return}function Kj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;Od(b);f=a+8|0;g=a+12|0;a=c[g>>2]|0;h=f;j=c[h>>2]|0;k=a-j>>2;do{if(k>>>0>d>>>0){l=j}else{m=d+1|0;if(k>>>0<m>>>0){Ol(f,m-k|0);l=c[h>>2]|0;break}if(!(k>>>0>m>>>0)){l=j;break}n=j+(m<<2)|0;if((a|0)==(n|0)){l=j;break}c[g>>2]=a+(~((a+ -4+(0-n)|0)>>>2)<<2);l=j}}while(0);j=c[l+(d<<2)>>2]|0;if((j|0)==0){o=l;p=o+(d<<2)|0;c[p>>2]=b;i=e;return}Pd(j)|0;o=c[h>>2]|0;p=o+(d<<2)|0;c[p>>2]=b;i=e;return}function Lj(a){a=a|0;var b=0;b=i;Mj(a);Im(a);i=b;return}function Mj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;c[b>>2]=230272;e=b+12|0;f=c[e>>2]|0;g=b+8|0;h=c[g>>2]|0;if((f|0)!=(h|0)){j=f;f=h;h=0;while(1){k=c[f+(h<<2)>>2]|0;if((k|0)==0){l=f;m=j}else{Pd(k)|0;l=c[g>>2]|0;m=c[e>>2]|0}k=h+1|0;if(k>>>0<m-l>>2>>>0){j=m;f=l;h=k}else{break}}}me(b+144|0);h=c[g>>2]|0;if((h|0)==0){i=d;return}g=c[e>>2]|0;if((g|0)!=(h|0)){c[e>>2]=g+(~((g+ -4+(0-h)|0)>>>2)<<2)}if((b+24|0)==(h|0)){a[b+136|0]=0;i=d;return}else{Im(h);i=d;return}}function Nj(){var b=0,d=0,e=0;b=i;if((a[230328]|0)!=0){d=c[57580]|0;i=b;return d|0}if((Na(230328)|0)==0){d=c[57580]|0;i=b;return d|0}do{if((a[230304]|0)==0){if((Na(230304)|0)==0){break}Jj(234696,1);c[57572]=234696;c[57574]=230288;_a(230304)}}while(0);e=c[c[57574]>>2]|0;c[57578]=e;Od(e);c[57580]=230312;_a(230328);d=c[57580]|0;i=b;return d|0}function Oj(a){a=a|0;var b=0,d=0;b=i;d=c[(Nj()|0)>>2]|0;c[a>>2]=d;Od(d);i=b;return}function Pj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[b>>2]|0;c[a>>2]=e;Od(e);i=d;return}function Qj(a){a=a|0;var b=0;b=i;Pd(c[a>>2]|0)|0;i=b;return}function Rj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=d;f=c[a>>2]|0;a=b;if(!((c[a>>2]|0)==-1)){c[e>>2]=b;c[e+4>>2]=112;c[e+8>>2]=0;he(a,e,113)}e=(c[b+4>>2]|0)+ -1|0;b=c[f+8>>2]|0;if(!((c[f+12>>2]|0)-b>>2>>>0>e>>>0)){g=Va(4)|0;h=g;gm(h);xb(g|0,238312,101)}f=c[b+(e<<2)>>2]|0;if((f|0)==0){g=Va(4)|0;h=g;gm(h);xb(g|0,238312,101)}else{i=d;return f|0}return 0}function Sj(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Tj(a){a=a|0;var b=0;b=i;if((a|0)==0){i=b;return}jc[c[(c[a>>2]|0)+4>>2]&127](a);i=b;return}function Uj(a){a=a|0;var b=0;b=c[57584]|0;c[57584]=b+1;c[a+4>>2]=b+1;i=i;return}function Vj(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Wj(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;a=i;if(!(e>>>0<128)){f=0;i=a;return f|0}f=(b[(c[(Ka()|0)>>2]|0)+(e<<1)>>1]&d)<<16>>16!=0;i=a;return f|0}function Xj(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;if((d|0)==(e|0)){g=d;i=a;return g|0}else{h=d;j=f}while(1){f=c[h>>2]|0;if(f>>>0<128){k=b[(c[(Ka()|0)>>2]|0)+(f<<1)>>1]|0}else{k=0}b[j>>1]=k;f=h+4|0;if((f|0)==(e|0)){g=e;break}else{h=f;j=j+2|0}}i=a;return g|0}function Yj(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;a=i;a:do{if((e|0)==(f|0)){g=e}else{h=e;while(1){j=c[h>>2]|0;if(j>>>0<128){if(!((b[(c[(Ka()|0)>>2]|0)+(j<<1)>>1]&d)<<16>>16==0)){g=h;break a}}j=h+4|0;if((j|0)==(f|0)){g=f;break}else{h=j}}}}while(0);i=a;return g|0}function Zj(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;a=i;a:do{if((e|0)==(f|0)){g=e}else{h=e;while(1){j=c[h>>2]|0;if(!(j>>>0<128)){g=h;break a}k=h+4|0;if((b[(c[(Ka()|0)>>2]|0)+(j<<1)>>1]&d)<<16>>16==0){g=h;break a}if((k|0)==(f|0)){g=f;break}else{h=k}}}}while(0);i=a;return g|0}function _j(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b>>>0<128)){d=b;i=a;return d|0}d=c[(c[(Ya()|0)>>2]|0)+(b<<2)>>2]|0;i=a;return d|0}function $j(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;a=i;if((b|0)==(d|0)){e=b;i=a;return e|0}else{f=b}while(1){b=c[f>>2]|0;if(b>>>0<128){g=c[(c[(Ya()|0)>>2]|0)+(b<<2)>>2]|0}else{g=b}c[f>>2]=g;b=f+4|0;if((b|0)==(d|0)){e=d;break}else{f=b}}i=a;return e|0}function ak(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b>>>0<128)){d=b;i=a;return d|0}d=c[(c[(yb()|0)>>2]|0)+(b<<2)>>2]|0;i=a;return d|0}function bk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;a=i;if((b|0)==(d|0)){e=b;i=a;return e|0}else{f=b}while(1){b=c[f>>2]|0;if(b>>>0<128){g=c[(c[(yb()|0)>>2]|0)+(b<<2)>>2]|0}else{g=b}c[f>>2]=g;b=f+4|0;if((b|0)==(d|0)){e=d;break}else{f=b}}i=a;return e|0}function ck(a,b){a=a|0;b=b|0;i=i;return b<<24>>24|0}function dk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;b=i;if((d|0)==(e|0)){g=d;i=b;return g|0}else{h=d;j=f}while(1){c[j>>2]=a[h]|0;f=h+1|0;if((f|0)==(e|0)){g=e;break}else{j=j+4|0;h=f}}i=b;return g|0}function ek(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return(b>>>0<128?b&255:c)|0}function fk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;b=i;if((d|0)==(e|0)){h=d;i=b;return h|0}j=((e+ -4+(0-d)|0)>>>2)+1|0;k=d;l=g;while(1){g=c[k>>2]|0;a[l]=g>>>0<128?g&255:f;g=k+4|0;if((g|0)==(e|0)){break}else{l=l+1|0;k=g}}h=d+(j<<2)|0;i=b;return h|0}function gk(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=230368;e=c[b+8>>2]|0;do{if((e|0)!=0){if((a[b+12|0]|0)==0){break}Jm(e)}}while(0);Im(b);i=d;return}function hk(b){b=b|0;var d=0,e=0;d=i;c[b>>2]=230368;e=c[b+8>>2]|0;if((e|0)==0){i=d;return}if((a[b+12|0]|0)==0){i=d;return}Jm(e);i=d;return}function ik(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b<<24>>24>-1)){d=b;i=a;return d|0}d=c[(c[(Ya()|0)>>2]|0)+((b&255)<<2)>>2]&255;i=a;return d|0}function jk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;if((d|0)==(e|0)){f=d;i=b;return f|0}else{g=d}while(1){d=a[g]|0;if(d<<24>>24>-1){h=c[(c[(Ya()|0)>>2]|0)+(d<<24>>24<<2)>>2]&255}else{h=d}a[g]=h;d=g+1|0;if((d|0)==(e|0)){f=e;break}else{g=d}}i=b;return f|0}function kk(a,b){a=a|0;b=b|0;var d=0;a=i;if(!(b<<24>>24>-1)){d=b;i=a;return d|0}d=c[(c[(yb()|0)>>2]|0)+(b<<24>>24<<2)>>2]&255;i=a;return d|0}function lk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;b=i;if((d|0)==(e|0)){f=d;i=b;return f|0}else{g=d}while(1){d=a[g]|0;if(d<<24>>24>-1){h=c[(c[(yb()|0)>>2]|0)+(d<<24>>24<<2)>>2]&255}else{h=d}a[g]=h;d=g+1|0;if((d|0)==(e|0)){f=e;break}else{g=d}}i=b;return f|0}function mk(a,b){a=a|0;b=b|0;i=i;return b|0}function nk(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;b=i;if((c|0)==(d|0)){f=c}else{g=c;c=e;while(1){a[c]=a[g]|0;e=g+1|0;if((e|0)==(d|0)){f=d;break}else{c=c+1|0;g=e}}}i=b;return f|0}function ok(a,b,c){a=a|0;b=b|0;c=c|0;i=i;return(b<<24>>24>-1?b:c)|0}function pk(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,j=0;b=i;if((c|0)==(d|0)){g=c;i=b;return g|0}else{h=c;j=f}while(1){f=a[h]|0;a[j]=f<<24>>24>-1?f:e;f=h+1|0;if((f|0)==(d|0)){g=d;break}else{j=j+1|0;h=f}}i=b;return g|0}function qk(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function rk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;c[f>>2]=d;c[j>>2]=g;i=i;return 3}function sk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;c[f>>2]=d;c[j>>2]=g;i=i;return 3}function tk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function uk(a){a=a|0;i=i;return 1}function vk(a){a=a|0;i=i;return 1}function wk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=d-c|0;i=i;return(b>>>0<e>>>0?b:e)|0}function xk(a){a=a|0;i=i;return 1}function yk(a){a=a|0;var b=0;b=i;Hj(a);Im(a);i=b;return}function zk(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;l=i;i=i+8|0;m=l;n=m;o=i;i=i+8|0;p=(e|0)==(f|0);a:do{if(p){c[k>>2]=h;c[g>>2]=e;q=e}else{r=e;while(1){s=r+4|0;if((c[r>>2]|0)==0){t=r;break}if((s|0)==(f|0)){t=f;break}else{r=s}}c[k>>2]=h;c[g>>2]=e;if(p|(h|0)==(j|0)){q=e;break}r=d;s=j;u=b+8|0;v=o;w=e;x=h;y=t;while(1){z=r;A=c[z+4>>2]|0;B=m;c[B>>2]=c[z>>2];c[B+4>>2]=A;A=ib(c[u>>2]|0)|0;B=$l(x,g,y-w>>2,s-x|0,d)|0;if((A|0)!=0){ib(A|0)|0}if((B|0)==0){C=1;D=33;break}else if((B|0)==-1){D=10;break}A=(c[k>>2]|0)+B|0;c[k>>2]=A;if((A|0)==(j|0)){D=31;break}if((y|0)==(f|0)){E=c[g>>2]|0;F=A;G=f}else{A=ib(c[u>>2]|0)|0;B=_l(v,0,d)|0;if((A|0)!=0){ib(A|0)|0}if((B|0)==-1){C=2;D=33;break}A=c[k>>2]|0;if(B>>>0>(s-A|0)>>>0){C=1;D=33;break}b:do{if((B|0)!=0){z=A;H=B;I=v;while(1){J=a[I]|0;c[k>>2]=z+1;a[z]=J;J=H+ -1|0;if((J|0)==0){break b}z=c[k>>2]|0;I=I+1|0;H=J}}}while(0);B=(c[g>>2]|0)+4|0;c[g>>2]=B;c:do{if((B|0)==(f|0)){K=f}else{A=B;while(1){H=A+4|0;if((c[A>>2]|0)==0){K=A;break c}if((H|0)==(f|0)){K=f;break}else{A=H}}}}while(0);E=B;F=c[k>>2]|0;G=K}if((E|0)==(f|0)|(F|0)==(j|0)){q=E;break a}else{w=E;x=F;y=G}}if((D|0)==10){c[k>>2]=x;d:do{if((w|0)==(c[g>>2]|0)){L=w}else{y=w;v=x;while(1){s=c[y>>2]|0;r=ib(c[u>>2]|0)|0;A=_l(v,s,n)|0;if((r|0)!=0){ib(r|0)|0}if((A|0)==-1){L=y;break d}r=(c[k>>2]|0)+A|0;c[k>>2]=r;A=y+4|0;if((A|0)==(c[g>>2]|0)){L=A;break}else{y=A;v=r}}}}while(0);c[g>>2]=L;C=2;i=l;return C|0}else if((D|0)==31){q=c[g>>2]|0;break}else if((D|0)==33){i=l;return C|0}}}while(0);C=(q|0)!=(f|0)|0;i=l;return C|0}function Ak(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var 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;l=i;i=i+8|0;m=l;n=m;o=(e|0)==(f|0);a:do{if(o){c[k>>2]=h;c[g>>2]=e;p=e}else{q=e;while(1){r=q+1|0;if((a[q]|0)==0){s=q;break}if((r|0)==(f|0)){s=f;break}else{q=r}}c[k>>2]=h;c[g>>2]=e;if(o|(h|0)==(j|0)){p=e;break}q=d;r=j;t=b+8|0;u=e;v=h;w=s;while(1){x=q;y=c[x+4>>2]|0;z=m;c[z>>2]=c[x>>2];c[z+4>>2]=y;A=w;y=ib(c[t>>2]|0)|0;z=Xl(v,g,A-u|0,r-v>>2,d)|0;if((y|0)!=0){ib(y|0)|0}if((z|0)==-1){B=10;break}else if((z|0)==0){C=2;B=32;break}y=(c[k>>2]|0)+(z<<2)|0;c[k>>2]=y;if((y|0)==(j|0)){B=30;break}z=c[g>>2]|0;if((w|0)==(f|0)){D=z;E=y;F=f}else{x=ib(c[t>>2]|0)|0;G=Wl(y,z,1,d)|0;if((x|0)!=0){ib(x|0)|0}if((G|0)!=0){C=2;B=32;break}c[k>>2]=(c[k>>2]|0)+4;G=(c[g>>2]|0)+1|0;c[g>>2]=G;b:do{if((G|0)==(f|0)){H=f}else{x=G;while(1){z=x+1|0;if((a[x]|0)==0){H=x;break b}if((z|0)==(f|0)){H=f;break}else{x=z}}}}while(0);D=G;E=c[k>>2]|0;F=H}if((D|0)==(f|0)|(E|0)==(j|0)){p=D;break a}else{u=D;v=E;w=F}}if((B|0)==10){c[k>>2]=v;c:do{if((u|0)==(c[g>>2]|0)){I=u}else{w=u;r=v;while(1){q=ib(c[t>>2]|0)|0;x=Wl(r,w,A-w|0,n)|0;if((q|0)!=0){ib(q|0)|0}if((x|0)==-2){B=16;break}else if((x|0)==-1){B=15;break}else if((x|0)==0){J=w+1|0}else{J=w+x|0}x=(c[k>>2]|0)+4|0;c[k>>2]=x;if((J|0)==(c[g>>2]|0)){I=J;break c}else{w=J;r=x}}if((B|0)==15){c[g>>2]=w;C=2;i=l;return C|0}else if((B|0)==16){c[g>>2]=w;C=1;i=l;return C|0}}}while(0);c[g>>2]=I;C=(I|0)!=(f|0)|0;i=l;return C|0}else if((B|0)==30){p=c[g>>2]|0;break}else if((B|0)==32){i=l;return C|0}}}while(0);C=(p|0)!=(f|0)|0;i=l;return C|0}function Bk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+8|0;c[g>>2]=e;e=h;j=ib(c[b+8>>2]|0)|0;b=_l(e,0,d)|0;if((j|0)!=0){ib(j|0)|0}if((b|0)==0|(b|0)==-1){k=2;i=h;return k|0}j=b+ -1|0;b=c[g>>2]|0;if(j>>>0>(f-b|0)>>>0){k=1;i=h;return k|0}if((j|0)==0){k=0;i=h;return k|0}else{l=b;m=j;n=e}while(1){e=a[n]|0;c[g>>2]=l+1;a[l]=e;e=m+ -1|0;if((e|0)==0){k=0;break}l=c[g>>2]|0;n=n+1|0;m=e}i=h;return k|0}function Ck(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=a+8|0;a=ib(c[d>>2]|0)|0;e=Zl(0,0,4)|0;if((a|0)!=0){ib(a|0)|0}do{if((e|0)==0){a=c[d>>2]|0;if((a|0)==0){f=1;break}g=ib(a|0)|0;if((g|0)==0){f=0;break}ib(g|0)|0;f=0}else{f=-1}}while(0);i=b;return f|0}function Dk(a){a=a|0;i=i;return 0}function Ek(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,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=i;if((f|0)==0|(d|0)==(e|0)){h=0;i=g;return h|0}j=e;k=a+8|0;a=d;d=0;l=0;while(1){m=ib(c[k>>2]|0)|0;n=Vl(a,j-a|0,b)|0;if((m|0)!=0){ib(m|0)|0}if((n|0)==0){o=a+1|0;p=1}else if((n|0)==-2|(n|0)==-1){h=d;q=9;break}else{o=a+n|0;p=n}n=p+d|0;m=l+1|0;if(m>>>0>=f>>>0|(o|0)==(e|0)){h=n;q=9;break}else{a=o;d=n;l=m}}if((q|0)==9){i=g;return h|0}return 0}function Fk(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a+8>>2]|0;do{if((d|0)==0){e=1}else{a=ib(d|0)|0;if((a|0)==0){e=4;break}ib(a|0)|0;e=4}}while(0);i=b;return e|0}function Gk(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Hk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Ik(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d>>1<<1);c[j>>2]=g+((c[k>>2]|0)-g);i=b;return l|0}function Ik(d,f,g,h,j,k,l,m){d=d|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0;n=i;c[g>>2]=d;c[k>>2]=h;do{if((m&2|0)!=0){if((j-h|0)<3){o=1;i=n;return o|0}else{c[k>>2]=h+1;a[h]=-17;d=c[k>>2]|0;c[k>>2]=d+1;a[d]=-69;d=c[k>>2]|0;c[k>>2]=d+1;a[d]=-65;break}}}while(0);h=f;m=c[g>>2]|0;if(!(m>>>0<f>>>0)){o=0;i=n;return o|0}d=j;j=m;a:while(1){m=b[j>>1]|0;p=m&65535;if(p>>>0>l>>>0){o=2;q=26;break}do{if((m&65535)<128){r=c[k>>2]|0;if((d-r|0)<1){o=1;q=26;break a}c[k>>2]=r+1;a[r]=m}else{if((m&65535)<2048){r=c[k>>2]|0;if((d-r|0)<2){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>6|192;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if((m&65535)<55296){r=c[k>>2]|0;if((d-r|0)<3){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>12|224;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p>>>6&63|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if(!((m&65535)<56320)){if((m&65535)<57344){o=2;q=26;break a}r=c[k>>2]|0;if((d-r|0)<3){o=1;q=26;break a}c[k>>2]=r+1;a[r]=p>>>12|224;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p>>>6&63|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p&63|128;break}if((h-j|0)<4){o=1;q=26;break a}r=j+2|0;s=e[r>>1]|0;if((s&64512|0)!=56320){o=2;q=26;break a}if((d-(c[k>>2]|0)|0)<4){o=1;q=26;break a}t=p&960;if(((t<<10)+65536|p<<10&64512|s&1023)>>>0>l>>>0){o=2;q=26;break a}c[g>>2]=r;r=(t>>>6)+1|0;t=c[k>>2]|0;c[k>>2]=t+1;a[t]=r>>>2|240;t=c[k>>2]|0;c[k>>2]=t+1;a[t]=p>>>2&15|r<<4&48|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=p<<4&48|s>>>6&15|128;r=c[k>>2]|0;c[k>>2]=r+1;a[r]=s&63|128}}while(0);p=(c[g>>2]|0)+2|0;c[g>>2]=p;if(p>>>0<f>>>0){j=p}else{o=0;q=26;break}}if((q|0)==26){i=n;return o|0}return 0}function Jk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Kk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d);c[j>>2]=g+((c[k>>2]|0)-g>>1<<1);i=b;return l|0}function Kk(e,f,g,h,j,k,l,m){e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|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;n=i;c[g>>2]=e;c[k>>2]=h;h=c[g>>2]|0;do{if((m&4|0)==0){o=h}else{if((f-h|0)<=2){o=h;break}if(!((a[h]|0)==-17)){o=h;break}if(!((a[h+1|0]|0)==-69)){o=h;break}if(!((a[h+2|0]|0)==-65)){o=h;break}e=h+3|0;c[g>>2]=e;o=e}}while(0);a:do{if(o>>>0<f>>>0){h=f;m=j;e=o;p=c[k>>2]|0;b:while(1){if(!(p>>>0<j>>>0)){q=e;break a}r=a[e]|0;s=r&255;if(s>>>0>l>>>0){t=2;u=41;break}do{if(r<<24>>24>-1){b[p>>1]=r&255;c[g>>2]=e+1}else{if((r&255)<194){t=2;u=41;break b}if((r&255)<224){if((h-e|0)<2){t=1;u=41;break b}v=d[e+1|0]|0;if((v&192|0)!=128){t=2;u=41;break b}w=v&63|s<<6&1984;if(w>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=w;c[g>>2]=e+2;break}if((r&255)<240){if((h-e|0)<3){t=1;u=41;break b}w=a[e+1|0]|0;v=a[e+2|0]|0;if((s|0)==224){if(!((w&-32)<<24>>24==-96)){t=2;u=41;break b}}else if((s|0)==237){if(!((w&-32)<<24>>24==-128)){t=2;u=41;break b}}else{if(!((w&-64)<<24>>24==-128)){t=2;u=41;break b}}x=v&255;if((x&192|0)!=128){t=2;u=41;break b}v=(w&255)<<6&4032|s<<12|x&63;if((v&65535)>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=v;c[g>>2]=e+3;break}if(!((r&255)<245)){t=2;u=41;break b}if((h-e|0)<4){t=1;u=41;break b}v=a[e+1|0]|0;x=a[e+2|0]|0;w=a[e+3|0]|0;if((s|0)==240){if(!((v+112<<24>>24&255)<48)){t=2;u=41;break b}}else if((s|0)==244){if(!((v&-16)<<24>>24==-128)){t=2;u=41;break b}}else{if(!((v&-64)<<24>>24==-128)){t=2;u=41;break b}}y=x&255;if((y&192|0)!=128){t=2;u=41;break b}x=w&255;if((x&192|0)!=128){t=2;u=41;break b}if((m-p|0)<4){t=1;u=41;break b}w=s&7;z=v&255;v=y<<6;A=x&63;if((z<<12&258048|w<<18|v&4032|A)>>>0>l>>>0){t=2;u=41;break b}b[p>>1]=z<<2&60|y>>>4&3|((z>>>4&3|w<<2)<<6)+16320|55296;w=p+2|0;c[k>>2]=w;b[w>>1]=A|v&960|56320;c[g>>2]=(c[g>>2]|0)+4}}while(0);s=(c[k>>2]|0)+2|0;c[k>>2]=s;r=c[g>>2]|0;if(r>>>0<f>>>0){e=r;p=s}else{q=r;break a}}if((u|0)==41){i=n;return t|0}}else{q=o}}while(0);t=q>>>0<f>>>0|0;i=n;return t|0}function Lk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function Mk(a){a=a|0;i=i;return 0}function Nk(a){a=a|0;i=i;return 0}function Ok(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=i;a=Pk(c,d,e,1114111,0)|0;i=b;return a|0}function Pk(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;do{if((g&4|0)==0){j=b}else{if((c-b|0)<=2){j=b;break}if(!((a[b]|0)==-17)){j=b;break}if(!((a[b+1|0]|0)==-69)){j=b;break}j=(a[b+2|0]|0)==-65?b+3|0:b}}while(0);a:do{if(j>>>0<c>>>0&(e|0)!=0){g=c;k=j;l=0;b:while(1){m=a[k]|0;n=m&255;if(n>>>0>f>>>0){o=k;break a}do{if(m<<24>>24>-1){p=k+1|0;q=l}else{if((m&255)<194){o=k;break a}if((m&255)<224){if((g-k|0)<2){o=k;break a}r=d[k+1|0]|0;if((r&192|0)!=128){o=k;break a}if((r&63|n<<6&1984)>>>0>f>>>0){o=k;break a}p=k+2|0;q=l;break}if((m&255)<240){s=k;if((g-s|0)<3){o=k;break a}r=a[k+1|0]|0;t=a[k+2|0]|0;if((n|0)==237){if(!((r&-32)<<24>>24==-128)){u=23;break b}}else if((n|0)==224){if(!((r&-32)<<24>>24==-96)){u=21;break b}}else{if(!((r&-64)<<24>>24==-128)){u=25;break b}}v=t&255;if((v&192|0)!=128){o=k;break a}if(((r&255)<<6&4032|n<<12&61440|v&63)>>>0>f>>>0){o=k;break a}p=k+3|0;q=l;break}if(!((m&255)<245)){o=k;break a}w=k;if((g-w|0)<4){o=k;break a}if((e-l|0)>>>0<2){o=k;break a}v=a[k+1|0]|0;r=a[k+2|0]|0;t=a[k+3|0]|0;if((n|0)==244){if(!((v&-16)<<24>>24==-128)){u=36;break b}}else if((n|0)==240){if(!((v+112<<24>>24&255)<48)){u=34;break b}}else{if(!((v&-64)<<24>>24==-128)){u=38;break b}}x=r&255;if((x&192|0)!=128){o=k;break a}r=t&255;if((r&192|0)!=128){o=k;break a}if(((v&255)<<12&258048|n<<18&1835008|x<<6&4032|r&63)>>>0>f>>>0){o=k;break a}p=k+4|0;q=l+1|0}}while(0);n=q+1|0;if(p>>>0<c>>>0&n>>>0<e>>>0){k=p;l=n}else{o=p;break a}}if((u|0)==21){y=s-b|0;i=h;return y|0}else if((u|0)==23){y=s-b|0;i=h;return y|0}else if((u|0)==25){y=s-b|0;i=h;return y|0}else if((u|0)==34){y=w-b|0;i=h;return y|0}else if((u|0)==36){y=w-b|0;i=h;return y|0}else if((u|0)==38){y=w-b|0;i=h;return y|0}}else{o=j}}while(0);y=o-b|0;i=h;return y|0}function Qk(a){a=a|0;i=i;return 4}function Rk(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Sk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Tk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d>>2<<2);c[j>>2]=g+((c[k>>2]|0)-g);i=b;return l|0}function Tk(b,d,e,f,g,h,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0;l=i;c[e>>2]=b;c[h>>2]=f;do{if((k&2|0)!=0){if((g-f|0)<3){m=1;i=l;return m|0}else{c[h>>2]=f+1;a[f]=-17;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=-69;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=-65;break}}}while(0);f=c[e>>2]|0;if(!(f>>>0<d>>>0)){m=0;i=l;return m|0}k=g;g=f;a:while(1){f=c[g>>2]|0;if((f&-2048|0)==55296|f>>>0>j>>>0){m=2;n=19;break}do{if(f>>>0<128){b=c[h>>2]|0;if((k-b|0)<1){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f}else{if(f>>>0<2048){b=c[h>>2]|0;if((k-b|0)<2){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>6|192;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f&63|128;break}b=c[h>>2]|0;o=k-b|0;if(f>>>0<65536){if((o|0)<3){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>12|224;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=f>>>6&63|128;p=c[h>>2]|0;c[h>>2]=p+1;a[p]=f&63|128;break}else{if((o|0)<4){m=1;n=19;break a}c[h>>2]=b+1;a[b]=f>>>18|240;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f>>>12&63|128;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f>>>6&63|128;b=c[h>>2]|0;c[h>>2]=b+1;a[b]=f&63|128;break}}}while(0);f=(c[e>>2]|0)+4|0;c[e>>2]=f;if(f>>>0<d>>>0){g=f}else{m=0;n=19;break}}if((n|0)==19){i=l;return m|0}return 0}function Uk(a,b,d,e,f,g,h,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0;b=i;i=i+16|0;a=b;k=b+8|0;c[a>>2]=d;c[k>>2]=g;l=Vk(d,e,a,g,h,k,1114111,0)|0;c[f>>2]=d+((c[a>>2]|0)-d);c[j>>2]=g+((c[k>>2]|0)-g>>2<<2);i=b;return l|0}function Vk(b,e,f,g,h,j,k,l){b=b|0;e=e|0;f=f|0;g=g|0;h=h|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,u=0,v=0,w=0;m=i;c[f>>2]=b;c[j>>2]=g;g=c[f>>2]|0;do{if((l&4|0)==0){n=g}else{if((e-g|0)<=2){n=g;break}if(!((a[g]|0)==-17)){n=g;break}if(!((a[g+1|0]|0)==-69)){n=g;break}if(!((a[g+2|0]|0)==-65)){n=g;break}b=g+3|0;c[f>>2]=b;n=b}}while(0);a:do{if(n>>>0<e>>>0){g=e;l=n;b=c[j>>2]|0;while(1){if(!(b>>>0<h>>>0)){o=l;p=39;break a}q=a[l]|0;r=q&255;do{if(q<<24>>24>-1){if(r>>>0>k>>>0){s=2;break a}c[b>>2]=r;c[f>>2]=l+1}else{if((q&255)<194){s=2;break a}if((q&255)<224){if((g-l|0)<2){s=1;break a}t=d[l+1|0]|0;if((t&192|0)!=128){s=2;break a}u=t&63|r<<6&1984;if(u>>>0>k>>>0){s=2;break a}c[b>>2]=u;c[f>>2]=l+2;break}if((q&255)<240){if((g-l|0)<3){s=1;break a}u=a[l+1|0]|0;t=a[l+2|0]|0;if((r|0)==237){if(!((u&-32)<<24>>24==-128)){s=2;break a}}else if((r|0)==224){if(!((u&-32)<<24>>24==-96)){s=2;break a}}else{if(!((u&-64)<<24>>24==-128)){s=2;break a}}v=t&255;if((v&192|0)!=128){s=2;break a}t=(u&255)<<6&4032|r<<12&61440|v&63;if(t>>>0>k>>>0){s=2;break a}c[b>>2]=t;c[f>>2]=l+3;break}if(!((q&255)<245)){s=2;break a}if((g-l|0)<4){s=1;break a}t=a[l+1|0]|0;v=a[l+2|0]|0;u=a[l+3|0]|0;if((r|0)==244){if(!((t&-16)<<24>>24==-128)){s=2;break a}}else if((r|0)==240){if(!((t+112<<24>>24&255)<48)){s=2;break a}}else{if(!((t&-64)<<24>>24==-128)){s=2;break a}}w=v&255;if((w&192|0)!=128){s=2;break a}v=u&255;if((v&192|0)!=128){s=2;break a}u=(t&255)<<12&258048|r<<18&1835008|w<<6&4032|v&63;if(u>>>0>k>>>0){s=2;break a}c[b>>2]=u;c[f>>2]=l+4}}while(0);r=(c[j>>2]|0)+4|0;c[j>>2]=r;q=c[f>>2]|0;if(q>>>0<e>>>0){l=q;b=r}else{o=q;p=39;break}}}else{o=n;p=39}}while(0);if((p|0)==39){s=o>>>0<e>>>0|0}i=m;return s|0}function Wk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;c[f>>2]=d;i=i;return 3}function Xk(a){a=a|0;i=i;return 0}function Yk(a){a=a|0;i=i;return 0}function Zk(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=i;a=_k(c,d,e,1114111,0)|0;i=b;return a|0}function _k(b,c,e,f,g){b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;do{if((g&4|0)==0){j=b}else{if((c-b|0)<=2){j=b;break}if(!((a[b]|0)==-17)){j=b;break}if(!((a[b+1|0]|0)==-69)){j=b;break}j=(a[b+2|0]|0)==-65?b+3|0:b}}while(0);a:do{if(j>>>0<c>>>0&(e|0)!=0){g=c;k=j;l=1;b:while(1){m=a[k]|0;n=m&255;do{if(m<<24>>24>-1){if(n>>>0>f>>>0){o=k;break a}p=k+1|0}else{if((m&255)<194){o=k;break a}if((m&255)<224){if((g-k|0)<2){o=k;break a}q=d[k+1|0]|0;if((q&192|0)!=128){o=k;break a}if((q&63|n<<6&1984)>>>0>f>>>0){o=k;break a}p=k+2|0;break}if((m&255)<240){r=k;if((g-r|0)<3){o=k;break a}q=a[k+1|0]|0;s=a[k+2|0]|0;if((n|0)==224){if(!((q&-32)<<24>>24==-96)){t=21;break b}}else if((n|0)==237){if(!((q&-32)<<24>>24==-128)){t=23;break b}}else{if(!((q&-64)<<24>>24==-128)){t=25;break b}}u=s&255;if((u&192|0)!=128){o=k;break a}if(((q&255)<<6&4032|n<<12&61440|u&63)>>>0>f>>>0){o=k;break a}p=k+3|0;break}if(!((m&255)<245)){o=k;break a}v=k;if((g-v|0)<4){o=k;break a}u=a[k+1|0]|0;q=a[k+2|0]|0;s=a[k+3|0]|0;if((n|0)==240){if(!((u+112<<24>>24&255)<48)){t=33;break b}}else if((n|0)==244){if(!((u&-16)<<24>>24==-128)){t=35;break b}}else{if(!((u&-64)<<24>>24==-128)){t=37;break b}}w=q&255;if((w&192|0)!=128){o=k;break a}q=s&255;if((q&192|0)!=128){o=k;break a}if(((u&255)<<12&258048|n<<18&1835008|w<<6&4032|q&63)>>>0>f>>>0){o=k;break a}p=k+4|0}}while(0);if(!(p>>>0<c>>>0&l>>>0<e>>>0)){o=p;break a}k=p;l=l+1|0}if((t|0)==21){x=r-b|0;i=h;return x|0}else if((t|0)==23){x=r-b|0;i=h;return x|0}else if((t|0)==25){x=r-b|0;i=h;return x|0}else if((t|0)==33){x=v-b|0;i=h;return x|0}else if((t|0)==35){x=v-b|0;i=h;return x|0}else if((t|0)==37){x=v-b|0;i=h;return x|0}}else{o=j}}while(0);x=o-b|0;i=h;return x|0}function $k(a){a=a|0;i=i;return 4}function al(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function bl(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function cl(a){a=a|0;var b=0;b=i;c[a>>2]=230520;me(a+12|0);Im(a);i=b;return}function dl(a){a=a|0;var b=0;b=i;c[a>>2]=230520;me(a+12|0);i=b;return}function el(a){a=a|0;var b=0;b=i;c[a>>2]=230560;me(a+16|0);Im(a);i=b;return}function fl(a){a=a|0;var b=0;b=i;c[a>>2]=230560;me(a+16|0);i=b;return}function gl(b){b=b|0;i=i;return a[b+8|0]|0}function hl(a){a=a|0;i=i;return c[a+8>>2]|0}function il(b){b=b|0;i=i;return a[b+9|0]|0}function jl(a){a=a|0;i=i;return c[a+12>>2]|0}function kl(a,b){a=a|0;b=b|0;var c=0;c=i;je(a,b+12|0);i=c;return}function ll(a,b){a=a|0;b=b|0;var c=0;c=i;je(a,b+16|0);i=c;return}function ml(a,b){a=a|0;b=b|0;b=i;ke(a,230592,4);i=b;return}function nl(a,b){a=a|0;b=b|0;b=i;ve(a,230600,bm(230600)|0);i=b;return}function ol(a,b){a=a|0;b=b|0;b=i;ke(a,230624,5);i=b;return}function pl(a,b){a=a|0;b=b|0;b=i;ve(a,230632,bm(230632)|0);i=b;return}function ql(b){b=b|0;var d=0;b=i;if((a[230664]|0)!=0){d=c[57664]|0;i=b;return d|0}if((Na(230664)|0)==0){d=c[57664]|0;i=b;return d|0}do{if((a[237864]|0)==0){if((Na(237864)|0)==0){break}Ym(237696,0,168)|0;Ra(116,0,p|0)|0;_a(237864)}}while(0);ne(237696,237872)|0;ne(237708|0,237880)|0;ne(237720|0,237888)|0;ne(237732|0,237896)|0;ne(237744|0,237912)|0;ne(237756|0,237928)|0;ne(237768|0,237936)|0;ne(237780|0,237952)|0;ne(237792|0,237960)|0;ne(237804|0,237968)|0;ne(237816|0,237976)|0;ne(237828|0,237984)|0;ne(237840|0,237992)|0;ne(237852|0,238e3)|0;c[57664]=237696;_a(230664);d=c[57664]|0;i=b;return d|0}function rl(b){b=b|0;var d=0;b=i;if((a[230680]|0)!=0){d=c[57668]|0;i=b;return d|0}if((Na(230680)|0)==0){d=c[57668]|0;i=b;return d|0}do{if((a[237328]|0)==0){if((Na(237328)|0)==0){break}Ym(237160,0,168)|0;Ra(117,0,p|0)|0;_a(237328)}}while(0);ye(237160,237336)|0;ye(237172|0,237368)|0;ye(237184|0,237400)|0;ye(237196|0,237432)|0;ye(237208|0,237472)|0;ye(237220|0,237512)|0;ye(237232|0,237544)|0;ye(237244|0,237584)|0;ye(237256|0,237600)|0;ye(237268|0,237616)|0;ye(237280|0,237632)|0;ye(237292|0,237648)|0;ye(237304|0,237664)|0;ye(237316|0,237680)|0;c[57668]=237160;_a(230680);d=c[57668]|0;i=b;return d|0}function sl(b){b=b|0;var d=0;b=i;if((a[230696]|0)!=0){d=c[57672]|0;i=b;return d|0}if((Na(230696)|0)==0){d=c[57672]|0;i=b;return d|0}do{if((a[236936]|0)==0){if((Na(236936)|0)==0){break}Ym(236648,0,288)|0;Ra(118,0,p|0)|0;_a(236936)}}while(0);ne(236648,236944)|0;ne(236660|0,236952)|0;ne(236672|0,236968)|0;ne(236684|0,236976)|0;ne(236696|0,236984)|0;ne(236708|0,236992)|0;ne(236720|0,237e3)|0;ne(236732|0,237008)|0;ne(236744|0,237016)|0;ne(236756|0,237032)|0;ne(236768|0,237040)|0;ne(236780|0,237056)|0;ne(236792|0,237072)|0;ne(236804|0,237080)|0;ne(236816|0,237088)|0;ne(236828|0,237096)|0;ne(236840|0,236984)|0;ne(236852|0,237104)|0;ne(236864|0,237112)|0;ne(236876|0,237120)|0;ne(236888|0,237128)|0;ne(236900|0,237136)|0;ne(236912|0,237144)|0;ne(236924|0,237152)|0;c[57672]=236648;_a(230696);d=c[57672]|0;i=b;return d|0}function tl(b){b=b|0;var d=0;b=i;if((a[230712]|0)!=0){d=c[57676]|0;i=b;return d|0}if((Na(230712)|0)==0){d=c[57676]|0;i=b;return d|0}do{if((a[236096]|0)==0){if((Na(236096)|0)==0){break}Ym(235808,0,288)|0;Ra(119,0,p|0)|0;_a(236096)}}while(0);ye(235808,236104)|0;ye(235820|0,236136)|0;ye(235832|0,236176)|0;ye(235844|0,236200)|0;ye(235856|0,236520)|0;ye(235868|0,236224)|0;ye(235880|0,236248)|0;ye(235892|0,236272)|0;ye(235904|0,236304)|0;ye(235916|0,236344)|0;ye(235928|0,236376)|0;ye(235940|0,236416)|0;ye(235952|0,236456)|0;ye(235964|0,236472)|0;ye(235976|0,236488)|0;ye(235988|0,236504)|0;ye(236e3|0,236520)|0;ye(236012|0,236536)|0;ye(236024|0,236552)|0;ye(236036|0,236568)|0;ye(236048|0,236584)|0;ye(236060|0,236600)|0;ye(236072|0,236616)|0;ye(236084|0,236632)|0;c[57676]=235808;_a(230712);d=c[57676]|0;i=b;return d|0}function ul(b){b=b|0;var d=0;b=i;if((a[230728]|0)!=0){d=c[57680]|0;i=b;return d|0}if((Na(230728)|0)==0){d=c[57680]|0;i=b;return d|0}do{if((a[235784]|0)==0){if((Na(235784)|0)==0){break}Ym(235496,0,288)|0;Ra(120,0,p|0)|0;_a(235784)}}while(0);ne(235496,235792)|0;ne(235508|0,235800)|0;c[57680]=235496;_a(230728);d=c[57680]|0;i=b;return d|0}function vl(b){b=b|0;var d=0;b=i;if((a[230744]|0)!=0){d=c[57684]|0;i=b;return d|0}if((Na(230744)|0)==0){d=c[57684]|0;i=b;return d|0}do{if((a[235456]|0)==0){if((Na(235456)|0)==0){break}Ym(235168,0,288)|0;Ra(121,0,p|0)|0;_a(235456)}}while(0);ye(235168,235464)|0;ye(235180|0,235480)|0;c[57684]=235168;_a(230744);d=c[57684]|0;i=b;return d|0}function wl(b){b=b|0;b=i;do{if((a[230768]|0)==0){if((Na(230768)|0)==0){break}ke(230752,230776,8);Ra(122,230752,p|0)|0;_a(230768)}}while(0);i=b;return 230752}function xl(b){b=b|0;b=i;if((a[230808]|0)!=0){i=b;return 230792}if((Na(230808)|0)==0){i=b;return 230792}ve(230792,230816,bm(230816)|0);Ra(123,230792,p|0)|0;_a(230808);i=b;return 230792}function yl(b){b=b|0;b=i;do{if((a[230872]|0)==0){if((Na(230872)|0)==0){break}ke(230856,230880,8);Ra(122,230856,p|0)|0;_a(230872)}}while(0);i=b;return 230856}function zl(b){b=b|0;b=i;if((a[230912]|0)!=0){i=b;return 230896}if((Na(230912)|0)==0){i=b;return 230896}ve(230896,230920,bm(230920)|0);Ra(123,230896,p|0)|0;_a(230912);i=b;return 230896}function Al(b){b=b|0;b=i;do{if((a[230976]|0)==0){if((Na(230976)|0)==0){break}ke(230960,230984,20);Ra(122,230960,p|0)|0;_a(230976)}}while(0);i=b;return 230960}function Bl(b){b=b|0;b=i;if((a[231024]|0)!=0){i=b;return 231008}if((Na(231024)|0)==0){i=b;return 231008}ve(231008,231032,bm(231032)|0);Ra(123,231008,p|0)|0;_a(231024);i=b;return 231008}function Cl(b){b=b|0;b=i;do{if((a[231136]|0)==0){if((Na(231136)|0)==0){break}ke(231120,231144,11);Ra(122,231120,p|0)|0;_a(231136)}}while(0);i=b;return 231120}function Dl(b){b=b|0;b=i;if((a[231176]|0)!=0){i=b;return 231160}if((Na(231176)|0)==0){i=b;return 231160}ve(231160,231184,bm(231184)|0);Ra(123,231160,p|0)|0;_a(231176);i=b;return 231160}function El(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=ab()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);l=+Wm(b,g,c[57560]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)!=34){h=l;i=f;return+h}c[e>>2]=4;h=l;i=f;return+h}function Fl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=ab()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);l=+Wm(b,g,c[57560]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)!=34){h=l;i=f;return+h}c[e>>2]=4;h=l;i=f;return+h}function Gl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,j=0,k=0,l=0.0;f=i;i=i+8|0;g=f;if((b|0)==(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}j=ab()|0;k=c[j>>2]|0;c[j>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);l=+Wm(b,g,c[57560]|0);b=c[j>>2]|0;if((b|0)==0){c[j>>2]=k}if((c[g>>2]|0)!=(d|0)){c[e>>2]=4;h=0.0;i=f;return+h}if((b|0)==34){c[e>>2]=4}h=l;i=f;return+h}function Hl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+8|0;h=g;do{if((b|0)==(d|0)){c[e>>2]=4;j=0;k=0}else{if((a[b]|0)==45){c[e>>2]=4;j=0;k=0;break}l=ab()|0;m=c[l>>2]|0;c[l>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);n=Ob(b|0,h|0,f|0,c[57560]|0)|0;o=c[l>>2]|0;if((o|0)==0){c[l>>2]=m}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;k=0;break}if((o|0)!=34){j=n;k=I;break}c[e>>2]=4;j=-1;k=-1}}while(0);I=k;i=g;return j|0}function Il(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=ab()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);m=Ob(b|0,h|0,f|0,c[57560]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>4294967295)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m;i=g;return j|0}return 0}function Jl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=ab()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);m=Ob(b|0,h|0,f|0,c[57560]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>4294967295)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m;i=g;return j|0}return 0}function Kl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((a[b]|0)==45){c[e>>2]=4;j=0;i=g;return j|0}k=ab()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);m=Ob(b|0,h|0,f|0,c[57560]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}if((b|0)==34|(f>>>0>0|(f|0)==0&m>>>0>65535)){c[e>>2]=4;j=-1;i=g;return j|0}else{j=m&65535;i=g;return j|0}return 0}function Ll(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;k=0;I=k;i=g;return j|0}l=ab()|0;m=c[l>>2]|0;c[l>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);n=Ia(b|0,h|0,f|0,c[57560]|0)|0;f=I;b=c[l>>2]|0;if((b|0)==0){c[l>>2]=m}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;k=0;I=k;i=g;return j|0}if((b|0)==34){c[e>>2]=4;e=(f|0)>0|(f|0)==0&n>>>0>0;I=e?2147483647:-2147483648;i=g;return(e?-1:0)|0}else{j=n;k=f;I=k;i=g;return j|0}return 0}function Ml(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g;if((b|0)==(d|0)){c[e>>2]=4;j=0;i=g;return j|0}k=ab()|0;l=c[k>>2]|0;c[k>>2]=0;do{if((a[230248]|0)==0){if((Na(230248)|0)==0){break}c[57560]=kb(2147483647,230256,0)|0;_a(230248)}}while(0);m=Ia(b|0,h|0,f|0,c[57560]|0)|0;f=I;b=c[k>>2]|0;if((b|0)==0){c[k>>2]=l}if((c[h>>2]|0)!=(d|0)){c[e>>2]=4;j=0;i=g;return j|0}do{if((b|0)==34){c[e>>2]=4;if((f|0)>0|(f|0)==0&m>>>0>0){j=2147483647}else{break}i=g;return j|0}else{if((f|0)<-1|(f|0)==-1&m>>>0<2147483648){c[e>>2]=4;break}if((f|0)>0|(f|0)==0&m>>>0>2147483647){c[e>>2]=4;j=2147483647;i=g;return j|0}else{j=m;i=g;return j|0}}}while(0);j=-2147483648;i=g;return j|0}function Nl(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=i;e=a+4|0;f=e;g=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24;f=e+4|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24;f=(c[a>>2]|0)+(e>>1)|0;a=f;if((e&1|0)==0){h=g;jc[h&127](a);i=b;return}else{h=c[(c[f>>2]|0)+g>>2]|0;jc[h&127](a);i=b;return}}function Ol(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=b+8|0;g=b+4|0;h=c[g>>2]|0;j=c[f>>2]|0;k=h;if(!(j-k>>2>>>0<d>>>0)){l=d;m=h;do{if((m|0)==0){n=0}else{c[m>>2]=0;n=c[g>>2]|0}m=n+4|0;c[g>>2]=m;l=l+ -1|0;}while((l|0)!=0);i=e;return}l=b+16|0;m=b;n=c[m>>2]|0;h=k-n>>2;k=h+d|0;if(k>>>0>1073741823){Ij(0)}o=j-n|0;do{if(o>>2>>>0<536870911){n=o>>1;j=n>>>0<k>>>0?k:n;if((j|0)==0){p=0;q=0;break}n=b+128|0;if(!((a[n]|0)==0&j>>>0<29)){r=j;s=11;break}a[n]=1;p=j;q=l}else{r=1073741823;s=11}}while(0);if((s|0)==11){p=r;q=Gm(r<<2)|0}r=d;d=q+(h<<2)|0;do{if((d|0)==0){t=0}else{c[d>>2]=0;t=d}d=t+4|0;r=r+ -1|0;}while((r|0)!=0);r=c[m>>2]|0;t=(c[g>>2]|0)-r|0;s=q+(h-(t>>2)<<2)|0;h=r;$m(s|0,h|0,t|0)|0;c[m>>2]=s;c[g>>2]=d;c[f>>2]=q+(p<<2);if((r|0)==0){i=e;return}if((l|0)==(r|0)){a[b+128|0]=0;i=e;return}else{Im(h);i=e;return}}function Pl(a){a=a|0;a=i;xe(235444|0);xe(235432|0);xe(235420|0);xe(235408|0);xe(235396|0);xe(235384|0);xe(235372|0);xe(235360|0);xe(235348|0);xe(235336|0);xe(235324|0);xe(235312|0);xe(235300|0);xe(235288|0);xe(235276|0);xe(235264|0);xe(235252|0);xe(235240|0);xe(235228|0);xe(235216|0);xe(235204|0);xe(235192|0);xe(235180|0);xe(235168);i=a;return}function Ql(a){a=a|0;a=i;me(235772|0);me(235760|0);me(235748|0);me(235736|0);me(235724|0);me(235712|0);me(235700|0);me(235688|0);me(235676|0);me(235664|0);me(235652|0);me(235640|0);me(235628|0);me(235616|0);me(235604|0);me(235592|0);me(235580|0);me(235568|0);me(235556|0);me(235544|0);me(235532|0);me(235520|0);me(235508|0);me(235496);i=a;return}function Rl(a){a=a|0;a=i;xe(236084|0);xe(236072|0);xe(236060|0);xe(236048|0);xe(236036|0);xe(236024|0);xe(236012|0);xe(236e3|0);xe(235988|0);xe(235976|0);xe(235964|0);xe(235952|0);xe(235940|0);xe(235928|0);xe(235916|0);xe(235904|0);xe(235892|0);xe(235880|0);xe(235868|0);xe(235856|0);xe(235844|0);xe(235832|0);xe(235820|0);xe(235808);i=a;return}function Sl(a){a=a|0;a=i;me(236924|0);me(236912|0);me(236900|0);me(236888|0);me(236876|0);me(236864|0);me(236852|0);me(236840|0);me(236828|0);me(236816|0);me(236804|0);me(236792|0);me(236780|0);me(236768|0);me(236756|0);me(236744|0);me(236732|0);me(236720|0);me(236708|0);me(236696|0);me(236684|0);me(236672|0);me(236660|0);me(236648);i=a;return}function Tl(a){a=a|0;a=i;xe(237316|0);xe(237304|0);xe(237292|0);xe(237280|0);xe(237268|0);xe(237256|0);xe(237244|0);xe(237232|0);xe(237220|0);xe(237208|0);xe(237196|0);xe(237184|0);xe(237172|0);xe(237160);i=a;return}function Ul(a){a=a|0;a=i;me(237852|0);me(237840|0);me(237828|0);me(237816|0);me(237804|0);me(237792|0);me(237780|0);me(237768|0);me(237756|0);me(237744|0);me(237732|0);me(237720|0);me(237708|0);me(237696);i=a;return}function Vl(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=i;e=Wl(0,a,b,(c|0)!=0?c:238216)|0;i=d;return e|0}function Wl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;g=i;i=i+8|0;h=g;c[h>>2]=b;j=(f|0)==0?238224:f;f=c[j>>2]|0;a:do{if((d|0)==0){if((f|0)==0){k=0}else{break}i=g;return k|0}else{if((b|0)==0){l=h;c[h>>2]=l;m=l}else{m=b}if((e|0)==0){k=-2;i=g;return k|0}do{if((f|0)==0){l=a[d]|0;n=l&255;if(l<<24>>24>-1){c[m>>2]=n;k=l<<24>>24!=0|0;i=g;return k|0}else{l=n+ -194|0;if(l>>>0>50){break a}o=e+ -1|0;p=c[238008+(l<<2)>>2]|0;q=d+1|0;break}}else{o=e;p=f;q=d}}while(0);b:do{if((o|0)==0){r=p}else{l=a[q]|0;n=(l&255)>>>3;if((n+ -16|n+(p>>26))>>>0>7){break a}else{s=o;t=l;u=p;v=q}while(1){v=v+1|0;u=(t&255)+ -128|u<<6;s=s+ -1|0;if((u|0)>=0){break}if((s|0)==0){r=u;break b}t=a[v]|0;if(((t&255)+ -128|0)>>>0>63){break a}}c[j>>2]=0;c[m>>2]=u;k=e-s|0;i=g;return k|0}}while(0);c[j>>2]=r;k=-2;i=g;return k|0}}while(0);c[j>>2]=0;c[(ab()|0)>>2]=84;k=-1;i=g;return k|0}function Xl(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,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;g=i;i=i+1032|0;h=g+1024|0;j=c[b>>2]|0;c[h>>2]=j;k=(a|0)!=0;l=g;m=k?e:256;e=k?a:l;a:do{if((j|0)==0|(m|0)==0){n=d;o=m;p=j;q=0;r=e}else{a=d;s=m;t=j;u=0;v=e;while(1){w=a>>>2;x=w>>>0>=s>>>0;if(!(x|a>>>0>131)){n=a;o=s;p=t;q=u;r=v;break a}y=x?s:w;z=a-y|0;w=Yl(v,h,y,f)|0;if((w|0)==-1){break}if((v|0)==(l|0)){A=s;B=l}else{A=s-w|0;B=v+(w<<2)|0}y=w+u|0;w=c[h>>2]|0;if((w|0)==0|(A|0)==0){n=z;o=A;p=w;q=y;r=B;break a}else{a=z;s=A;t=w;u=y;v=B}}n=z;o=0;p=c[h>>2]|0;q=-1;r=v}}while(0);b:do{if((p|0)==0){C=q}else{if((o|0)==0|(n|0)==0){C=q;break}else{D=n;E=o;F=p;G=q;H=r}while(1){I=Wl(H,F,D,f)|0;if((I+2|0)>>>0<3){break}z=(c[h>>2]|0)+I|0;c[h>>2]=z;B=E+ -1|0;A=G+1|0;if((B|0)==0|(D|0)==(I|0)){C=A;break b}else{D=D-I|0;E=B;F=z;G=A;H=H+4|0}}if((I|0)==0){c[h>>2]=0;C=G;break}else if((I|0)==-1){C=-1;break}else{c[f>>2]=0;C=G;break}}}while(0);if(!k){i=g;return C|0}c[b>>2]=c[h>>2];i=g;return C|0}function Yl(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=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,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;h=i;j=c[e>>2]|0;do{if((g|0)==0){k=5}else{l=g;m=c[l>>2]|0;if((m|0)==0){k=5;break}if((b|0)==0){n=f;o=m;p=j;k=16;break}c[l>>2]=0;q=b;r=f;s=m;t=j;k=36}}while(0);if((k|0)==5){if((b|0)==0){u=f;v=j;k=7}else{w=b;x=f;y=j;k=6}}a:while(1){if((k|0)==6){k=0;if((x|0)==0){z=f;k=53;break}else{A=w;B=x;C=y}while(1){j=a[C]|0;do{if(((j&255)+ -1|0)>>>0<127){if((C&3|0)==0&B>>>0>3){D=A;E=B;F=C}else{G=A;H=B;I=j;J=C;break}while(1){K=c[F>>2]|0;if(((K+ -16843009|K)&-2139062144|0)!=0){k=30;break}c[D>>2]=K&255;c[D+4>>2]=d[F+1|0]|0;c[D+8>>2]=d[F+2|0]|0;L=F+4|0;M=D+16|0;c[D+12>>2]=d[F+3|0]|0;N=E+ -4|0;if(N>>>0>3){D=M;E=N;F=L}else{k=31;break}}if((k|0)==30){k=0;G=D;H=E;I=K&255;J=F;break}else if((k|0)==31){k=0;G=M;H=N;I=a[L]|0;J=L;break}}else{G=A;H=B;I=j;J=C}}while(0);O=I&255;if(!((O+ -1|0)>>>0<127)){break}c[G>>2]=O;j=H+ -1|0;if((j|0)==0){z=f;k=53;break a}else{A=G+4|0;B=j;C=J+1|0}}j=O+ -194|0;if(j>>>0>50){P=G;Q=H;R=J;k=47;break}q=G;r=H;s=c[238008+(j<<2)>>2]|0;t=J+1|0;k=36;continue}else if((k|0)==7){k=0;j=a[v]|0;do{if(((j&255)+ -1|0)>>>0<127){if((v&3|0)!=0){S=u;T=j;U=v;break}g=c[v>>2]|0;if(((g+ -16843009|g)&-2139062144|0)==0){m=u;l=v;while(1){V=l+4|0;W=m+ -4|0;X=c[V>>2]|0;if(((X+ -16843009|X)&-2139062144|0)==0){l=V;m=W}else{Y=W;Z=X;_=V;break}}}else{Y=u;Z=g;_=v}S=Y;T=Z&255;U=_}else{S=u;T=j;U=v}}while(0);j=T&255;if((j+ -1|0)>>>0<127){u=S+ -1|0;v=U+1|0;k=7;continue}m=j+ -194|0;if(m>>>0>50){P=b;Q=S;R=U;k=47;break}n=S;o=c[238008+(m<<2)>>2]|0;p=U+1|0;k=16;continue}else if((k|0)==16){k=0;m=(d[p]|0)>>>3;if((m+ -16|m+(o>>26))>>>0>7){k=17;break}m=p+1|0;do{if((o&33554432|0)==0){$=m}else{if(((d[m]|0)+ -128|0)>>>0>63){k=20;break a}j=p+2|0;if((o&524288|0)==0){$=j;break}if(((d[j]|0)+ -128|0)>>>0>63){k=23;break a}$=p+3|0}}while(0);u=n+ -1|0;v=$;k=7;continue}else if((k|0)==36){k=0;m=d[t]|0;j=m>>>3;if((j+ -16|j+(s>>26))>>>0>7){k=37;break}j=t+1|0;aa=m+ -128|s<<6;do{if((aa|0)<0){m=(d[j]|0)+ -128|0;if(m>>>0>63){k=40;break a}l=t+2|0;ba=m|aa<<6;if((ba|0)>=0){ca=ba;da=l;break}m=(d[l]|0)+ -128|0;if(m>>>0>63){k=43;break a}ca=m|ba<<6;da=t+3|0}else{ca=aa;da=j}}while(0);c[q>>2]=ca;w=q+4|0;x=r+ -1|0;y=da;k=6;continue}}if((k|0)==17){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==20){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==23){ea=b;fa=n;ga=o;ha=p+ -1|0;k=46}else if((k|0)==37){ea=q;fa=r;ga=s;ha=t+ -1|0;k=46}else if((k|0)==40){ea=q;fa=r;ga=aa;ha=t+ -1|0;k=46}else if((k|0)==43){ea=q;fa=r;ga=ba;ha=t+ -1|0;k=46}else if((k|0)==53){i=h;return z|0}if((k|0)==46){if((ga|0)==0){P=ea;Q=fa;R=ha;k=47}else{ia=ea;ja=ha}}do{if((k|0)==47){if((a[R]|0)!=0){ia=P;ja=R;break}if((P|0)!=0){c[P>>2]=0;c[e>>2]=0}z=f-Q|0;i=h;return z|0}}while(0);c[(ab()|0)>>2]=84;if((ia|0)==0){z=-1;i=h;return z|0}c[e>>2]=ja;z=-1;i=h;return z|0}function Zl(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g;c[h>>2]=b;if((e|0)==0){j=0;i=g;return j|0}do{if((f|0)!=0){if((b|0)==0){k=h;c[h>>2]=k;l=k}else{l=b}k=a[e]|0;m=k&255;if(k<<24>>24>-1){c[l>>2]=m;j=k<<24>>24!=0|0;i=g;return j|0}k=m+ -194|0;if(k>>>0>50){break}m=e+1|0;n=c[238008+(k<<2)>>2]|0;if(f>>>0<4){if((n&-2147483648>>>((f*6|0)+ -6|0)|0)!=0){break}}k=d[m]|0;m=k>>>3;if((m+ -16|m+(n>>26))>>>0>7){break}m=k+ -128|n<<6;if((m|0)>=0){c[l>>2]=m;j=2;i=g;return j|0}n=(d[e+2|0]|0)+ -128|0;if(n>>>0>63){break}k=n|m<<6;if((k|0)>=0){c[l>>2]=k;j=3;i=g;return j|0}m=(d[e+3|0]|0)+ -128|0;if(m>>>0>63){break}c[l>>2]=m|k<<6;j=4;i=g;return j|0}}while(0);c[(ab()|0)>>2]=84;j=-1;i=g;return j|0}function _l(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=i;if((b|0)==0){f=1;i=e;return f|0}if(d>>>0<128){a[b]=d;f=1;i=e;return f|0}if(d>>>0<2048){a[b]=d>>>6|192;a[b+1|0]=d&63|128;f=2;i=e;return f|0}if(d>>>0<55296|(d+ -57344|0)>>>0<8192){a[b]=d>>>12|224;a[b+1|0]=d>>>6&63|128;a[b+2|0]=d&63|128;f=3;i=e;return f|0}if((d+ -65536|0)>>>0<1048576){a[b]=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;f=4;i=e;return f|0}else{c[(ab()|0)>>2]=84;f=-1;i=e;return f|0}return 0}function $l(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,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;f=i;i=i+264|0;g=f+256|0;h=f;j=c[b>>2]|0;c[g>>2]=j;k=(a|0)!=0;l=k?e:256;e=k?a:h;a:do{if((j|0)==0|(l|0)==0){m=d;n=l;o=j;p=0;q=e}else{a=d;r=l;s=j;t=0;u=e;while(1){v=a>>>0>=r>>>0;if(!(v|a>>>0>32)){m=a;n=r;o=s;p=t;q=u;break a}w=v?r:a;x=a-w|0;v=am(u,g,w,0)|0;if((v|0)==-1){break}if((u|0)==(h|0)){y=r;z=h}else{y=r-v|0;z=u+v|0}w=v+t|0;v=c[g>>2]|0;if((v|0)==0|(y|0)==0){m=x;n=y;o=v;p=w;q=z;break a}else{a=x;r=y;s=v;t=w;u=z}}m=x;n=0;o=c[g>>2]|0;p=-1;q=u}}while(0);b:do{if((o|0)==0){A=p}else{if((n|0)==0|(m|0)==0){A=p;break}else{B=m;C=n;D=o;E=p;F=q}while(1){G=_l(F,c[D>>2]|0,0)|0;if((G+1|0)>>>0<2){break}x=(c[g>>2]|0)+4|0;c[g>>2]=x;z=B+ -1|0;y=E+1|0;if((C|0)==(G|0)|(z|0)==0){A=y;break b}else{B=z;C=C-G|0;D=x;E=y;F=F+G|0}}if((G|0)!=0){A=-1;break}c[g>>2]=0;A=E}}while(0);if(!k){i=f;return A|0}c[b>>2]=c[g>>2];i=f;return A|0}function am(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=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;f=i;i=i+8|0;g=f;if((b|0)==0){h=c[d>>2]|0;j=g;k=c[h>>2]|0;if((k|0)==0){l=0;i=f;return l|0}else{m=0;n=k;o=h}while(1){if(n>>>0>127){h=_l(j,n,0)|0;if((h|0)==-1){l=-1;p=26;break}else{q=h}}else{q=1}h=q+m|0;k=o+4|0;r=c[k>>2]|0;if((r|0)==0){l=h;p=26;break}else{m=h;n=r;o=k}}if((p|0)==26){i=f;return l|0}}a:do{if(e>>>0>3){o=b;n=e;m=c[d>>2]|0;while(1){q=c[m>>2]|0;if((q|0)==0){s=o;t=n;break a}if(q>>>0>127){j=_l(o,q,0)|0;if((j|0)==-1){l=-1;break}u=o+j|0;v=n-j|0;w=m}else{a[o]=q;u=o+1|0;v=n+ -1|0;w=c[d>>2]|0}q=w+4|0;c[d>>2]=q;if(v>>>0>3){o=u;n=v;m=q}else{s=u;t=v;break a}}i=f;return l|0}else{s=b;t=e}}while(0);b:do{if((t|0)==0){x=0}else{b=g;v=s;u=t;w=c[d>>2]|0;while(1){m=c[w>>2]|0;if((m|0)==0){p=24;break}if(m>>>0>127){n=_l(b,m,0)|0;if((n|0)==-1){l=-1;p=26;break}if(n>>>0>u>>>0){p=20;break}_l(v,c[w>>2]|0,0)|0;y=v+n|0;z=u-n|0;A=w}else{a[v]=m;y=v+1|0;z=u+ -1|0;A=c[d>>2]|0}m=A+4|0;c[d>>2]=m;if((z|0)==0){x=0;break b}else{v=y;u=z;w=m}}if((p|0)==20){l=e-u|0;i=f;return l|0}else if((p|0)==24){a[v]=0;x=u;break}else if((p|0)==26){i=f;return l|0}}}while(0);c[d>>2]=0;l=e-x|0;i=f;return l|0}function bm(a){a=a|0;var b=0,d=0;b=i;d=a;while(1){if((c[d>>2]|0)==0){break}else{d=d+4|0}}i=b;return d-a>>2|0}function cm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((d|0)==0){i=e;return a|0}else{f=d;g=b;h=a}while(1){b=f+ -1|0;c[h>>2]=c[g>>2];if((b|0)==0){break}else{h=h+4|0;g=g+4|0;f=b}}i=e;return a|0}function dm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;f=(d|0)==0;do{if(a-b>>2>>>0<d>>>0){if(f){break}else{g=d}do{g=g+ -1|0;c[a+(g<<2)>>2]=c[b+(g<<2)>>2];}while((g|0)!=0)}else{if(f){break}else{h=b;j=a;k=d}while(1){l=k+ -1|0;c[j>>2]=c[h>>2];if((l|0)==0){break}else{k=l;j=j+4|0;h=h+4|0}}}}while(0);i=e;return a|0}function em(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((d|0)!=0){f=d;d=a;while(1){g=f+ -1|0;c[d>>2]=b;if((g|0)==0){break}else{d=d+4|0;f=g}}}i=e;return a|0}function fm(a){a=a|0;i=i;return}function gm(a){a=a|0;c[a>>2]=238240;i=i;return}function hm(a){a=a|0;var b=0;b=i;Mb(a|0);Im(a);i=b;return}function im(a){a=a|0;var b=0;b=i;Mb(a|0);i=b;return}function jm(a){a=a|0;i=i;return 238256}function km(a){a=a|0;i=i;return}function lm(a){a=a|0;i=i;return}function mm(a){a=a|0;i=i;return}function nm(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function om(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function pm(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function qm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+56|0;f=e;if((a|0)==(b|0)){g=1;i=e;return g|0}if((b|0)==0){g=0;i=e;return g|0}h=um(b,238368,238424,0)|0;b=h;if((h|0)==0){g=0;i=e;return g|0}j=f+0|0;k=j+56|0;do{c[j>>2]=0;j=j+4|0}while((j|0)<(k|0));c[f>>2]=b;c[f+8>>2]=a;c[f+12>>2]=-1;c[f+48>>2]=1;xc[c[(c[h>>2]|0)+28>>2]&7](b,f,c[d>>2]|0,1);if((c[f+24>>2]|0)!=1){g=0;i=e;return g|0}c[d>>2]=c[f+16>>2];g=1;i=e;return g|0}function rm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[d+8>>2]|0)!=(b|0)){i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function sm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((b|0)!=(c[d+8>>2]|0)){h=c[b+8>>2]|0;xc[c[(c[h>>2]|0)+28>>2]&7](h,d,e,f);i=g;return}h=d+16|0;b=c[h>>2]|0;if((b|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function tm(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;if((b|0)==(c[d+8>>2]|0)){h=d+16|0;j=c[h>>2]|0;if((j|0)==0){c[h>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((j|0)!=(e|0)){j=d+36|0;c[j>>2]=(c[j>>2]|0)+1;c[d+24>>2]=2;a[d+54|0]=1;i=g;return}j=d+24|0;if((c[j>>2]|0)!=2){i=g;return}c[j>>2]=f;i=g;return}j=c[b+12>>2]|0;h=b+(j<<3)+16|0;k=c[b+20>>2]|0;l=k>>8;if((k&1|0)==0){m=l}else{m=c[(c[e>>2]|0)+l>>2]|0}l=c[b+16>>2]|0;xc[c[(c[l>>2]|0)+28>>2]&7](l,d,e+m|0,(k&2|0)!=0?f:2);if((j|0)<=1){i=g;return}j=d+54|0;k=e;m=b+24|0;while(1){b=c[m+4>>2]|0;l=b>>8;if((b&1|0)==0){n=l}else{n=c[(c[k>>2]|0)+l>>2]|0}l=c[m>>2]|0;xc[c[(c[l>>2]|0)+28>>2]&7](l,d,e+n|0,(b&2|0)!=0?f:2);if((a[j]|0)!=0){o=16;break}b=m+8|0;if(b>>>0<h>>>0){m=b}else{o=16;break}}if((o|0)==16){i=g;return}}function um(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=i;i=i+56|0;j=h;k=c[d>>2]|0;l=d+(c[k+ -8>>2]|0)|0;m=c[k+ -4>>2]|0;k=m;c[j>>2]=f;c[j+4>>2]=d;c[j+8>>2]=e;c[j+12>>2]=g;g=j+16|0;e=j+20|0;d=j+24|0;n=j+28|0;o=j+32|0;p=j+40|0;q=(m|0)==(f|0);f=g;r=f+0|0;s=r+36|0;do{c[r>>2]=0;r=r+4|0}while((r|0)<(s|0));b[f+36>>1]=0;a[f+38|0]=0;if(q){c[j+48>>2]=1;uc[c[(c[m>>2]|0)+20>>2]&15](k,j,l,l,1,0);t=(c[d>>2]|0)==1?l:0;i=h;return t|0}ic[c[(c[m>>2]|0)+24>>2]&3](k,j,l,1,0);l=c[j+36>>2]|0;if((l|0)==1){do{if((c[d>>2]|0)!=1){if((c[p>>2]|0)!=0){t=0;i=h;return t|0}if((c[n>>2]|0)!=1){t=0;i=h;return t|0}if((c[o>>2]|0)==1){break}else{t=0}i=h;return t|0}}while(0);t=c[g>>2]|0;i=h;return t|0}else if((l|0)==0){if((c[p>>2]|0)!=1){t=0;i=h;return t|0}if((c[n>>2]|0)!=1){t=0;i=h;return t|0}t=(c[o>>2]|0)==1?c[e>>2]|0:0;i=h;return t|0}else{t=0;i=h;return t|0}return 0}function vm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=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;h=i;j=b;if((j|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}k=d+28|0;if((c[k>>2]|0)==1){i=h;return}c[k>>2]=f;i=h;return}if((j|0)==(c[d>>2]|0)){do{if((c[d+16>>2]|0)!=(e|0)){j=d+20|0;if((c[j>>2]|0)==(e|0)){break}c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=c[b+12>>2]|0;m=b+(l<<3)+16|0;a:do{if((l|0)>0){n=d+52|0;o=d+53|0;p=d+54|0;q=b+8|0;r=d+24|0;s=e;t=0;u=0;v=b+16|0;b:while(1){a[n]=0;a[o]=0;w=c[v+4>>2]|0;x=w>>8;if((w&1|0)==0){y=x}else{y=c[(c[s>>2]|0)+x>>2]|0}x=c[v>>2]|0;uc[c[(c[x>>2]|0)+20>>2]&15](x,d,e,e+y|0,2-(w>>>1&1)|0,g);if((a[p]|0)!=0){z=t;A=u;break}do{if((a[o]|0)==0){B=t;C=u}else{if((a[n]|0)==0){if((c[q>>2]&1|0)==0){z=t;A=1;break b}else{B=t;C=1;break}}if((c[r>>2]|0)==1){D=27;break a}if((c[q>>2]&2|0)==0){D=27;break a}else{B=1;C=1}}}while(0);w=v+8|0;if(w>>>0<m>>>0){t=B;u=C;v=w}else{z=B;A=C;break}}if(z){E=A;D=26}else{F=A;D=23}}else{F=0;D=23}}while(0);do{if((D|0)==23){c[j>>2]=e;m=d+40|0;c[m>>2]=(c[m>>2]|0)+1;if((c[d+36>>2]|0)!=1){E=F;D=26;break}if((c[d+24>>2]|0)!=2){E=F;D=26;break}a[d+54|0]=1;if(F){D=27}else{D=28}}}while(0);if((D|0)==26){if(E){D=27}else{D=28}}if((D|0)==27){c[k>>2]=3;i=h;return}else if((D|0)==28){c[k>>2]=4;i=h;return}}}while(0);if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}E=c[b+12>>2]|0;F=b+(E<<3)+16|0;A=c[b+20>>2]|0;z=A>>8;if((A&1|0)==0){G=z}else{G=c[(c[e>>2]|0)+z>>2]|0}z=c[b+16>>2]|0;ic[c[(c[z>>2]|0)+24>>2]&3](z,d,e+G|0,(A&2|0)!=0?f:2,g);A=b+24|0;if((E|0)<=1){i=h;return}E=c[b+8>>2]|0;do{if((E&2|0)==0){b=d+36|0;if((c[b>>2]|0)==1){break}if((E&1|0)==0){G=d+54|0;z=e;C=A;while(1){if((a[G]|0)!=0){D=53;break}if((c[b>>2]|0)==1){D=53;break}B=c[C+4>>2]|0;y=B>>8;if((B&1|0)==0){H=y}else{H=c[(c[z>>2]|0)+y>>2]|0}y=c[C>>2]|0;ic[c[(c[y>>2]|0)+24>>2]&3](y,d,e+H|0,(B&2|0)!=0?f:2,g);B=C+8|0;if(B>>>0<F>>>0){C=B}else{D=53;break}}if((D|0)==53){i=h;return}}C=d+24|0;z=d+54|0;G=e;k=A;while(1){if((a[z]|0)!=0){D=53;break}if((c[b>>2]|0)==1){if((c[C>>2]|0)==1){D=53;break}}B=c[k+4>>2]|0;y=B>>8;if((B&1|0)==0){I=y}else{I=c[(c[G>>2]|0)+y>>2]|0}y=c[k>>2]|0;ic[c[(c[y>>2]|0)+24>>2]&3](y,d,e+I|0,(B&2|0)!=0?f:2,g);B=k+8|0;if(B>>>0<F>>>0){k=B}else{D=53;break}}if((D|0)==53){i=h;return}}}while(0);I=d+54|0;H=e;E=A;while(1){if((a[I]|0)!=0){D=53;break}A=c[E+4>>2]|0;k=A>>8;if((A&1|0)==0){J=k}else{J=c[(c[H>>2]|0)+k>>2]|0}k=c[E>>2]|0;ic[c[(c[k>>2]|0)+24>>2]&3](k,d,e+J|0,(A&2|0)!=0?f:2,g);A=E+8|0;if(A>>>0<F>>>0){E=A}else{D=53;break}}if((D|0)==53){i=h;return}}function wm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=i;j=b;if((j|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}k=d+28|0;if((c[k>>2]|0)==1){i=h;return}c[k>>2]=f;i=h;return}if((j|0)!=(c[d>>2]|0)){j=c[b+8>>2]|0;ic[c[(c[j>>2]|0)+24>>2]&3](j,d,e,f,g);i=h;return}do{if((c[d+16>>2]|0)!=(e|0)){j=d+20|0;if((c[j>>2]|0)==(e|0)){break}c[d+32>>2]=f;k=d+44|0;if((c[k>>2]|0)==4){i=h;return}l=d+52|0;a[l]=0;m=d+53|0;a[m]=0;n=c[b+8>>2]|0;uc[c[(c[n>>2]|0)+20>>2]&15](n,d,e,e,1,g);if((a[m]|0)==0){o=0;p=13}else{if((a[l]|0)==0){o=1;p=13}}a:do{if((p|0)==13){c[j>>2]=e;l=d+40|0;c[l>>2]=(c[l>>2]|0)+1;do{if((c[d+36>>2]|0)==1){if((c[d+24>>2]|0)!=2){p=16;break}a[d+54|0]=1;if(o){break a}}else{p=16}}while(0);if((p|0)==16){if(o){break}}c[k>>2]=4;i=h;return}}while(0);c[k>>2]=3;i=h;return}}while(0);if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}function xm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i;if((c[d+8>>2]|0)==(b|0)){if((c[d+4>>2]|0)!=(e|0)){i=g;return}h=d+28|0;if((c[h>>2]|0)==1){i=g;return}c[h>>2]=f;i=g;return}if((c[d>>2]|0)!=(b|0)){i=g;return}do{if((c[d+16>>2]|0)!=(e|0)){b=d+20|0;if((c[b>>2]|0)==(e|0)){break}c[d+32>>2]=f;c[b>>2]=e;b=d+40|0;c[b>>2]=(c[b>>2]|0)+1;do{if((c[d+36>>2]|0)==1){if((c[d+24>>2]|0)!=2){break}a[d+54|0]=1}}while(0);c[d+44>>2]=4;i=g;return}}while(0);if((f|0)!=1){i=g;return}c[d+32>>2]=1;i=g;return}function ym(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 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;j=i;if((b|0)!=(c[d+8>>2]|0)){k=d+52|0;l=a[k]|0;m=d+53|0;n=a[m]|0;o=c[b+12>>2]|0;p=b+(o<<3)+16|0;a[k]=0;a[m]=0;q=c[b+20>>2]|0;r=q>>8;if((q&1|0)==0){s=r}else{s=c[(c[f>>2]|0)+r>>2]|0}r=c[b+16>>2]|0;uc[c[(c[r>>2]|0)+20>>2]&15](r,d,e,f+s|0,(q&2|0)!=0?g:2,h);a:do{if((o|0)>1){q=d+24|0;s=b+8|0;r=d+54|0;t=f;u=b+24|0;do{if((a[r]|0)!=0){break a}do{if((a[k]|0)==0){if((a[m]|0)==0){break}if((c[s>>2]&1|0)==0){break a}}else{if((c[q>>2]|0)==1){break a}if((c[s>>2]&2|0)==0){break a}}}while(0);a[k]=0;a[m]=0;v=c[u+4>>2]|0;w=v>>8;if((v&1|0)==0){x=w}else{x=c[(c[t>>2]|0)+w>>2]|0}w=c[u>>2]|0;uc[c[(c[w>>2]|0)+20>>2]&15](w,d,e,f+x|0,(v&2|0)!=0?g:2,h);u=u+8|0;}while(u>>>0<p>>>0)}}while(0);a[k]=l;a[m]=n;i=j;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52|0]=1;f=d+16|0;n=c[f>>2]|0;if((n|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}if((n|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=j;return}e=d+24|0;n=c[e>>2]|0;if((n|0)==2){c[e>>2]=g;y=g}else{y=n}if(!((c[d+48>>2]|0)==1&(y|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}function zm(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 j=0,k=0,l=0;j=i;if((b|0)!=(c[d+8>>2]|0)){k=c[b+8>>2]|0;uc[c[(c[k>>2]|0)+20>>2]&15](k,d,e,f,g,h);i=j;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52|0]=1;f=d+16|0;h=c[f>>2]|0;if((h|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}if((h|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=j;return}e=d+24|0;h=c[e>>2]|0;if((h|0)==2){c[e>>2]=g;l=g}else{l=h}if(!((c[d+48>>2]|0)==1&(l|0)==1)){i=j;return}a[d+54|0]=1;i=j;return}function Am(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 j=0;h=i;if((c[d+8>>2]|0)!=(b|0)){i=h;return}a[d+53|0]=1;if((c[d+4>>2]|0)!=(f|0)){i=h;return}a[d+52|0]=1;f=d+16|0;b=c[f>>2]|0;if((b|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54|0]=1;i=h;return}if((b|0)!=(e|0)){e=d+36|0;c[e>>2]=(c[e>>2]|0)+1;a[d+54|0]=1;i=h;return}e=d+24|0;b=c[e>>2]|0;if((b|0)==2){c[e>>2]=g;j=g}else{j=b}if(!((c[d+48>>2]|0)==1&(j|0)==1)){i=h;return}a[d+54|0]=1;i=h;return}\n\n\n\nfunction Bm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,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;b=i;do{if(a>>>0<245){if(a>>>0<11){d=16}else{d=a+11&-8}e=d>>>3;f=c[59668]|0;g=f>>>e;if((g&3|0)!=0){h=(g&1^1)+e|0;j=h<<1;k=238712+(j<<2)|0;l=238712+(j+2<<2)|0;j=c[l>>2]|0;m=j+8|0;n=c[m>>2]|0;do{if((k|0)==(n|0)){c[59668]=f&~(1<<h)}else{if(n>>>0<(c[238688>>2]|0)>>>0){Vb()}o=n+12|0;if((c[o>>2]|0)==(j|0)){c[o>>2]=k;c[l>>2]=n;break}else{Vb()}}}while(0);n=h<<3;c[j+4>>2]=n|3;l=j+(n|4)|0;c[l>>2]=c[l>>2]|1;p=m;i=b;return p|0}if(!(d>>>0>(c[238680>>2]|0)>>>0)){q=d;break}if((g|0)!=0){l=2<<e;n=g<<e&(l|0-l);l=(n&0-n)+ -1|0;n=l>>>12&16;k=l>>>n;l=k>>>5&8;o=k>>>l;k=o>>>2&4;r=o>>>k;o=r>>>1&2;s=r>>>o;r=s>>>1&1;t=(l|n|k|o|r)+(s>>>r)|0;r=t<<1;s=238712+(r<<2)|0;o=238712+(r+2<<2)|0;r=c[o>>2]|0;k=r+8|0;n=c[k>>2]|0;do{if((s|0)==(n|0)){c[59668]=f&~(1<<t)}else{if(n>>>0<(c[238688>>2]|0)>>>0){Vb()}l=n+12|0;if((c[l>>2]|0)==(r|0)){c[l>>2]=s;c[o>>2]=n;break}else{Vb()}}}while(0);n=t<<3;o=n-d|0;c[r+4>>2]=d|3;s=r;f=s+d|0;c[s+(d|4)>>2]=o|1;c[s+n>>2]=o;n=c[238680>>2]|0;if((n|0)!=0){s=c[238692>>2]|0;e=n>>>3;n=e<<1;g=238712+(n<<2)|0;m=c[59668]|0;j=1<<e;do{if((m&j|0)==0){c[59668]=m|j;u=238712+(n+2<<2)|0;v=g}else{e=238712+(n+2<<2)|0;h=c[e>>2]|0;if(!(h>>>0<(c[238688>>2]|0)>>>0)){u=e;v=h;break}Vb()}}while(0);c[u>>2]=s;c[v+12>>2]=s;c[s+8>>2]=v;c[s+12>>2]=g}c[238680>>2]=o;c[238692>>2]=f;p=k;i=b;return p|0}n=c[238676>>2]|0;if((n|0)==0){q=d;break}j=(n&0-n)+ -1|0;n=j>>>12&16;m=j>>>n;j=m>>>5&8;r=m>>>j;m=r>>>2&4;t=r>>>m;r=t>>>1&2;h=t>>>r;t=h>>>1&1;e=c[238976+((j|n|m|r|t)+(h>>>t)<<2)>>2]|0;t=(c[e+4>>2]&-8)-d|0;h=e;r=e;while(1){e=c[h+16>>2]|0;if((e|0)==0){m=c[h+20>>2]|0;if((m|0)==0){break}else{w=m}}else{w=e}e=(c[w+4>>2]&-8)-d|0;m=e>>>0<t>>>0;t=m?e:t;h=w;r=m?w:r}h=r;k=c[238688>>2]|0;if(h>>>0<k>>>0){Vb()}f=h+d|0;o=f;if(!(h>>>0<f>>>0)){Vb()}f=c[r+24>>2]|0;g=c[r+12>>2]|0;do{if((g|0)==(r|0)){s=r+20|0;m=c[s>>2]|0;if((m|0)==0){e=r+16|0;n=c[e>>2]|0;if((n|0)==0){x=0;break}else{y=n;z=e}}else{y=m;z=s}while(1){s=y+20|0;m=c[s>>2]|0;if((m|0)!=0){z=s;y=m;continue}m=y+16|0;s=c[m>>2]|0;if((s|0)==0){break}else{y=s;z=m}}if(z>>>0<k>>>0){Vb()}else{c[z>>2]=0;x=y;break}}else{m=c[r+8>>2]|0;if(m>>>0<k>>>0){Vb()}s=m+12|0;if((c[s>>2]|0)!=(r|0)){Vb()}e=g+8|0;if((c[e>>2]|0)==(r|0)){c[s>>2]=g;c[e>>2]=m;x=g;break}else{Vb()}}}while(0);a:do{if((f|0)!=0){g=c[r+28>>2]|0;k=238976+(g<<2)|0;do{if((r|0)==(c[k>>2]|0)){c[k>>2]=x;if((x|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<g);break a}else{if(f>>>0<(c[238688>>2]|0)>>>0){Vb()}m=f+16|0;if((c[m>>2]|0)==(r|0)){c[m>>2]=x}else{c[f+20>>2]=x}if((x|0)==0){break a}}}while(0);if(x>>>0<(c[238688>>2]|0)>>>0){Vb()}c[x+24>>2]=f;g=c[r+16>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[x+16>>2]=g;c[g+24>>2]=x;break}}}while(0);g=c[r+20>>2]|0;if((g|0)==0){break}if(g>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[x+20>>2]=g;c[g+24>>2]=x;break}}}while(0);if(t>>>0<16){f=t+d|0;c[r+4>>2]=f|3;g=h+(f+4)|0;c[g>>2]=c[g>>2]|1}else{c[r+4>>2]=d|3;c[h+(d|4)>>2]=t|1;c[h+(t+d)>>2]=t;g=c[238680>>2]|0;if((g|0)!=0){f=c[238692>>2]|0;k=g>>>3;g=k<<1;m=238712+(g<<2)|0;e=c[59668]|0;s=1<<k;do{if((e&s|0)==0){c[59668]=e|s;A=238712+(g+2<<2)|0;B=m}else{k=238712+(g+2<<2)|0;n=c[k>>2]|0;if(!(n>>>0<(c[238688>>2]|0)>>>0)){A=k;B=n;break}Vb()}}while(0);c[A>>2]=f;c[B+12>>2]=f;c[f+8>>2]=B;c[f+12>>2]=m}c[238680>>2]=t;c[238692>>2]=o}p=r+8|0;i=b;return p|0}else{if(a>>>0>4294967231){q=-1;break}g=a+11|0;s=g&-8;e=c[238676>>2]|0;if((e|0)==0){q=s;break}h=0-s|0;n=g>>>8;do{if((n|0)==0){C=0}else{if(s>>>0>16777215){C=31;break}g=(n+1048320|0)>>>16&8;k=n<<g;j=(k+520192|0)>>>16&4;l=k<<j;k=(l+245760|0)>>>16&2;D=14-(j|g|k)+(l<<k>>>15)|0;C=s>>>(D+7|0)&1|D<<1}}while(0);n=c[238976+(C<<2)>>2]|0;b:do{if((n|0)==0){E=h;F=0;G=0}else{if((C|0)==31){H=0}else{H=25-(C>>>1)|0}r=h;o=0;t=s<<H;m=n;f=0;while(1){D=c[m+4>>2]&-8;k=D-s|0;if(k>>>0<r>>>0){if((D|0)==(s|0)){E=k;F=m;G=m;break b}else{I=k;J=m}}else{I=r;J=f}k=c[m+20>>2]|0;D=c[m+(t>>>31<<2)+16>>2]|0;l=(k|0)==0|(k|0)==(D|0)?o:k;if((D|0)==0){E=I;F=l;G=J;break}else{r=I;o=l;t=t<<1;m=D;f=J}}}}while(0);if((F|0)==0&(G|0)==0){n=2<<C;h=e&(n|0-n);if((h|0)==0){q=s;break}n=(h&0-h)+ -1|0;h=n>>>12&16;f=n>>>h;n=f>>>5&8;m=f>>>n;f=m>>>2&4;t=m>>>f;m=t>>>1&2;o=t>>>m;t=o>>>1&1;K=c[238976+((n|h|f|m|t)+(o>>>t)<<2)>>2]|0}else{K=F}if((K|0)==0){L=E;M=G}else{t=E;o=K;m=G;while(1){f=(c[o+4>>2]&-8)-s|0;h=f>>>0<t>>>0;n=h?f:t;f=h?o:m;h=c[o+16>>2]|0;if((h|0)!=0){N=f;O=n;m=N;o=h;t=O;continue}h=c[o+20>>2]|0;if((h|0)==0){L=n;M=f;break}else{N=f;O=n;o=h;m=N;t=O}}}if((M|0)==0){q=s;break}if(!(L>>>0<((c[238680>>2]|0)-s|0)>>>0)){q=s;break}t=M;m=c[238688>>2]|0;if(t>>>0<m>>>0){Vb()}o=t+s|0;e=o;if(!(t>>>0<o>>>0)){Vb()}h=c[M+24>>2]|0;n=c[M+12>>2]|0;do{if((n|0)==(M|0)){f=M+20|0;r=c[f>>2]|0;if((r|0)==0){D=M+16|0;l=c[D>>2]|0;if((l|0)==0){P=0;break}else{Q=l;R=D}}else{Q=r;R=f}while(1){f=Q+20|0;r=c[f>>2]|0;if((r|0)!=0){R=f;Q=r;continue}r=Q+16|0;f=c[r>>2]|0;if((f|0)==0){break}else{Q=f;R=r}}if(R>>>0<m>>>0){Vb()}else{c[R>>2]=0;P=Q;break}}else{r=c[M+8>>2]|0;if(r>>>0<m>>>0){Vb()}f=r+12|0;if((c[f>>2]|0)!=(M|0)){Vb()}D=n+8|0;if((c[D>>2]|0)==(M|0)){c[f>>2]=n;c[D>>2]=r;P=n;break}else{Vb()}}}while(0);c:do{if((h|0)!=0){n=c[M+28>>2]|0;m=238976+(n<<2)|0;do{if((M|0)==(c[m>>2]|0)){c[m>>2]=P;if((P|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<n);break c}else{if(h>>>0<(c[238688>>2]|0)>>>0){Vb()}r=h+16|0;if((c[r>>2]|0)==(M|0)){c[r>>2]=P}else{c[h+20>>2]=P}if((P|0)==0){break c}}}while(0);if(P>>>0<(c[238688>>2]|0)>>>0){Vb()}c[P+24>>2]=h;n=c[M+16>>2]|0;do{if((n|0)!=0){if(n>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[P+16>>2]=n;c[n+24>>2]=P;break}}}while(0);n=c[M+20>>2]|0;if((n|0)==0){break}if(n>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[P+20>>2]=n;c[n+24>>2]=P;break}}}while(0);d:do{if(L>>>0<16){h=L+s|0;c[M+4>>2]=h|3;n=t+(h+4)|0;c[n>>2]=c[n>>2]|1}else{c[M+4>>2]=s|3;c[t+(s|4)>>2]=L|1;c[t+(L+s)>>2]=L;n=L>>>3;if(L>>>0<256){h=n<<1;m=238712+(h<<2)|0;r=c[59668]|0;D=1<<n;do{if((r&D|0)==0){c[59668]=r|D;S=238712+(h+2<<2)|0;T=m}else{n=238712+(h+2<<2)|0;f=c[n>>2]|0;if(!(f>>>0<(c[238688>>2]|0)>>>0)){S=n;T=f;break}Vb()}}while(0);c[S>>2]=e;c[T+12>>2]=e;c[t+(s+8)>>2]=T;c[t+(s+12)>>2]=m;break}h=o;D=L>>>8;do{if((D|0)==0){U=0}else{if(L>>>0>16777215){U=31;break}r=(D+1048320|0)>>>16&8;f=D<<r;n=(f+520192|0)>>>16&4;l=f<<n;f=(l+245760|0)>>>16&2;k=14-(n|r|f)+(l<<f>>>15)|0;U=L>>>(k+7|0)&1|k<<1}}while(0);D=238976+(U<<2)|0;c[t+(s+28)>>2]=U;c[t+(s+20)>>2]=0;c[t+(s+16)>>2]=0;m=c[238676>>2]|0;k=1<<U;if((m&k|0)==0){c[238676>>2]=m|k;c[D>>2]=h;c[t+(s+24)>>2]=D;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break}k=c[D>>2]|0;if((U|0)==31){V=0}else{V=25-(U>>>1)|0}e:do{if((c[k+4>>2]&-8|0)==(L|0)){W=k}else{D=L<<V;m=k;while(1){X=m+(D>>>31<<2)+16|0;f=c[X>>2]|0;if((f|0)==0){break}if((c[f+4>>2]&-8|0)==(L|0)){W=f;break e}else{D=D<<1;m=f}}if(X>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[X>>2]=h;c[t+(s+24)>>2]=m;c[t+(s+12)>>2]=h;c[t+(s+8)>>2]=h;break d}}}while(0);k=W+8|0;D=c[k>>2]|0;f=c[238688>>2]|0;if(W>>>0<f>>>0){Vb()}if(D>>>0<f>>>0){Vb()}else{c[D+12>>2]=h;c[k>>2]=h;c[t+(s+8)>>2]=D;c[t+(s+12)>>2]=W;c[t+(s+24)>>2]=0;break}}}while(0);p=M+8|0;i=b;return p|0}}while(0);M=c[238680>>2]|0;if(!(q>>>0>M>>>0)){W=M-q|0;X=c[238692>>2]|0;if(W>>>0>15){L=X;c[238692>>2]=L+q;c[238680>>2]=W;c[L+(q+4)>>2]=W|1;c[L+M>>2]=W;c[X+4>>2]=q|3}else{c[238680>>2]=0;c[238692>>2]=0;c[X+4>>2]=M|3;W=X+(M+4)|0;c[W>>2]=c[W>>2]|1}p=X+8|0;i=b;return p|0}X=c[238684>>2]|0;if(q>>>0<X>>>0){W=X-q|0;c[238684>>2]=W;X=c[238696>>2]|0;M=X;c[238696>>2]=M+q;c[M+(q+4)>>2]=W|1;c[X+4>>2]=q|3;p=X+8|0;i=b;return p|0}do{if((c[59786]|0)==0){X=Rb(30)|0;if((X+ -1&X|0)==0){c[239152>>2]=X;c[239148>>2]=X;c[239156>>2]=-1;c[239160>>2]=-1;c[239164>>2]=0;c[239116>>2]=0;c[59786]=(Yb(0)|0)&-16^1431655768;break}else{Vb()}}}while(0);X=q+48|0;W=c[239152>>2]|0;M=q+47|0;L=W+M|0;V=0-W|0;W=L&V;if(!(W>>>0>q>>>0)){p=0;i=b;return p|0}U=c[239112>>2]|0;do{if((U|0)!=0){T=c[239104>>2]|0;S=T+W|0;if(S>>>0<=T>>>0|S>>>0>U>>>0){p=0}else{break}i=b;return p|0}}while(0);f:do{if((c[239116>>2]&4|0)==0){U=c[238696>>2]|0;g:do{if((U|0)==0){Y=182}else{S=U;T=239120|0;while(1){Z=T;P=c[Z>>2]|0;if(!(P>>>0>S>>>0)){_=T+4|0;if((P+(c[_>>2]|0)|0)>>>0>S>>>0){break}}P=c[T+8>>2]|0;if((P|0)==0){Y=182;break g}else{T=P}}if((T|0)==0){Y=182;break}S=L-(c[238684>>2]|0)&V;if(!(S>>>0<2147483647)){$=0;break}h=hb(S|0)|0;P=(h|0)==((c[Z>>2]|0)+(c[_>>2]|0)|0);aa=h;ba=S;ca=P?h:-1;da=P?S:0;Y=191}}while(0);do{if((Y|0)==182){U=hb(0)|0;if((U|0)==(-1|0)){$=0;break}S=U;P=c[239148>>2]|0;h=P+ -1|0;if((h&S|0)==0){ea=W}else{ea=W-S+(h+S&0-P)|0}P=c[239104>>2]|0;S=P+ea|0;if(!(ea>>>0>q>>>0&ea>>>0<2147483647)){$=0;break}h=c[239112>>2]|0;if((h|0)!=0){if(S>>>0<=P>>>0|S>>>0>h>>>0){$=0;break}}h=hb(ea|0)|0;S=(h|0)==(U|0);aa=h;ba=ea;ca=S?U:-1;da=S?ea:0;Y=191}}while(0);h:do{if((Y|0)==191){S=0-ba|0;if((ca|0)!=(-1|0)){fa=ca;ga=da;Y=202;break f}do{if((aa|0)!=(-1|0)&ba>>>0<2147483647&ba>>>0<X>>>0){U=c[239152>>2]|0;h=M-ba+U&0-U;if(!(h>>>0<2147483647)){ha=ba;break}if((hb(h|0)|0)==(-1|0)){hb(S|0)|0;$=da;break h}else{ha=h+ba|0;break}}else{ha=ba}}while(0);if((aa|0)==(-1|0)){$=da}else{fa=aa;ga=ha;Y=202;break f}}}while(0);c[239116>>2]=c[239116>>2]|4;ia=$;Y=199}else{ia=0;Y=199}}while(0);do{if((Y|0)==199){if(!(W>>>0<2147483647)){break}$=hb(W|0)|0;ha=hb(0)|0;if(!((ha|0)!=(-1|0)&($|0)!=(-1|0)&$>>>0<ha>>>0)){break}aa=ha-$|0;ha=aa>>>0>(q+40|0)>>>0;if(ha){fa=$;ga=ha?aa:ia;Y=202}}}while(0);do{if((Y|0)==202){ia=(c[239104>>2]|0)+ga|0;c[239104>>2]=ia;if(ia>>>0>(c[239108>>2]|0)>>>0){c[239108>>2]=ia}ia=c[238696>>2]|0;i:do{if((ia|0)==0){W=c[238688>>2]|0;if((W|0)==0|fa>>>0<W>>>0){c[238688>>2]=fa}c[239120>>2]=fa;c[239124>>2]=ga;c[239132>>2]=0;c[238708>>2]=c[59786];c[238704>>2]=-1;W=0;do{aa=W<<1;ha=238712+(aa<<2)|0;c[238712+(aa+3<<2)>>2]=ha;c[238712+(aa+2<<2)>>2]=ha;W=W+1|0;}while((W|0)!=32);W=fa+8|0;if((W&7|0)==0){ja=0}else{ja=0-W&7}W=ga+ -40-ja|0;c[238696>>2]=fa+ja;c[238684>>2]=W;c[fa+(ja+4)>>2]=W|1;c[fa+(ga+ -36)>>2]=40;c[238700>>2]=c[239160>>2]}else{W=239120|0;while(1){ka=c[W>>2]|0;la=W+4|0;ma=c[la>>2]|0;if((fa|0)==(ka+ma|0)){Y=214;break}ha=c[W+8>>2]|0;if((ha|0)==0){break}else{W=ha}}do{if((Y|0)==214){if((c[W+12>>2]&8|0)!=0){break}ha=ia;if(!(ha>>>0>=ka>>>0&ha>>>0<fa>>>0)){break}c[la>>2]=ma+ga;aa=(c[238684>>2]|0)+ga|0;$=ia+8|0;if(($&7|0)==0){na=0}else{na=0-$&7}$=aa-na|0;c[238696>>2]=ha+na;c[238684>>2]=$;c[ha+(na+4)>>2]=$|1;c[ha+(aa+4)>>2]=40;c[238700>>2]=c[239160>>2];break i}}while(0);if(fa>>>0<(c[238688>>2]|0)>>>0){c[238688>>2]=fa}W=fa+ga|0;aa=239120|0;while(1){oa=aa;if((c[oa>>2]|0)==(W|0)){Y=224;break}ha=c[aa+8>>2]|0;if((ha|0)==0){break}else{aa=ha}}do{if((Y|0)==224){if((c[aa+12>>2]&8|0)!=0){break}c[oa>>2]=fa;W=aa+4|0;c[W>>2]=(c[W>>2]|0)+ga;W=fa+8|0;if((W&7|0)==0){pa=0}else{pa=0-W&7}W=fa+(ga+8)|0;if((W&7|0)==0){qa=0}else{qa=0-W&7}W=fa+(qa+ga)|0;ha=W;$=pa+q|0;da=fa+$|0;ba=da;M=W-(fa+pa)-q|0;c[fa+(pa+4)>>2]=q|3;j:do{if((ha|0)==(c[238696>>2]|0)){X=(c[238684>>2]|0)+M|0;c[238684>>2]=X;c[238696>>2]=ba;c[fa+($+4)>>2]=X|1}else{if((ha|0)==(c[238692>>2]|0)){X=(c[238680>>2]|0)+M|0;c[238680>>2]=X;c[238692>>2]=ba;c[fa+($+4)>>2]=X|1;c[fa+(X+$)>>2]=X;break}X=ga+4|0;ca=c[fa+(X+qa)>>2]|0;if((ca&3|0)==1){ea=ca&-8;_=ca>>>3;k:do{if(ca>>>0<256){Z=c[fa+((qa|8)+ga)>>2]|0;V=c[fa+(ga+12+qa)>>2]|0;L=238712+(_<<1<<2)|0;do{if((Z|0)!=(L|0)){if(Z>>>0<(c[238688>>2]|0)>>>0){Vb()}if((c[Z+12>>2]|0)==(ha|0)){break}Vb()}}while(0);if((V|0)==(Z|0)){c[59668]=c[59668]&~(1<<_);break}do{if((V|0)==(L|0)){ra=V+8|0}else{if(V>>>0<(c[238688>>2]|0)>>>0){Vb()}S=V+8|0;if((c[S>>2]|0)==(ha|0)){ra=S;break}Vb()}}while(0);c[Z+12>>2]=V;c[ra>>2]=Z}else{L=W;S=c[fa+((qa|24)+ga)>>2]|0;T=c[fa+(ga+12+qa)>>2]|0;do{if((T|0)==(L|0)){h=qa|16;U=fa+(X+h)|0;P=c[U>>2]|0;if((P|0)==0){Q=fa+(h+ga)|0;h=c[Q>>2]|0;if((h|0)==0){sa=0;break}else{ta=h;ua=Q}}else{ta=P;ua=U}while(1){U=ta+20|0;P=c[U>>2]|0;if((P|0)!=0){ua=U;ta=P;continue}P=ta+16|0;U=c[P>>2]|0;if((U|0)==0){break}else{ta=U;ua=P}}if(ua>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[ua>>2]=0;sa=ta;break}}else{P=c[fa+((qa|8)+ga)>>2]|0;if(P>>>0<(c[238688>>2]|0)>>>0){Vb()}U=P+12|0;if((c[U>>2]|0)!=(L|0)){Vb()}Q=T+8|0;if((c[Q>>2]|0)==(L|0)){c[U>>2]=T;c[Q>>2]=P;sa=T;break}else{Vb()}}}while(0);if((S|0)==0){break}T=c[fa+(ga+28+qa)>>2]|0;Z=238976+(T<<2)|0;do{if((L|0)==(c[Z>>2]|0)){c[Z>>2]=sa;if((sa|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<T);break k}else{if(S>>>0<(c[238688>>2]|0)>>>0){Vb()}V=S+16|0;if((c[V>>2]|0)==(L|0)){c[V>>2]=sa}else{c[S+20>>2]=sa}if((sa|0)==0){break k}}}while(0);if(sa>>>0<(c[238688>>2]|0)>>>0){Vb()}c[sa+24>>2]=S;L=qa|16;T=c[fa+(L+ga)>>2]|0;do{if((T|0)!=0){if(T>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[sa+16>>2]=T;c[T+24>>2]=sa;break}}}while(0);T=c[fa+(X+L)>>2]|0;if((T|0)==0){break}if(T>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[sa+20>>2]=T;c[T+24>>2]=sa;break}}}while(0);va=fa+((ea|qa)+ga)|0;wa=ea+M|0}else{va=ha;wa=M}X=va+4|0;c[X>>2]=c[X>>2]&-2;c[fa+($+4)>>2]=wa|1;c[fa+(wa+$)>>2]=wa;X=wa>>>3;if(wa>>>0<256){_=X<<1;ca=238712+(_<<2)|0;T=c[59668]|0;S=1<<X;do{if((T&S|0)==0){c[59668]=T|S;xa=238712+(_+2<<2)|0;ya=ca}else{X=238712+(_+2<<2)|0;Z=c[X>>2]|0;if(!(Z>>>0<(c[238688>>2]|0)>>>0)){xa=X;ya=Z;break}Vb()}}while(0);c[xa>>2]=ba;c[ya+12>>2]=ba;c[fa+($+8)>>2]=ya;c[fa+($+12)>>2]=ca;break}_=da;S=wa>>>8;do{if((S|0)==0){za=0}else{if(wa>>>0>16777215){za=31;break}T=(S+1048320|0)>>>16&8;ea=S<<T;Z=(ea+520192|0)>>>16&4;X=ea<<Z;ea=(X+245760|0)>>>16&2;V=14-(Z|T|ea)+(X<<ea>>>15)|0;za=wa>>>(V+7|0)&1|V<<1}}while(0);S=238976+(za<<2)|0;c[fa+($+28)>>2]=za;c[fa+($+20)>>2]=0;c[fa+($+16)>>2]=0;ca=c[238676>>2]|0;V=1<<za;if((ca&V|0)==0){c[238676>>2]=ca|V;c[S>>2]=_;c[fa+($+24)>>2]=S;c[fa+($+12)>>2]=_;c[fa+($+8)>>2]=_;break}V=c[S>>2]|0;if((za|0)==31){Aa=0}else{Aa=25-(za>>>1)|0}l:do{if((c[V+4>>2]&-8|0)==(wa|0)){Ba=V}else{S=wa<<Aa;ca=V;while(1){Ca=ca+(S>>>31<<2)+16|0;ea=c[Ca>>2]|0;if((ea|0)==0){break}if((c[ea+4>>2]&-8|0)==(wa|0)){Ba=ea;break l}else{S=S<<1;ca=ea}}if(Ca>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[Ca>>2]=_;c[fa+($+24)>>2]=ca;c[fa+($+12)>>2]=_;c[fa+($+8)>>2]=_;break j}}}while(0);V=Ba+8|0;S=c[V>>2]|0;L=c[238688>>2]|0;if(Ba>>>0<L>>>0){Vb()}if(S>>>0<L>>>0){Vb()}else{c[S+12>>2]=_;c[V>>2]=_;c[fa+($+8)>>2]=S;c[fa+($+12)>>2]=Ba;c[fa+($+24)>>2]=0;break}}}while(0);p=fa+(pa|8)|0;i=b;return p|0}}while(0);aa=ia;$=239120|0;while(1){Da=c[$>>2]|0;if(!(Da>>>0>aa>>>0)){Ea=c[$+4>>2]|0;Fa=Da+Ea|0;if(Fa>>>0>aa>>>0){break}}$=c[$+8>>2]|0}$=Da+(Ea+ -39)|0;if(($&7|0)==0){Ga=0}else{Ga=0-$&7}$=Da+(Ea+ -47+Ga)|0;da=$>>>0<(ia+16|0)>>>0?aa:$;$=da+8|0;ba=$;M=fa+8|0;if((M&7|0)==0){Ha=0}else{Ha=0-M&7}M=ga+ -40-Ha|0;c[238696>>2]=fa+Ha;c[238684>>2]=M;c[fa+(Ha+4)>>2]=M|1;c[fa+(ga+ -36)>>2]=40;c[238700>>2]=c[239160>>2];c[da+4>>2]=27;c[$+0>>2]=c[239120>>2];c[$+4>>2]=c[239124>>2];c[$+8>>2]=c[239128>>2];c[$+12>>2]=c[239132>>2];c[239120>>2]=fa;c[239124>>2]=ga;c[239132>>2]=0;c[239128>>2]=ba;ba=da+28|0;c[ba>>2]=7;if((da+32|0)>>>0<Fa>>>0){$=ba;while(1){ba=$+4|0;c[ba>>2]=7;if(($+8|0)>>>0<Fa>>>0){$=ba}else{break}}}if((da|0)==(aa|0)){break}$=da-ia|0;ba=aa+($+4)|0;c[ba>>2]=c[ba>>2]&-2;c[ia+4>>2]=$|1;c[aa+$>>2]=$;ba=$>>>3;if($>>>0<256){M=ba<<1;ha=238712+(M<<2)|0;W=c[59668]|0;m=1<<ba;do{if((W&m|0)==0){c[59668]=W|m;Ia=238712+(M+2<<2)|0;Ja=ha}else{ba=238712+(M+2<<2)|0;S=c[ba>>2]|0;if(!(S>>>0<(c[238688>>2]|0)>>>0)){Ia=ba;Ja=S;break}Vb()}}while(0);c[Ia>>2]=ia;c[Ja+12>>2]=ia;c[ia+8>>2]=Ja;c[ia+12>>2]=ha;break}M=ia;m=$>>>8;do{if((m|0)==0){Ka=0}else{if($>>>0>16777215){Ka=31;break}W=(m+1048320|0)>>>16&8;aa=m<<W;da=(aa+520192|0)>>>16&4;S=aa<<da;aa=(S+245760|0)>>>16&2;ba=14-(da|W|aa)+(S<<aa>>>15)|0;Ka=$>>>(ba+7|0)&1|ba<<1}}while(0);m=238976+(Ka<<2)|0;c[ia+28>>2]=Ka;c[ia+20>>2]=0;c[ia+16>>2]=0;ha=c[238676>>2]|0;ba=1<<Ka;if((ha&ba|0)==0){c[238676>>2]=ha|ba;c[m>>2]=M;c[ia+24>>2]=m;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break}ba=c[m>>2]|0;if((Ka|0)==31){La=0}else{La=25-(Ka>>>1)|0}m:do{if((c[ba+4>>2]&-8|0)==($|0)){Ma=ba}else{m=$<<La;ha=ba;while(1){Na=ha+(m>>>31<<2)+16|0;aa=c[Na>>2]|0;if((aa|0)==0){break}if((c[aa+4>>2]&-8|0)==($|0)){Ma=aa;break m}else{m=m<<1;ha=aa}}if(Na>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[Na>>2]=M;c[ia+24>>2]=ha;c[ia+12>>2]=ia;c[ia+8>>2]=ia;break i}}}while(0);$=Ma+8|0;ba=c[$>>2]|0;m=c[238688>>2]|0;if(Ma>>>0<m>>>0){Vb()}if(ba>>>0<m>>>0){Vb()}else{c[ba+12>>2]=M;c[$>>2]=M;c[ia+8>>2]=ba;c[ia+12>>2]=Ma;c[ia+24>>2]=0;break}}}while(0);ia=c[238684>>2]|0;if(!(ia>>>0>q>>>0)){break}ba=ia-q|0;c[238684>>2]=ba;ia=c[238696>>2]|0;$=ia;c[238696>>2]=$+q;c[$+(q+4)>>2]=ba|1;c[ia+4>>2]=q|3;p=ia+8|0;i=b;return p|0}}while(0);c[(ab()|0)>>2]=12;p=0;i=b;return p|0}function Cm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=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,N=0,O=0,P=0,Q=0;b=i;if((a|0)==0){i=b;return}d=a+ -8|0;e=d;f=c[238688>>2]|0;if(d>>>0<f>>>0){Vb()}g=c[a+ -4>>2]|0;h=g&3;if((h|0)==1){Vb()}j=g&-8;k=a+(j+ -8)|0;l=k;a:do{if((g&1|0)==0){m=c[d>>2]|0;if((h|0)==0){i=b;return}n=-8-m|0;o=a+n|0;p=o;q=m+j|0;if(o>>>0<f>>>0){Vb()}if((p|0)==(c[238692>>2]|0)){r=a+(j+ -4)|0;if((c[r>>2]&3|0)!=3){s=p;t=q;break}c[238680>>2]=q;c[r>>2]=c[r>>2]&-2;c[a+(n+4)>>2]=q|1;c[k>>2]=q;i=b;return}r=m>>>3;if(m>>>0<256){m=c[a+(n+8)>>2]|0;u=c[a+(n+12)>>2]|0;v=238712+(r<<1<<2)|0;do{if((m|0)!=(v|0)){if(m>>>0<f>>>0){Vb()}if((c[m+12>>2]|0)==(p|0)){break}Vb()}}while(0);if((u|0)==(m|0)){c[59668]=c[59668]&~(1<<r);s=p;t=q;break}do{if((u|0)==(v|0)){w=u+8|0}else{if(u>>>0<f>>>0){Vb()}x=u+8|0;if((c[x>>2]|0)==(p|0)){w=x;break}Vb()}}while(0);c[m+12>>2]=u;c[w>>2]=m;s=p;t=q;break}v=o;r=c[a+(n+24)>>2]|0;x=c[a+(n+12)>>2]|0;do{if((x|0)==(v|0)){y=a+(n+20)|0;z=c[y>>2]|0;if((z|0)==0){A=a+(n+16)|0;B=c[A>>2]|0;if((B|0)==0){C=0;break}else{D=B;E=A}}else{D=z;E=y}while(1){y=D+20|0;z=c[y>>2]|0;if((z|0)!=0){E=y;D=z;continue}z=D+16|0;y=c[z>>2]|0;if((y|0)==0){break}else{D=y;E=z}}if(E>>>0<f>>>0){Vb()}else{c[E>>2]=0;C=D;break}}else{z=c[a+(n+8)>>2]|0;if(z>>>0<f>>>0){Vb()}y=z+12|0;if((c[y>>2]|0)!=(v|0)){Vb()}A=x+8|0;if((c[A>>2]|0)==(v|0)){c[y>>2]=x;c[A>>2]=z;C=x;break}else{Vb()}}}while(0);if((r|0)==0){s=p;t=q;break}x=c[a+(n+28)>>2]|0;o=238976+(x<<2)|0;do{if((v|0)==(c[o>>2]|0)){c[o>>2]=C;if((C|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<x);s=p;t=q;break a}else{if(r>>>0<(c[238688>>2]|0)>>>0){Vb()}m=r+16|0;if((c[m>>2]|0)==(v|0)){c[m>>2]=C}else{c[r+20>>2]=C}if((C|0)==0){s=p;t=q;break a}}}while(0);if(C>>>0<(c[238688>>2]|0)>>>0){Vb()}c[C+24>>2]=r;v=c[a+(n+16)>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[C+16>>2]=v;c[v+24>>2]=C;break}}}while(0);v=c[a+(n+20)>>2]|0;if((v|0)==0){s=p;t=q;break}if(v>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[C+20>>2]=v;c[v+24>>2]=C;s=p;t=q;break}}else{s=e;t=j}}while(0);e=s;if(!(e>>>0<k>>>0)){Vb()}C=a+(j+ -4)|0;f=c[C>>2]|0;if((f&1|0)==0){Vb()}do{if((f&2|0)==0){if((l|0)==(c[238696>>2]|0)){D=(c[238684>>2]|0)+t|0;c[238684>>2]=D;c[238696>>2]=s;c[s+4>>2]=D|1;if((s|0)!=(c[238692>>2]|0)){i=b;return}c[238692>>2]=0;c[238680>>2]=0;i=b;return}if((l|0)==(c[238692>>2]|0)){D=(c[238680>>2]|0)+t|0;c[238680>>2]=D;c[238692>>2]=s;c[s+4>>2]=D|1;c[e+D>>2]=D;i=b;return}D=(f&-8)+t|0;E=f>>>3;b:do{if(f>>>0<256){w=c[a+j>>2]|0;h=c[a+(j|4)>>2]|0;d=238712+(E<<1<<2)|0;do{if((w|0)!=(d|0)){if(w>>>0<(c[238688>>2]|0)>>>0){Vb()}if((c[w+12>>2]|0)==(l|0)){break}Vb()}}while(0);if((h|0)==(w|0)){c[59668]=c[59668]&~(1<<E);break}do{if((h|0)==(d|0)){F=h+8|0}else{if(h>>>0<(c[238688>>2]|0)>>>0){Vb()}g=h+8|0;if((c[g>>2]|0)==(l|0)){F=g;break}Vb()}}while(0);c[w+12>>2]=h;c[F>>2]=w}else{d=k;g=c[a+(j+16)>>2]|0;v=c[a+(j|4)>>2]|0;do{if((v|0)==(d|0)){r=a+(j+12)|0;x=c[r>>2]|0;if((x|0)==0){o=a+(j+8)|0;m=c[o>>2]|0;if((m|0)==0){G=0;break}else{H=m;I=o}}else{H=x;I=r}while(1){r=H+20|0;x=c[r>>2]|0;if((x|0)!=0){I=r;H=x;continue}x=H+16|0;r=c[x>>2]|0;if((r|0)==0){break}else{H=r;I=x}}if(I>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[I>>2]=0;G=H;break}}else{x=c[a+j>>2]|0;if(x>>>0<(c[238688>>2]|0)>>>0){Vb()}r=x+12|0;if((c[r>>2]|0)!=(d|0)){Vb()}o=v+8|0;if((c[o>>2]|0)==(d|0)){c[r>>2]=v;c[o>>2]=x;G=v;break}else{Vb()}}}while(0);if((g|0)==0){break}v=c[a+(j+20)>>2]|0;w=238976+(v<<2)|0;do{if((d|0)==(c[w>>2]|0)){c[w>>2]=G;if((G|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<v);break b}else{if(g>>>0<(c[238688>>2]|0)>>>0){Vb()}h=g+16|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=G}else{c[g+20>>2]=G}if((G|0)==0){break b}}}while(0);if(G>>>0<(c[238688>>2]|0)>>>0){Vb()}c[G+24>>2]=g;d=c[a+(j+8)>>2]|0;do{if((d|0)!=0){if(d>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[G+16>>2]=d;c[d+24>>2]=G;break}}}while(0);d=c[a+(j+12)>>2]|0;if((d|0)==0){break}if(d>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[G+20>>2]=d;c[d+24>>2]=G;break}}}while(0);c[s+4>>2]=D|1;c[e+D>>2]=D;if((s|0)!=(c[238692>>2]|0)){J=D;break}c[238680>>2]=D;i=b;return}else{c[C>>2]=f&-2;c[s+4>>2]=t|1;c[e+t>>2]=t;J=t}}while(0);t=J>>>3;if(J>>>0<256){e=t<<1;f=238712+(e<<2)|0;C=c[59668]|0;G=1<<t;do{if((C&G|0)==0){c[59668]=C|G;K=238712+(e+2<<2)|0;L=f}else{t=238712+(e+2<<2)|0;j=c[t>>2]|0;if(!(j>>>0<(c[238688>>2]|0)>>>0)){K=t;L=j;break}Vb()}}while(0);c[K>>2]=s;c[L+12>>2]=s;c[s+8>>2]=L;c[s+12>>2]=f;i=b;return}f=s;L=J>>>8;do{if((L|0)==0){M=0}else{if(J>>>0>16777215){M=31;break}K=(L+1048320|0)>>>16&8;e=L<<K;G=(e+520192|0)>>>16&4;C=e<<G;e=(C+245760|0)>>>16&2;j=14-(G|K|e)+(C<<e>>>15)|0;M=J>>>(j+7|0)&1|j<<1}}while(0);L=238976+(M<<2)|0;c[s+28>>2]=M;c[s+20>>2]=0;c[s+16>>2]=0;j=c[238676>>2]|0;e=1<<M;c:do{if((j&e|0)==0){c[238676>>2]=j|e;c[L>>2]=f;c[s+24>>2]=L;c[s+12>>2]=s;c[s+8>>2]=s}else{C=c[L>>2]|0;if((M|0)==31){N=0}else{N=25-(M>>>1)|0}d:do{if((c[C+4>>2]&-8|0)==(J|0)){O=C}else{K=J<<N;G=C;while(1){P=G+(K>>>31<<2)+16|0;t=c[P>>2]|0;if((t|0)==0){break}if((c[t+4>>2]&-8|0)==(J|0)){O=t;break d}else{K=K<<1;G=t}}if(P>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[P>>2]=f;c[s+24>>2]=G;c[s+12>>2]=s;c[s+8>>2]=s;break c}}}while(0);C=O+8|0;D=c[C>>2]|0;K=c[238688>>2]|0;if(O>>>0<K>>>0){Vb()}if(D>>>0<K>>>0){Vb()}else{c[D+12>>2]=f;c[C>>2]=f;c[s+8>>2]=D;c[s+12>>2]=O;c[s+24>>2]=0;break}}}while(0);s=(c[238704>>2]|0)+ -1|0;c[238704>>2]=s;if((s|0)==0){Q=239128|0}else{i=b;return}while(1){s=c[Q>>2]|0;if((s|0)==0){break}else{Q=s+8|0}}c[238704>>2]=-1;i=b;return}function Dm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((a|0)==0){e=Bm(b)|0;i=d;return e|0}if(b>>>0>4294967231){c[(ab()|0)>>2]=12;e=0;i=d;return e|0}if(b>>>0<11){f=16}else{f=b+11&-8}g=Em(a+ -8|0,f)|0;if((g|0)!=0){e=g+8|0;i=d;return e|0}g=Bm(b)|0;if((g|0)==0){e=0;i=d;return e|0}f=c[a+ -4>>2]|0;h=(f&-8)-((f&3|0)==0?8:4)|0;$m(g|0,a|0,(h>>>0<b>>>0?h:b)|0)|0;Cm(a);e=g;i=d;return e|0}function Em(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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=i;e=a+4|0;f=c[e>>2]|0;g=f&-8;h=a;j=h+g|0;k=j;l=c[238688>>2]|0;if(h>>>0<l>>>0){Vb()}m=f&3;if(!((m|0)!=1&h>>>0<j>>>0)){Vb()}n=h+(g|4)|0;o=c[n>>2]|0;if((o&1|0)==0){Vb()}if((m|0)==0){if(b>>>0<256){p=0;i=d;return p|0}do{if(!(g>>>0<(b+4|0)>>>0)){if((g-b|0)>>>0>c[239152>>2]<<1>>>0){break}else{p=a}i=d;return p|0}}while(0);p=0;i=d;return p|0}if(!(g>>>0<b>>>0)){m=g-b|0;if(!(m>>>0>15)){p=a;i=d;return p|0}c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=m|3;c[n>>2]=c[n>>2]|1;Fm(h+b|0,m);p=a;i=d;return p|0}if((k|0)==(c[238696>>2]|0)){m=(c[238684>>2]|0)+g|0;if(!(m>>>0>b>>>0)){p=0;i=d;return p|0}n=m-b|0;c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=n|1;c[238696>>2]=h+b;c[238684>>2]=n;p=a;i=d;return p|0}if((k|0)==(c[238692>>2]|0)){n=(c[238680>>2]|0)+g|0;if(n>>>0<b>>>0){p=0;i=d;return p|0}m=n-b|0;if(m>>>0>15){c[e>>2]=f&1|b|2;c[h+(b+4)>>2]=m|1;c[h+n>>2]=m;q=h+(n+4)|0;c[q>>2]=c[q>>2]&-2;r=h+b|0;s=m}else{c[e>>2]=f&1|n|2;f=h+(n+4)|0;c[f>>2]=c[f>>2]|1;r=0;s=0}c[238680>>2]=s;c[238692>>2]=r;p=a;i=d;return p|0}if((o&2|0)!=0){p=0;i=d;return p|0}r=(o&-8)+g|0;if(r>>>0<b>>>0){p=0;i=d;return p|0}s=r-b|0;f=o>>>3;a:do{if(o>>>0<256){n=c[h+(g+8)>>2]|0;m=c[h+(g+12)>>2]|0;q=238712+(f<<1<<2)|0;do{if((n|0)!=(q|0)){if(n>>>0<l>>>0){Vb()}if((c[n+12>>2]|0)==(k|0)){break}Vb()}}while(0);if((m|0)==(n|0)){c[59668]=c[59668]&~(1<<f);break}do{if((m|0)==(q|0)){t=m+8|0}else{if(m>>>0<l>>>0){Vb()}u=m+8|0;if((c[u>>2]|0)==(k|0)){t=u;break}Vb()}}while(0);c[n+12>>2]=m;c[t>>2]=n}else{q=j;u=c[h+(g+24)>>2]|0;v=c[h+(g+12)>>2]|0;do{if((v|0)==(q|0)){w=h+(g+20)|0;x=c[w>>2]|0;if((x|0)==0){y=h+(g+16)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){C=w;B=x;continue}x=B+16|0;w=c[x>>2]|0;if((w|0)==0){break}else{B=w;C=x}}if(C>>>0<l>>>0){Vb()}else{c[C>>2]=0;A=B;break}}else{x=c[h+(g+8)>>2]|0;if(x>>>0<l>>>0){Vb()}w=x+12|0;if((c[w>>2]|0)!=(q|0)){Vb()}y=v+8|0;if((c[y>>2]|0)==(q|0)){c[w>>2]=v;c[y>>2]=x;A=v;break}else{Vb()}}}while(0);if((u|0)==0){break}v=c[h+(g+28)>>2]|0;n=238976+(v<<2)|0;do{if((q|0)==(c[n>>2]|0)){c[n>>2]=A;if((A|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<v);break a}else{if(u>>>0<(c[238688>>2]|0)>>>0){Vb()}m=u+16|0;if((c[m>>2]|0)==(q|0)){c[m>>2]=A}else{c[u+20>>2]=A}if((A|0)==0){break a}}}while(0);if(A>>>0<(c[238688>>2]|0)>>>0){Vb()}c[A+24>>2]=u;q=c[h+(g+16)>>2]|0;do{if((q|0)!=0){if(q>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[A+16>>2]=q;c[q+24>>2]=A;break}}}while(0);q=c[h+(g+20)>>2]|0;if((q|0)==0){break}if(q>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[A+20>>2]=q;c[q+24>>2]=A;break}}}while(0);if(s>>>0<16){c[e>>2]=r|c[e>>2]&1|2;A=h+(r|4)|0;c[A>>2]=c[A>>2]|1;p=a;i=d;return p|0}else{c[e>>2]=c[e>>2]&1|b|2;c[h+(b+4)>>2]=s|3;e=h+(r|4)|0;c[e>>2]=c[e>>2]|1;Fm(h+b|0,s);p=a;i=d;return p|0}return 0}function Fm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=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,N=0;d=i;e=a;f=e+b|0;g=f;h=c[a+4>>2]|0;a:do{if((h&1|0)==0){j=c[a>>2]|0;if((h&3|0)==0){i=d;return}k=e+(0-j)|0;l=k;m=j+b|0;n=c[238688>>2]|0;if(k>>>0<n>>>0){Vb()}if((l|0)==(c[238692>>2]|0)){o=e+(b+4)|0;if((c[o>>2]&3|0)!=3){p=l;q=m;break}c[238680>>2]=m;c[o>>2]=c[o>>2]&-2;c[e+(4-j)>>2]=m|1;c[f>>2]=m;i=d;return}o=j>>>3;if(j>>>0<256){r=c[e+(8-j)>>2]|0;s=c[e+(12-j)>>2]|0;t=238712+(o<<1<<2)|0;do{if((r|0)!=(t|0)){if(r>>>0<n>>>0){Vb()}if((c[r+12>>2]|0)==(l|0)){break}Vb()}}while(0);if((s|0)==(r|0)){c[59668]=c[59668]&~(1<<o);p=l;q=m;break}do{if((s|0)==(t|0)){u=s+8|0}else{if(s>>>0<n>>>0){Vb()}v=s+8|0;if((c[v>>2]|0)==(l|0)){u=v;break}Vb()}}while(0);c[r+12>>2]=s;c[u>>2]=r;p=l;q=m;break}t=k;o=c[e+(24-j)>>2]|0;v=c[e+(12-j)>>2]|0;do{if((v|0)==(t|0)){w=16-j|0;x=e+(w+4)|0;y=c[x>>2]|0;if((y|0)==0){z=e+w|0;w=c[z>>2]|0;if((w|0)==0){A=0;break}else{B=w;C=z}}else{B=y;C=x}while(1){x=B+20|0;y=c[x>>2]|0;if((y|0)!=0){C=x;B=y;continue}y=B+16|0;x=c[y>>2]|0;if((x|0)==0){break}else{B=x;C=y}}if(C>>>0<n>>>0){Vb()}else{c[C>>2]=0;A=B;break}}else{y=c[e+(8-j)>>2]|0;if(y>>>0<n>>>0){Vb()}x=y+12|0;if((c[x>>2]|0)!=(t|0)){Vb()}z=v+8|0;if((c[z>>2]|0)==(t|0)){c[x>>2]=v;c[z>>2]=y;A=v;break}else{Vb()}}}while(0);if((o|0)==0){p=l;q=m;break}v=c[e+(28-j)>>2]|0;n=238976+(v<<2)|0;do{if((t|0)==(c[n>>2]|0)){c[n>>2]=A;if((A|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<v);p=l;q=m;break a}else{if(o>>>0<(c[238688>>2]|0)>>>0){Vb()}k=o+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[o+20>>2]=A}if((A|0)==0){p=l;q=m;break a}}}while(0);if(A>>>0<(c[238688>>2]|0)>>>0){Vb()}c[A+24>>2]=o;t=16-j|0;v=c[e+t>>2]|0;do{if((v|0)!=0){if(v>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[A+16>>2]=v;c[v+24>>2]=A;break}}}while(0);v=c[e+(t+4)>>2]|0;if((v|0)==0){p=l;q=m;break}if(v>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[A+20>>2]=v;c[v+24>>2]=A;p=l;q=m;break}}else{p=a;q=b}}while(0);a=c[238688>>2]|0;if(f>>>0<a>>>0){Vb()}A=e+(b+4)|0;B=c[A>>2]|0;do{if((B&2|0)==0){if((g|0)==(c[238696>>2]|0)){C=(c[238684>>2]|0)+q|0;c[238684>>2]=C;c[238696>>2]=p;c[p+4>>2]=C|1;if((p|0)!=(c[238692>>2]|0)){i=d;return}c[238692>>2]=0;c[238680>>2]=0;i=d;return}if((g|0)==(c[238692>>2]|0)){C=(c[238680>>2]|0)+q|0;c[238680>>2]=C;c[238692>>2]=p;c[p+4>>2]=C|1;c[p+C>>2]=C;i=d;return}C=(B&-8)+q|0;u=B>>>3;b:do{if(B>>>0<256){h=c[e+(b+8)>>2]|0;v=c[e+(b+12)>>2]|0;j=238712+(u<<1<<2)|0;do{if((h|0)!=(j|0)){if(h>>>0<a>>>0){Vb()}if((c[h+12>>2]|0)==(g|0)){break}Vb()}}while(0);if((v|0)==(h|0)){c[59668]=c[59668]&~(1<<u);break}do{if((v|0)==(j|0)){D=v+8|0}else{if(v>>>0<a>>>0){Vb()}o=v+8|0;if((c[o>>2]|0)==(g|0)){D=o;break}Vb()}}while(0);c[h+12>>2]=v;c[D>>2]=h}else{j=f;o=c[e+(b+24)>>2]|0;n=c[e+(b+12)>>2]|0;do{if((n|0)==(j|0)){k=e+(b+20)|0;r=c[k>>2]|0;if((r|0)==0){s=e+(b+16)|0;y=c[s>>2]|0;if((y|0)==0){E=0;break}else{F=y;G=s}}else{F=r;G=k}while(1){k=F+20|0;r=c[k>>2]|0;if((r|0)!=0){G=k;F=r;continue}r=F+16|0;k=c[r>>2]|0;if((k|0)==0){break}else{F=k;G=r}}if(G>>>0<a>>>0){Vb()}else{c[G>>2]=0;E=F;break}}else{r=c[e+(b+8)>>2]|0;if(r>>>0<a>>>0){Vb()}k=r+12|0;if((c[k>>2]|0)!=(j|0)){Vb()}s=n+8|0;if((c[s>>2]|0)==(j|0)){c[k>>2]=n;c[s>>2]=r;E=n;break}else{Vb()}}}while(0);if((o|0)==0){break}n=c[e+(b+28)>>2]|0;h=238976+(n<<2)|0;do{if((j|0)==(c[h>>2]|0)){c[h>>2]=E;if((E|0)!=0){break}c[238676>>2]=c[238676>>2]&~(1<<n);break b}else{if(o>>>0<(c[238688>>2]|0)>>>0){Vb()}v=o+16|0;if((c[v>>2]|0)==(j|0)){c[v>>2]=E}else{c[o+20>>2]=E}if((E|0)==0){break b}}}while(0);if(E>>>0<(c[238688>>2]|0)>>>0){Vb()}c[E+24>>2]=o;j=c[e+(b+16)>>2]|0;do{if((j|0)!=0){if(j>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[E+16>>2]=j;c[j+24>>2]=E;break}}}while(0);j=c[e+(b+20)>>2]|0;if((j|0)==0){break}if(j>>>0<(c[238688>>2]|0)>>>0){Vb()}else{c[E+20>>2]=j;c[j+24>>2]=E;break}}}while(0);c[p+4>>2]=C|1;c[p+C>>2]=C;if((p|0)!=(c[238692>>2]|0)){H=C;break}c[238680>>2]=C;i=d;return}else{c[A>>2]=B&-2;c[p+4>>2]=q|1;c[p+q>>2]=q;H=q}}while(0);q=H>>>3;if(H>>>0<256){B=q<<1;A=238712+(B<<2)|0;E=c[59668]|0;b=1<<q;do{if((E&b|0)==0){c[59668]=E|b;I=238712+(B+2<<2)|0;J=A}else{q=238712+(B+2<<2)|0;e=c[q>>2]|0;if(!(e>>>0<(c[238688>>2]|0)>>>0)){I=q;J=e;break}Vb()}}while(0);c[I>>2]=p;c[J+12>>2]=p;c[p+8>>2]=J;c[p+12>>2]=A;i=d;return}A=p;J=H>>>8;do{if((J|0)==0){K=0}else{if(H>>>0>16777215){K=31;break}I=(J+1048320|0)>>>16&8;B=J<<I;b=(B+520192|0)>>>16&4;E=B<<b;B=(E+245760|0)>>>16&2;e=14-(b|I|B)+(E<<B>>>15)|0;K=H>>>(e+7|0)&1|e<<1}}while(0);J=238976+(K<<2)|0;c[p+28>>2]=K;c[p+20>>2]=0;c[p+16>>2]=0;e=c[238676>>2]|0;B=1<<K;if((e&B|0)==0){c[238676>>2]=e|B;c[J>>2]=A;c[p+24>>2]=J;c[p+12>>2]=p;c[p+8>>2]=p;i=d;return}B=c[J>>2]|0;if((K|0)==31){L=0}else{L=25-(K>>>1)|0}c:do{if((c[B+4>>2]&-8|0)==(H|0)){M=B}else{K=H<<L;J=B;while(1){N=J+(K>>>31<<2)+16|0;e=c[N>>2]|0;if((e|0)==0){break}if((c[e+4>>2]&-8|0)==(H|0)){M=e;break c}else{K=K<<1;J=e}}if(N>>>0<(c[238688>>2]|0)>>>0){Vb()}c[N>>2]=A;c[p+24>>2]=J;c[p+12>>2]=p;c[p+8>>2]=p;i=d;return}}while(0);N=M+8|0;H=c[N>>2]|0;B=c[238688>>2]|0;if(M>>>0<B>>>0){Vb()}if(H>>>0<B>>>0){Vb()}c[H+12>>2]=A;c[N>>2]=A;c[p+8>>2]=H;c[p+12>>2]=M;c[p+24>>2]=0;i=d;return}function Gm(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=(a|0)==0?1:a;while(1){e=Bm(d)|0;if((e|0)!=0){f=6;break}a=c[59792]|0;c[59792]=a+0;if((a|0)==0){f=5;break}qc[a&0]()}if((f|0)==5){d=Va(4)|0;c[d>>2]=239184;xb(d|0,239232,109)}else if((f|0)==6){i=b;return e|0}return 0}function Hm(a){a=a|0;var b=0,c=0;b=i;c=Gm(a)|0;i=b;return c|0}function Im(a){a=a|0;var b=0;b=i;if((a|0)!=0){Cm(a)}i=b;return}function Jm(a){a=a|0;var b=0;b=i;Im(a);i=b;return}function Km(a){a=a|0;var b=0;b=i;Mb(a|0);Im(a);i=b;return}function Lm(a){a=a|0;var b=0;b=i;Mb(a|0);i=b;return}function Mm(a){a=a|0;i=i;return 239200}function Nm(){var a=0;a=Va(4)|0;c[a>>2]=239184;xb(a|0,239232,109)}function Om(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,U=0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,fa=0,ga=0,ha=0,ia=0.0,ja=0,ka=0.0,la=0,ma=0.0,na=0,oa=0.0,pa=0.0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0.0,ya=0,za=0.0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0.0,Fa=0,Ga=0.0,Ha=0.0,Ia=0,Ja=0.0,Ka=0,La=0,Na=0,Pa=0,Qa=0,Ra=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0.0,Bc=0,Cc=0,Dc=0.0,Ec=0.0,Fc=0.0,Gc=0.0,Hc=0.0,Ic=0.0,Jc=0,Kc=0,Lc=0.0,Mc=0,Nc=0.0,Oc=0;g=i;i=i+512|0;h=g;if((e|0)==2){j=53;k=-1074}else if((e|0)==1){j=53;k=-1074}else if((e|0)==0){j=24;k=-149}else{l=0.0;i=g;return+l}e=b+4|0;m=b+100|0;do{n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;o=d[n]|0}else{o=Rm(b)|0}}while((Oa(o|0)|0)!=0);do{if((o|0)==43|(o|0)==45){n=1-(((o|0)==45)<<1)|0;p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;q=d[p]|0;r=n;break}else{q=Rm(b)|0;r=n;break}}else{q=o;r=1}}while(0);o=q;q=0;while(1){if((o|32|0)!=(a[239248+q|0]|0)){s=o;t=q;break}do{if(q>>>0<7){n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;u=d[n]|0;break}else{u=Rm(b)|0;break}}else{u=o}}while(0);n=q+1|0;if(n>>>0<8){o=u;q=n}else{s=u;t=n;break}}do{if((t|0)==3){v=23}else if((t|0)!=8){u=(f|0)==0;if(!(t>>>0<4|u)){if((t|0)==8){break}else{v=23;break}}a:do{if((t|0)==0){q=s;o=0;while(1){if((q|32|0)!=(a[239264+o|0]|0)){w=q;z=o;break a}do{if(o>>>0<2){n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;A=d[n]|0;break}else{A=Rm(b)|0;break}}else{A=q}}while(0);n=o+1|0;if(n>>>0<3){q=A;o=n}else{w=A;z=n;break}}}else{w=s;z=t}}while(0);if((z|0)==3){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;B=d[o]|0}else{B=Rm(b)|0}if((B|0)==40){C=1}else{if((c[m>>2]|0)==0){l=x;i=g;return+l}c[e>>2]=(c[e>>2]|0)+ -1;l=x;i=g;return+l}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0}else{D=Rm(b)|0}if(!((D+ -48|0)>>>0<10|(D+ -65|0)>>>0<26)){if(!((D+ -97|0)>>>0<26|(D|0)==95)){break}}C=C+1|0}if((D|0)==41){l=x;i=g;return+l}o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)+ -1}if(u){c[(ab()|0)>>2]=22;Qm(b,0);l=0.0;i=g;return+l}if((C|0)==0|o){l=x;i=g;return+l}else{E=C}while(1){o=E+ -1|0;c[e>>2]=(c[e>>2]|0)+ -1;if((o|0)==0){l=x;break}else{E=o}}i=g;return+l}else if((z|0)==0){do{if((w|0)==48){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;F=d[o]|0}else{F=Rm(b)|0}if((F|32|0)!=120){if((c[m>>2]|0)==0){G=48;break}c[e>>2]=(c[e>>2]|0)+ -1;G=48;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;H=d[o]|0;J=0}else{H=Rm(b)|0;J=0}while(1){if((H|0)==46){v=70;break}else if((H|0)!=48){K=0;L=0;M=0;N=0;O=H;P=J;Q=0;R=0;S=1.0;U=0;V=0.0;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;H=d[o]|0;J=1;continue}else{H=Rm(b)|0;J=1;continue}}b:do{if((v|0)==70){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;W=d[o]|0}else{W=Rm(b)|0}if((W|0)==48){X=-1;Y=-1}else{K=0;L=0;M=0;N=0;O=W;P=J;Q=1;R=0;S=1.0;U=0;V=0.0;break}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;Z=d[o]|0}else{Z=Rm(b)|0}if((Z|0)!=48){K=X;L=Y;M=0;N=0;O=Z;P=1;Q=1;R=0;S=1.0;U=0;V=0.0;break b}o=_m(X|0,Y|0,-1,-1)|0;X=o;Y=I}}}while(0);c:while(1){o=O+ -48|0;do{if(o>>>0<10){_=o;v=84}else{q=O|32;n=(O|0)==46;if(!((q+ -97|0)>>>0<6|n)){$=O;break c}if(n){if((Q|0)==0){aa=M;ba=N;ca=M;da=N;fa=P;ga=1;ha=R;ia=S;ja=U;ka=V;break}else{$=46;break c}}else{_=(O|0)>57?q+ -87|0:o;v=84;break}}}while(0);if((v|0)==84){v=0;do{if((N|0)<0|(N|0)==0&M>>>0<8){la=R;ma=S;na=_+(U<<4)|0;oa=V}else{if((N|0)<0|(N|0)==0&M>>>0<14){pa=S*.0625;la=R;ma=pa;na=U;oa=V+pa*+(_|0);break}if(!((_|0)!=0&(R|0)==0)){la=R;ma=S;na=U;oa=V;break}la=1;ma=S;na=U;oa=V+S*.5}}while(0);o=_m(M|0,N|0,1,0)|0;aa=K;ba=L;ca=o;da=I;fa=1;ga=Q;ha=la;ia=ma;ja=na;ka=oa}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;K=aa;L=ba;M=ca;N=da;O=d[o]|0;P=fa;Q=ga;R=ha;S=ia;U=ja;V=ka;continue}else{K=aa;L=ba;M=ca;N=da;O=Rm(b)|0;P=fa;Q=ga;R=ha;S=ia;U=ja;V=ka;continue}}if((P|0)==0){o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)+ -1}do{if(u){Qm(b,0)}else{if(o){break}q=c[e>>2]|0;c[e>>2]=q+ -1;if((Q|0)==0){break}c[e>>2]=q+ -2}}while(0);l=+(r|0)*0.0;i=g;return+l}o=(Q|0)==0;q=o?M:K;n=o?N:L;if((N|0)<0|(N|0)==0&M>>>0<8){o=M;p=N;qa=U;while(1){ra=qa<<4;sa=_m(o|0,p|0,1,0)|0;ta=I;if((ta|0)<0|(ta|0)==0&sa>>>0<8){qa=ra;p=ta;o=sa}else{ua=ra;break}}}else{ua=U}do{if(($|32|0)==112){o=Pm(b,f)|0;p=I;if(!((o|0)==0&(p|0)==-2147483648)){va=o;wa=p;break}if(u){Qm(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){va=0;wa=0;break}c[e>>2]=(c[e>>2]|0)+ -1;va=0;wa=0;break}}else{if((c[m>>2]|0)==0){va=0;wa=0;break}c[e>>2]=(c[e>>2]|0)+ -1;va=0;wa=0}}while(0);p=cn(q|0,n|0,2)|0;o=_m(p|0,I|0,-32,-1)|0;p=_m(o|0,I|0,va|0,wa|0)|0;o=I;if((ua|0)==0){l=+(r|0)*0.0;i=g;return+l}if((o|0)>0|(o|0)==0&p>>>0>(0-k|0)>>>0){c[(ab()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}qa=k+ -106|0;ra=((qa|0)<0)<<31>>31;if((o|0)<(ra|0)|(o|0)==(ra|0)&p>>>0<qa>>>0){c[(ab()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((ua|0)>-1){qa=p;ra=o;sa=ua;pa=V;while(1){ta=sa<<1;if(!(pa>=.5)){xa=pa;ya=ta}else{xa=pa+-1.0;ya=ta|1}za=pa+xa;ta=_m(qa|0,ra|0,-1,-1)|0;Aa=I;if((ya|0)>-1){qa=ta;ra=Aa;sa=ya;pa=za}else{Ba=ta;Ca=Aa;Da=ya;Ea=za;break}}}else{Ba=p;Ca=o;Da=ua;Ea=V}sa=Zm(32,0,k|0,((k|0)<0)<<31>>31|0)|0;ra=_m(Ba|0,Ca|0,sa|0,I|0)|0;sa=I;if(0>(sa|0)|0==(sa|0)&j>>>0>ra>>>0){Fa=(ra|0)<0?0:ra}else{Fa=j}do{if((Fa|0)<53){pa=+(r|0);za=+Sa(+(+Sm(1.0,84-Fa|0)),+pa);if(!((Fa|0)<32&Ea!=0.0)){Ga=pa;Ha=za;Ia=Da;Ja=Ea;break}ra=Da&1;Ga=pa;Ha=za;Ia=(ra^1)+Da|0;Ja=(ra|0)==0?0.0:Ea}else{Ga=+(r|0);Ha=0.0;Ia=Da;Ja=Ea}}while(0);za=Ga*Ja+(Ha+Ga*+(Ia>>>0))-Ha;if(!(za!=0.0)){c[(ab()|0)>>2]=34}l=+Tm(za,Ba);i=g;return+l}else{G=w}}while(0);o=k+j|0;p=0-o|0;ra=G;sa=0;while(1){if((ra|0)==46){v=139;break}else if((ra|0)!=48){Ka=ra;La=0;Na=0;Pa=sa;Qa=0;break}qa=c[e>>2]|0;if(qa>>>0<(c[m>>2]|0)>>>0){c[e>>2]=qa+1;ra=d[qa]|0;sa=1;continue}else{ra=Rm(b)|0;sa=1;continue}}d:do{if((v|0)==139){ra=c[e>>2]|0;if(ra>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ra+1;Ra=d[ra]|0}else{Ra=Rm(b)|0}if((Ra|0)==48){Ta=-1;Ua=-1}else{Ka=Ra;La=0;Na=0;Pa=sa;Qa=1;break}while(1){ra=c[e>>2]|0;if(ra>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ra+1;Va=d[ra]|0}else{Va=Rm(b)|0}if((Va|0)!=48){Ka=Va;La=Ta;Na=Ua;Pa=1;Qa=1;break d}ra=_m(Ta|0,Ua|0,-1,-1)|0;Ta=ra;Ua=I}}}while(0);sa=h;c[sa>>2]=0;ra=Ka+ -48|0;qa=(Ka|0)==46;e:do{if(ra>>>0<10|qa){n=h+496|0;q=Ka;Aa=qa;ta=ra;Wa=0;Xa=0;Ya=La;Za=Na;_a=Pa;$a=Qa;bb=0;cb=0;db=0;while(1){do{if(Aa){if(($a|0)==0){eb=Wa;fb=Xa;gb=Wa;hb=Xa;ib=_a;jb=1;kb=bb;lb=cb;mb=db}else{nb=q;ob=Wa;pb=Xa;qb=Ya;rb=Za;sb=_a;tb=bb;ub=cb;vb=db;break e}}else{wb=_m(Wa|0,Xa|0,1,0)|0;xb=I;yb=(q|0)!=48;if((cb|0)>=125){if(!yb){eb=Ya;fb=Za;gb=wb;hb=xb;ib=_a;jb=$a;kb=bb;lb=cb;mb=db;break}c[n>>2]=c[n>>2]|1;eb=Ya;fb=Za;gb=wb;hb=xb;ib=_a;jb=$a;kb=bb;lb=cb;mb=db;break}zb=h+(cb<<2)|0;if((bb|0)==0){Ab=ta}else{Ab=q+ -48+((c[zb>>2]|0)*10|0)|0}c[zb>>2]=Ab;zb=bb+1|0;Bb=(zb|0)==9;eb=Ya;fb=Za;gb=wb;hb=xb;ib=1;jb=$a;kb=Bb?0:zb;lb=(Bb&1)+cb|0;mb=yb?wb:db}}while(0);wb=c[e>>2]|0;if(wb>>>0<(c[m>>2]|0)>>>0){c[e>>2]=wb+1;Cb=d[wb]|0}else{Cb=Rm(b)|0}wb=Cb+ -48|0;yb=(Cb|0)==46;if(wb>>>0<10|yb){q=Cb;Aa=yb;ta=wb;Wa=gb;Xa=hb;Ya=eb;Za=fb;_a=ib;$a=jb;bb=kb;cb=lb;db=mb}else{Db=Cb;Eb=gb;Fb=hb;Gb=eb;Hb=fb;Ib=ib;Jb=jb;Kb=kb;Lb=lb;Mb=mb;v=162;break}}}else{Db=Ka;Eb=0;Fb=0;Gb=La;Hb=Na;Ib=Pa;Jb=Qa;Kb=0;Lb=0;Mb=0;v=162}}while(0);if((v|0)==162){ra=(Jb|0)==0;nb=Db;ob=Eb;pb=Fb;qb=ra?Eb:Gb;rb=ra?Fb:Hb;sb=Ib;tb=Kb;ub=Lb;vb=Mb}ra=(sb|0)!=0;do{if(ra){if((nb|32|0)!=101){v=171;break}qa=Pm(b,f)|0;db=I;do{if((qa|0)==0&(db|0)==-2147483648){if(u){Qm(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){Nb=0;Ob=0;break}c[e>>2]=(c[e>>2]|0)+ -1;Nb=0;Ob=0;break}}else{Nb=qa;Ob=db}}while(0);db=_m(Nb|0,Ob|0,qb|0,rb|0)|0;Pb=db;Qb=I}else{v=171}}while(0);do{if((v|0)==171){if(!((nb|0)>-1)){Pb=qb;Qb=rb;break}if((c[m>>2]|0)==0){Pb=qb;Qb=rb;break}c[e>>2]=(c[e>>2]|0)+ -1;Pb=qb;Qb=rb}}while(0);if(!ra){c[(ab()|0)>>2]=22;Qm(b,0);l=0.0;i=g;return+l}u=c[sa>>2]|0;if((u|0)==0){l=+(r|0)*0.0;i=g;return+l}do{if((Pb|0)==(ob|0)&(Qb|0)==(pb|0)&((pb|0)<0|(pb|0)==0&ob>>>0<10)){if(!(j>>>0>30)){if((u>>>j|0)!=0){break}}l=+(r|0)*+(u>>>0);i=g;return+l}}while(0);u=(k|0)/-2|0;ra=((u|0)<0)<<31>>31;if((Qb|0)>(ra|0)|(Qb|0)==(ra|0)&Pb>>>0>u>>>0){c[(ab()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}u=k+ -106|0;ra=((u|0)<0)<<31>>31;if((Qb|0)<(ra|0)|(Qb|0)==(ra|0)&Pb>>>0<u>>>0){c[(ab()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((tb|0)==0){Rb=ub}else{if((tb|0)<9){u=h+(ub<<2)|0;ra=c[u>>2]|0;db=tb;do{ra=ra*10|0;db=db+1|0;}while((db|0)!=9);c[u>>2]=ra}Rb=ub+1|0}do{if((vb|0)<9){if(!((vb|0)<=(Pb|0)&(Pb|0)<18)){break}if((Pb|0)==9){l=+(r|0)*+((c[sa>>2]|0)>>>0);i=g;return+l}if((Pb|0)<9){l=+(r|0)*+((c[sa>>2]|0)>>>0)/+(c[239280+(8-Pb<<2)>>2]|0);i=g;return+l}db=j+27+(ea(Pb,-3)|0)|0;qa=c[sa>>2]|0;if((db|0)<=30){if((qa>>>db|0)!=0){break}}l=+(r|0)*+(qa>>>0)*+(c[239280+(Pb+ -10<<2)>>2]|0);i=g;return+l}}while(0);sa=(Pb|0)%9|0;if((sa|0)==0){Sb=0;Tb=0;Ub=Pb;Vb=Rb}else{ra=(Pb|0)>-1?sa:sa+9|0;sa=c[239280+(8-ra<<2)>>2]|0;do{if((Rb|0)==0){Wb=0;Xb=Pb;Yb=0}else{u=1e9/(sa|0)|0;qa=0;db=0;cb=0;bb=Pb;while(1){$a=h+(cb<<2)|0;_a=c[$a>>2]|0;Za=((_a>>>0)/(sa>>>0)|0)+db|0;c[$a>>2]=Za;Zb=ea((_a>>>0)%(sa>>>0)|0,u)|0;_a=cb+1|0;if((cb|0)==(qa|0)&(Za|0)==0){_b=_a&127;$b=bb+ -9|0}else{_b=qa;$b=bb}if((_a|0)==(Rb|0)){break}else{qa=_b;bb=$b;cb=_a;db=Zb}}if((Zb|0)==0){Wb=_b;Xb=$b;Yb=Rb;break}c[h+(Rb<<2)>>2]=Zb;Wb=_b;Xb=$b;Yb=Rb+1|0}}while(0);Sb=Wb;Tb=0;Ub=9-ra+Xb|0;Vb=Yb}f:while(1){sa=h+(Sb<<2)|0;if((Ub|0)<18){db=Tb;cb=Vb;while(1){bb=0;qa=cb+127|0;u=cb;while(1){_a=qa&127;Za=h+(_a<<2)|0;$a=cn(c[Za>>2]|0,0,29)|0;Ya=_m($a|0,I|0,bb|0,0)|0;$a=I;if($a>>>0>0|($a|0)==0&Ya>>>0>1e9){Xa=mn(Ya|0,$a|0,1e9,0)|0;Wa=nn(Ya|0,$a|0,1e9,0)|0;ac=Wa;bc=Xa}else{ac=Ya;bc=0}c[Za>>2]=ac;Za=(_a|0)==(Sb|0);if((_a|0)!=(u+127&127|0)|Za){cc=u}else{cc=(ac|0)==0?_a:u}if(Za){break}else{bb=bc;qa=_a+ -1|0;u=cc}}u=db+ -29|0;if((bc|0)==0){db=u;cb=cc}else{dc=u;ec=bc;fc=cc;break}}}else{if((Ub|0)==18){gc=Tb;hc=Vb}else{ic=Sb;jc=Tb;kc=Ub;lc=Vb;break}while(1){if(!((c[sa>>2]|0)>>>0<9007199)){ic=Sb;jc=gc;kc=18;lc=hc;break f}cb=0;db=hc+127|0;u=hc;while(1){qa=db&127;bb=h+(qa<<2)|0;_a=cn(c[bb>>2]|0,0,29)|0;Za=_m(_a|0,I|0,cb|0,0)|0;_a=I;if(_a>>>0>0|(_a|0)==0&Za>>>0>1e9){Ya=mn(Za|0,_a|0,1e9,0)|0;Xa=nn(Za|0,_a|0,1e9,0)|0;mc=Xa;nc=Ya}else{mc=Za;nc=0}c[bb>>2]=mc;bb=(qa|0)==(Sb|0);if((qa|0)!=(u+127&127|0)|bb){oc=u}else{oc=(mc|0)==0?qa:u}if(bb){break}else{cb=nc;db=qa+ -1|0;u=oc}}u=gc+ -29|0;if((nc|0)==0){gc=u;hc=oc}else{dc=u;ec=nc;fc=oc;break}}}sa=Sb+127&127;if((sa|0)==(fc|0)){u=fc+127&127;db=h+((fc+126&127)<<2)|0;c[db>>2]=c[db>>2]|c[h+(u<<2)>>2];pc=u}else{pc=fc}c[h+(sa<<2)>>2]=ec;Sb=sa;Tb=dc;Ub=Ub+9|0;Vb=pc}g:while(1){qc=lc+1&127;ra=h+((lc+127&127)<<2)|0;sa=ic;u=jc;db=kc;while(1){cb=(db|0)==18;qa=(db|0)>27?9:1;rc=sa;sc=u;while(1){bb=0;while(1){Za=bb+rc&127;if((Za|0)==(lc|0)){tc=2;break}Ya=c[h+(Za<<2)>>2]|0;Za=c[239272+(bb<<2)>>2]|0;if(Ya>>>0<Za>>>0){tc=2;break}Xa=bb+1|0;if(Ya>>>0>Za>>>0){tc=bb;break}if((Xa|0)<2){bb=Xa}else{tc=Xa;break}}if((tc|0)==2&cb){break g}uc=qa+sc|0;if((rc|0)==(lc|0)){rc=lc;sc=uc}else{break}}cb=(1<<qa)+ -1|0;bb=1e9>>>qa;vc=rc;wc=0;Xa=rc;xc=db;do{Za=h+(Xa<<2)|0;Ya=c[Za>>2]|0;_a=(Ya>>>qa)+wc|0;c[Za>>2]=_a;wc=ea(Ya&cb,bb)|0;Ya=(Xa|0)==(vc|0)&(_a|0)==0;Xa=Xa+1&127;xc=Ya?xc+ -9|0:xc;vc=Ya?Xa:vc;}while((Xa|0)!=(lc|0));if((wc|0)==0){sa=vc;u=uc;db=xc;continue}if((qc|0)!=(vc|0)){break}c[ra>>2]=c[ra>>2]|1;sa=vc;u=uc;db=xc}c[h+(lc<<2)>>2]=wc;ic=vc;jc=uc;kc=xc;lc=qc}db=rc&127;if((db|0)==(lc|0)){c[h+(qc+ -1<<2)>>2]=0;yc=qc}else{yc=lc}za=+((c[h+(db<<2)>>2]|0)>>>0);db=rc+1&127;if((db|0)==(yc|0)){u=yc+1&127;c[h+(u+ -1<<2)>>2]=0;zc=u}else{zc=yc}pa=+(r|0);Ac=pa*(za*1.0e9+ +((c[h+(db<<2)>>2]|0)>>>0));db=sc+53|0;u=db-k|0;if((u|0)<(j|0)){Bc=(u|0)<0?0:u;Cc=1}else{Bc=j;Cc=0}if((Bc|0)<53){za=+Sa(+(+Sm(1.0,105-Bc|0)),+Ac);Dc=+Ma(+Ac,+(+Sm(1.0,53-Bc|0)));Ec=za;Fc=Dc;Gc=za+(Ac-Dc)}else{Ec=0.0;Fc=0.0;Gc=Ac}sa=rc+2&127;do{if((sa|0)==(zc|0)){Hc=Fc}else{ra=c[h+(sa<<2)>>2]|0;do{if(ra>>>0<5e8){if((ra|0)==0){if((rc+3&127|0)==(zc|0)){Ic=Fc;break}}Ic=pa*.25+Fc}else{if(ra>>>0>5e8){Ic=pa*.75+Fc;break}if((rc+3&127|0)==(zc|0)){Ic=pa*.5+Fc;break}else{Ic=pa*.75+Fc;break}}}while(0);if((53-Bc|0)<=1){Hc=Ic;break}if(+Ma(+Ic,1.0)!=0.0){Hc=Ic;break}Hc=Ic+1.0}}while(0);pa=Gc+Hc-Ec;do{if((db&2147483647|0)>(-2-o|0)){if(!(+T(+pa)>=9007199254740992.0)){Jc=Cc;Kc=sc;Lc=pa}else{Jc=(Cc|0)!=0&(Bc|0)==(u|0)?0:Cc;Kc=sc+1|0;Lc=pa*.5}if((Kc+50|0)<=(p|0)){if(!((Jc|0)!=0&Hc!=0.0)){Mc=Kc;Nc=Lc;break}}c[(ab()|0)>>2]=34;Mc=Kc;Nc=Lc}else{Mc=sc;Nc=pa}}while(0);l=+Tm(Nc,Mc);i=g;return+l}else{if((c[m>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)+ -1}c[(ab()|0)>>2]=22;Qm(b,0);l=0.0;i=g;return+l}}}while(0);do{if((v|0)==23){b=(c[m>>2]|0)==0;if(!b){c[e>>2]=(c[e>>2]|0)+ -1}if(t>>>0<4|(f|0)==0|b){break}else{Oc=t}do{c[e>>2]=(c[e>>2]|0)+ -1;Oc=Oc+ -1|0;}while(Oc>>>0>3)}}while(0);l=+(r|0)*y;i=g;return+l}function Pm(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=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;e=i;f=a+4|0;g=c[f>>2]|0;h=a+100|0;if(g>>>0<(c[h>>2]|0)>>>0){c[f>>2]=g+1;j=d[g]|0}else{j=Rm(a)|0}do{if((j|0)==43|(j|0)==45){g=(j|0)==45|0;k=c[f>>2]|0;if(k>>>0<(c[h>>2]|0)>>>0){c[f>>2]=k+1;l=d[k]|0}else{l=Rm(a)|0}if((l+ -48|0)>>>0<10|(b|0)==0){m=l;n=g;break}if((c[h>>2]|0)==0){m=l;n=g;break}c[f>>2]=(c[f>>2]|0)+ -1;m=l;n=g}else{m=j;n=0}}while(0);if((m+ -48|0)>>>0>9){if((c[h>>2]|0)==0){o=0;p=-2147483648;I=p;i=e;return o|0}c[f>>2]=(c[f>>2]|0)+ -1;o=0;p=-2147483648;I=p;i=e;return o|0}else{q=m;r=0}while(1){s=q+ -48+r|0;m=c[f>>2]|0;if(m>>>0<(c[h>>2]|0)>>>0){c[f>>2]=m+1;t=d[m]|0}else{t=Rm(a)|0}if(!((t+ -48|0)>>>0<10&(s|0)<214748364)){break}q=t;r=s*10|0}r=((s|0)<0)<<31>>31;if((t+ -48|0)>>>0<10){q=s;m=r;j=t;while(1){l=ln(q|0,m|0,10,0)|0;b=I;g=_m(j|0,((j|0)<0)<<31>>31|0,-48,-1)|0;k=_m(g|0,I|0,l|0,b|0)|0;b=I;l=c[f>>2]|0;if(l>>>0<(c[h>>2]|0)>>>0){c[f>>2]=l+1;u=d[l]|0}else{u=Rm(a)|0}if((u+ -48|0)>>>0<10&((b|0)<21474836|(b|0)==21474836&k>>>0<2061584302)){j=u;m=b;q=k}else{v=k;w=b;x=u;break}}}else{v=s;w=r;x=t}if((x+ -48|0)>>>0<10){do{x=c[f>>2]|0;if(x>>>0<(c[h>>2]|0)>>>0){c[f>>2]=x+1;y=d[x]|0}else{y=Rm(a)|0}}while((y+ -48|0)>>>0<10)}if((c[h>>2]|0)!=0){c[f>>2]=(c[f>>2]|0)+ -1}f=(n|0)!=0;n=Zm(0,0,v|0,w|0)|0;o=f?n:v;p=f?I:w;I=p;i=e;return o|0}function Qm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;c[a+104>>2]=b;e=c[a+8>>2]|0;f=c[a+4>>2]|0;g=e-f|0;c[a+108>>2]=g;if((b|0)!=0&(g|0)>(b|0)){c[a+100>>2]=f+b;i=d;return}else{c[a+100>>2]=e;i=d;return}}function Rm(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;f=b+104|0;g=c[f>>2]|0;if((g|0)==0){h=3}else{if((c[b+108>>2]|0)<(g|0)){h=3}}do{if((h|0)==3){g=Vm(b)|0;if((g|0)<0){break}j=c[f>>2]|0;k=c[b+8>>2]|0;do{if((j|0)==0){h=8}else{l=c[b+4>>2]|0;m=j-(c[b+108>>2]|0)+ -1|0;if((k-l|0)<=(m|0)){h=8;break}c[b+100>>2]=l+m}}while(0);if((h|0)==8){c[b+100>>2]=k}j=c[b+4>>2]|0;if((k|0)!=0){m=b+108|0;c[m>>2]=k+1-j+(c[m>>2]|0)}m=j+ -1|0;if((d[m]|0|0)==(g|0)){n=g;i=e;return n|0}a[m]=g;n=g;i=e;return n|0}}while(0);c[b+100>>2]=0;n=-1;i=e;return n|0}function Sm(a,b){a=+a;b=b|0;var d=0,e=0.0,f=0,g=0,j=0.0;d=i;do{if((b|0)>1023){e=a*8.98846567431158e+307;f=b+ -1023|0;if((f|0)<=1023){g=f;j=e;break}f=b+ -2046|0;g=(f|0)>1023?1023:f;j=e*8.98846567431158e+307}else{if(!((b|0)<-1022)){g=b;j=a;break}e=a*2.2250738585072014e-308;f=b+1022|0;if(!((f|0)<-1022)){g=f;j=e;break}f=b+2044|0;g=(f|0)<-1022?-1022:f;j=e*2.2250738585072014e-308}}while(0);b=cn(g+1023|0,0,52)|0;g=I;c[k>>2]=b;c[k+4>>2]=g;a=j*+h[k>>3];i=d;return+a}function Tm(a,b){a=+a;b=b|0;var c=0,d=0.0;c=i;d=+Sm(a,b);i=c;return+d}function Um(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b+74|0;f=a[e]|0;a[e]=f+255|f;f=b+20|0;e=b+44|0;if((c[f>>2]|0)>>>0>(c[e>>2]|0)>>>0){gc[c[b+36>>2]&31](b,0,0)|0}c[b+16>>2]=0;c[b+28>>2]=0;c[f>>2]=0;f=b;g=c[f>>2]|0;if((g&20|0)==0){h=c[e>>2]|0;c[b+8>>2]=h;c[b+4>>2]=h;j=0;i=d;return j|0}if((g&4|0)==0){j=-1;i=d;return j|0}c[f>>2]=g|32;j=-1;i=d;return j|0}function Vm(a){a=a|0;var b=0,e=0,f=0,g=0;b=i;i=i+8|0;e=b;if((c[a+8>>2]|0)==0){if((Um(a)|0)==0){f=3}else{g=-1}}else{f=3}do{if((f|0)==3){if((gc[c[a+32>>2]&31](a,e,1)|0)!=1){g=-1;break}g=d[e]|0}}while(0);i=b;return g|0}function Wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0.0,j=0,k=0;d=i;i=i+112|0;e=d;f=e+0|0;g=f+112|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));f=e+4|0;c[f>>2]=a;g=e+8|0;c[g>>2]=-1;c[e+44>>2]=a;c[e+76>>2]=-1;Qm(e,0);h=+Om(e,2,1);j=(c[f>>2]|0)-(c[g>>2]|0)+(c[e+108>>2]|0)|0;if((b|0)==0){i=d;return+h}if((j|0)==0){k=a}else{k=a+j|0}c[b>>2]=k;i=d;return+h}function Xm(){c[56816]=o;c[56842]=o;c[59580]=o;c[59810]=o}function Ym(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function Zm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return(I=e,a-c>>>0|0)|0}function _m(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return(I=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function $m(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return nb(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function an(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]=a[c]|0}b=e}else{$m(b,c,d)|0}return b|0}function bn(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function cn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}I=a<<c-32;return 0}function dn(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=0;return b>>>c-32|0}function en(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){I=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}I=(b|0)<0?-1:0;return b>>c-32|0}function fn(b){b=b|0;var c=0;c=a[n+(b>>>24)|0]|0;if((c|0)<8)return c|0;c=a[n+(b>>16&255)|0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>8&255)|0]|0;if((c|0)<8)return c+16|0;return(a[n+(b&255)|0]|0)+24|0}function gn(b){b=b|0;var c=0;c=a[m+(b&255)|0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)|0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)|0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)|0]|0)+24|0}function hn(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=ea(d,c)|0;f=a>>>16;a=(e>>>16)+(ea(d,f)|0)|0;d=b>>>16;b=ea(d,c)|0;return(I=(a>>>16)+(ea(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function jn(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>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=Zm(e^a,f^b,e,f)|0;b=I;a=g^e;e=h^f;f=Zm((on(i,b,Zm(g^c,h^d,g,h)|0,I,0)|0)^a,I^e,a,e)|0;return(I=I,f)|0}function kn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+8|0;g=f|0;h=b>>31|((b|0)<0?-1:0)<<1;j=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;l=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;m=Zm(h^a,j^b,h,j)|0;b=I;on(m,b,Zm(k^d,l^e,k,l)|0,I,g)|0;l=Zm(c[g>>2]^h,c[g+4>>2]^j,h,j)|0;j=I;i=f;return(I=j,l)|0}function ln(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=hn(e,a)|0;f=I;return(I=(ea(b,a)|0)+(ea(d,e)|0)+f|f&0,c|0|0)|0}function mn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=on(a,b,c,d,0)|0;return(I=I,e)|0}function nn(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+8|0;g=f|0;on(a,b,d,e,g)|0;i=f;return(I=c[g+4>>2]|0,c[g>>2]|0)|0}function on(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,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,J=0,K=0,L=0,M=0;g=a;h=b;i=h;j=d;k=e;l=k;if((i|0)==0){m=(f|0)!=0;if((l|0)==0){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return(I=n,o)|0}else{if(!m){n=0;o=0;return(I=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return(I=n,o)|0}}m=(l|0)==0;do{if((j|0)==0){if(m){if((f|0)!=0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return(I=n,o)|0}if((g|0)==0){if((f|0)!=0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return(I=n,o)|0}p=l-1|0;if((p&l|0)==0){if((f|0)!=0){c[f>>2]=a|0;c[f+4>>2]=p&i|b&0}n=0;o=i>>>((gn(l|0)|0)>>>0);return(I=n,o)|0}p=(fn(l|0)|0)-(fn(i|0)|0)|0;if(p>>>0<=30){q=p+1|0;r=31-p|0;s=q;t=i<<r|g>>>(q>>>0);u=i>>>(q>>>0);v=0;w=g<<r;break}if((f|0)==0){n=0;o=0;return(I=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(I=n,o)|0}else{if(!m){r=(fn(l|0)|0)-(fn(i|0)|0)|0;if(r>>>0<=31){q=r+1|0;p=31-r|0;x=r-31>>31;s=q;t=g>>>(q>>>0)&x|i<<p;u=i>>>(q>>>0)&x;v=0;w=g<<p;break}if((f|0)==0){n=0;o=0;return(I=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(I=n,o)|0}p=j-1|0;if((p&j|0)!=0){x=(fn(j|0)|0)+33-(fn(i|0)|0)|0;q=64-x|0;r=32-x|0;y=r>>31;z=x-32|0;A=z>>31;s=x;t=r-1>>31&i>>>(z>>>0)|(i<<r|g>>>(x>>>0))&A;u=A&i>>>(x>>>0);v=g<<q&y;w=(i<<q|g>>>(z>>>0))&y|g<<r&x-33>>31;break}if((f|0)!=0){c[f>>2]=p&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return(I=n,o)|0}else{p=gn(j|0)|0;n=i>>>(p>>>0)|0;o=i<<32-p|g>>>(p>>>0)|0;return(I=n,o)|0}}}while(0);if((s|0)==0){B=w;C=v;D=u;E=t;F=0;G=0}else{g=d|0|0;d=k|e&0;e=_m(g,d,-1,-1)|0;k=I;i=w;w=v;v=u;u=t;t=s;s=0;while(1){H=w>>>31|i<<1;J=s|w<<1;j=u<<1|i>>>31|0;a=u>>>31|v<<1|0;Zm(e,k,j,a)|0;b=I;h=b>>31|((b|0)<0?-1:0)<<1;K=h&1;L=Zm(j,a,h&g,(((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1)&d)|0;M=I;b=t-1|0;if((b|0)==0){break}else{i=H;w=J;v=M;u=L;t=b;s=K}}B=H;C=J;D=M;E=L;F=0;G=K}K=C;C=0;if((f|0)!=0){c[f>>2]=E;c[f+4>>2]=D}n=(K|0)>>>31|(B|C)<<1|(C<<1|K>>>31)&0|F;o=(K<<1|0>>>31)&-2|G;return(I=n,o)|0}function pn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return gc[a&31](b|0,c|0,d|0)|0}function qn(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;hc[a&63](b|0,c|0,d|0,e|0,f|0,g|0,h|0)}function rn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ic[a&3](b|0,c|0,d|0,e|0,f|0)}function sn(a,b){a=a|0;b=b|0;jc[a&127](b|0)}function tn(a,b,c){a=a|0;b=b|0;c=c|0;kc[a&63](b|0,c|0)}function un(a,b,c,d,e,f,g,h,i,j){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;lc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function vn(a,b){a=a|0;b=b|0;return mc[a&63](b|0)|0}function wn(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;nc[a&3](b|0,c|0,d|0,e|0,f|0,g|0,+h)}function xn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;oc[a&3](b|0,c|0,d|0)}function yn(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;pc[a&7](b|0,c|0,d|0,e|0,f|0,+g)}function zn(a){a=a|0;qc[a&0]()}function An(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 rc[a&15](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Bn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return sc[a&7](b|0,c|0,d|0,e|0)|0}function Cn(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;tc[a&7](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)}function Dn(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;uc[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function En(a,b,c){a=a|0;b=b|0;c=c|0;return vc[a&15](b|0,c|0)|0}function Fn(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 wc[a&15](b|0,c|0,d|0,e|0,f|0)|0}function Gn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;xc[a&7](b|0,c|0,d|0,e|0)}function Hn(a,b,c){a=a|0;b=b|0;c=c|0;fa(0);return 0}function In(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;fa(1)}function Jn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fa(2)}function Kn(a){a=a|0;fa(3)}function Ln(a,b){a=a|0;b=b|0;fa(4)}function Mn(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;fa(5)}function Nn(a){a=a|0;fa(6);return 0}function On(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;fa(7)}function Pn(a,b,c){a=a|0;b=b|0;c=c|0;fa(8)}function Qn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;fa(9)}function Rn(){fa(10)}function Sn(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;fa(11);return 0}function Tn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fa(12);return 0}function Un(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;fa(13)}function Vn(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;fa(14)}function Wn(a,b){a=a|0;b=b|0;fa(15);return 0}function Xn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fa(16);return 0}function Yn(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fa(17)}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nvar gc=[Hn,Ze,cf,od,gf,Le,Qe,Cd,Ue,ae,be,Tf,Yf,zj,Ej,jk,lk,ok,Wj,$j,bk,ek,qm,Hn,Hn,Hn,Hn,Hn,Hn,Hn,Hn,Hn];var hc=[In,$f,bg,dg,fg,hg,jg,lg,ng,pg,rg,tg,yg,Ag,Cg,Eg,Gg,Ig,Kg,Mg,Og,Qg,Sg,eh,gh,sh,uh,Dh,Eh,Fh,Gh,Hh,Qh,Rh,Sh,Th,Uh,qj,wj,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In,In];var ic=[Jn,xm,wm,vm];var jc=[Kn,kd,ld,rd,sd,yd,zd,Fd,Gd,Sd,Rd,Xd,Wd,Zd,ge,fe,Je,Ie,Xe,We,kf,jf,mf,lf,qf,pf,sf,rf,vf,uf,xf,wf,Df,Cf,Ff,Ef,Lf,Kf,Fe,Mf,Jf,Nf,Pf,Of,Tj,Vf,Uf,_f,Zf,xg,wg,$g,_g,nh,mh,Bh,Ah,Oh,Nh,_h,Zh,bi,ai,fi,ei,qi,pi,Bi,Ai,Mi,Li,Xi,Wi,fj,ej,mj,lj,sj,rj,yj,xj,Dj,Cj,Mj,Lj,hk,gk,Hj,yk,dl,cl,fl,el,Qf,Sj,Vj,qk,Gk,Rk,al,bl,im,hm,km,nm,lm,mm,om,pm,Lm,Km,jd,Uj,Nl,Zi,Cm,Ul,Tl,Sl,Rl,Ql,Pl,me,xe,Kn,Kn,Kn,Kn];var kc=[Ln,md,td,Ad,Hd,Ke,Ye,ii,ji,ki,li,ni,oi,ti,ui,vi,wi,yi,zi,Ei,Fi,Gi,Hi,Ji,Ki,Pi,Qi,Ri,Si,Ui,Vi,Bj,Gj,kl,ml,ol,ll,nl,pl,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln,Ln];var lc=[Mn,Ih,Vh,Mn];var mc=[Nn,nd,bf,df,ef,af,ud,vd,Bd,Pe,Re,Se,Oe,Id,Jd,Td,Yd,Hf,Ch,ql,sl,ul,Al,Cl,wl,yl,Ph,rl,tl,vl,Bl,Dl,xl,zl,gi,hi,mi,ri,si,xi,Ci,Di,Ii,Ni,Oi,Ti,Ck,Dk,Fk,gl,il,hl,jl,uk,vk,xk,Mk,Nk,Qk,Xk,Yk,$k,jm,Mm];var nc=[On,nj,tj,On];var oc=[Pn,$d,If,Pn];var pc=[Qn,hh,kh,vh,xh,Qn,Qn,Qn];var qc=[Rn];var rc=[Sn,zk,Ak,rk,sk,Hk,Jk,Sk,Uk,Sn,Sn,Sn,Sn,Sn,Sn,Sn];var sc=[Tn,nk,Xj,Yj,Zj,dk,Tn,Tn];var tc=[Un,$h,ci,Yi,aj,gj,ij,Un];var uc=[Vn,_e,Me,ah,bh,fh,lh,oh,ph,th,yh,Aj,Fj,Am,zm,ym];var vc=[Wn,ff,pd,wd,hf,Te,Dd,Kd,Ve,ik,kk,mk,_j,ak,ck,Wn];var wc=[Xn,Rf,Wf,pk,Bk,Ek,fk,tk,wk,Lk,Ok,Wk,Zk,Xn,Xn,Xn];var xc=[Yn,$e,Ne,Sf,Xf,rm,sm,tm];return{_i64Subtract:Zm,_free:Cm,_main:dd,_realloc:Dm,_i64Add:_m,_memmove:an,_strlen:bn,_memset:Ym,_malloc:Bm,_memcpy:$m,_bitshift64Shl:cn,__GLOBAL__I_a:Md,runPostSets:Xm,stackAlloc:yc,stackSave:zc,stackRestore:Ac,setThrew:Bc,setTempRet0:Ec,setTempRet1:Fc,setTempRet2:Gc,setTempRet3:Hc,setTempRet4:Ic,setTempRet5:Jc,setTempRet6:Kc,setTempRet7:Lc,setTempRet8:Mc,setTempRet9:Nc,dynCall_iiii:pn,dynCall_viiiiiii:qn,dynCall_viiiii:rn,dynCall_vi:sn,dynCall_vii:tn,dynCall_viiiiiiiii:un,dynCall_ii:vn,dynCall_viiiiiid:wn,dynCall_viii:xn,dynCall_viiiiid:yn,dynCall_v:zn,dynCall_iiiiiiiii:An,dynCall_iiiii:Bn,dynCall_viiiiiiii:Cn,dynCall_viiiiii:Dn,dynCall_iii:En,dynCall_iiiiii:Fn,dynCall_viiii:Gn}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"invoke_iiii\": invoke_iiii, \"invoke_viiiiiii\": invoke_viiiiiii, \"invoke_viiiii\": invoke_viiiii, \"invoke_vi\": invoke_vi, \"invoke_vii\": invoke_vii, \"invoke_viiiiiiiii\": invoke_viiiiiiiii, \"invoke_ii\": invoke_ii, \"invoke_viiiiiid\": invoke_viiiiiid, \"invoke_viii\": invoke_viii, \"invoke_viiiiid\": invoke_viiiiid, \"invoke_v\": invoke_v, \"invoke_iiiiiiiii\": invoke_iiiiiiiii, \"invoke_iiiii\": invoke_iiiii, \"invoke_viiiiiiii\": invoke_viiiiiiii, \"invoke_viiiiii\": invoke_viiiiii, \"invoke_iii\": invoke_iii, \"invoke_iiiiii\": invoke_iiiiii, \"invoke_viiii\": invoke_viiii, \"_fabs\": _fabs, \"_pthread_cond_wait\": _pthread_cond_wait, \"_freelocale\": _freelocale, \"__formatString\": __formatString, \"_asprintf\": _asprintf, \"_send\": _send, \"_strtoll_l\": _strtoll_l, \"_vsscanf\": _vsscanf, \"___ctype_b_loc\": ___ctype_b_loc, \"__ZSt9terminatev\": __ZSt9terminatev, \"_fmod\": _fmod, \"___cxa_guard_acquire\": ___cxa_guard_acquire, \"_isspace\": _isspace, \"___setErrNo\": ___setErrNo, \"___cxa_is_number_type\": ___cxa_is_number_type, \"_atexit\": _atexit, \"_copysign\": _copysign, \"_ungetc\": _ungetc, \"___cxa_free_exception\": ___cxa_free_exception, \"___cxa_allocate_exception\": ___cxa_allocate_exception, \"__ZSt18uncaught_exceptionv\": __ZSt18uncaught_exceptionv, \"_isxdigit_l\": _isxdigit_l, \"___ctype_toupper_loc\": ___ctype_toupper_loc, \"_fflush\": _fflush, \"___cxa_guard_release\": ___cxa_guard_release, \"__addDays\": __addDays, \"___errno_location\": ___errno_location, \"_strtoll\": _strtoll, \"_strerror_r\": _strerror_r, \"_strftime_l\": _strftime_l, \"_llvm_lifetime_start\": _llvm_lifetime_start, \"_isdigit\": _isdigit, \"_sscanf\": _sscanf, \"_sbrk\": _sbrk, \"_uselocale\": _uselocale, \"_catgets\": _catgets, \"_newlocale\": _newlocale, \"_snprintf\": _snprintf, \"___cxa_begin_catch\": ___cxa_begin_catch, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"_fileno\": _fileno, \"_pread\": _pread, \"___resumeException\": ___resumeException, \"___cxa_find_matching_catch\": ___cxa_find_matching_catch, \"__exit\": __exit, \"_strtoull\": _strtoull, \"_isdigit_l\": _isdigit_l, \"_strftime\": _strftime, \"__arraySum\": __arraySum, \"___cxa_throw\": ___cxa_throw, \"___ctype_tolower_loc\": ___ctype_tolower_loc, \"___cxa_end_catch\": ___cxa_end_catch, \"_pthread_mutex_unlock\": _pthread_mutex_unlock, \"_fread\": _fread, \"_pthread_cond_broadcast\": _pthread_cond_broadcast, \"_isxdigit\": _isxdigit, \"_sprintf\": _sprintf, \"__reallyNegative\": __reallyNegative, \"_vasprintf\": _vasprintf, \"_write\": _write, \"__isLeapYear\": __isLeapYear, \"__scanString\": __scanString, \"_recv\": _recv, \"_vsnprintf\": _vsnprintf, \"__ZNSt9exceptionD2Ev\": __ZNSt9exceptionD2Ev, \"_fgetc\": _fgetc, \"_strtoull_l\": _strtoull_l, \"_mkport\": _mkport, \"___cxa_does_inherit\": ___cxa_does_inherit, \"_sysconf\": _sysconf, \"_read\": _read, \"___cxa_rethrow\": ___cxa_rethrow, \"__parseInt64\": __parseInt64, \"_abort\": _abort, \"_catclose\": _catclose, \"_fwrite\": _fwrite, \"_time\": _time, \"_pthread_mutex_lock\": _pthread_mutex_lock, \"_strerror\": _strerror, \"_gettimeofday\": _gettimeofday, \"_llvm_lifetime_end\": _llvm_lifetime_end, \"_pwrite\": _pwrite, \"_catopen\": _catopen, \"_exit\": _exit, \"__getFloat\": __getFloat, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"cttz_i8\": cttz_i8, \"ctlz_i8\": ctlz_i8, \"NaN\": NaN, \"Infinity\": Infinity, \"__ZTISt9exception\": __ZTISt9exception, \"___dso_handle\": ___dso_handle, \"_stderr\": _stderr, \"_stdin\": _stdin, \"_stdout\": _stdout }, buffer);\nvar _i64Subtract = Module[\"_i64Subtract\"] = asm[\"_i64Subtract\"];\nvar _free = Module[\"_free\"] = asm[\"_free\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _realloc = Module[\"_realloc\"] = asm[\"_realloc\"];\nvar _i64Add = Module[\"_i64Add\"] = asm[\"_i64Add\"];\nvar _memmove = Module[\"_memmove\"] = asm[\"_memmove\"];\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar _malloc = Module[\"_malloc\"] = asm[\"_malloc\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _bitshift64Shl = Module[\"_bitshift64Shl\"] = asm[\"_bitshift64Shl\"];\nvar __GLOBAL__I_a = Module[\"__GLOBAL__I_a\"] = asm[\"__GLOBAL__I_a\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\nvar dynCall_iiii = Module[\"dynCall_iiii\"] = asm[\"dynCall_iiii\"];\nvar dynCall_viiiiiii = Module[\"dynCall_viiiiiii\"] = asm[\"dynCall_viiiiiii\"];\nvar dynCall_viiiii = Module[\"dynCall_viiiii\"] = asm[\"dynCall_viiiii\"];\nvar dynCall_vi = Module[\"dynCall_vi\"] = asm[\"dynCall_vi\"];\nvar dynCall_vii = Module[\"dynCall_vii\"] = asm[\"dynCall_vii\"];\nvar dynCall_viiiiiiiii = Module[\"dynCall_viiiiiiiii\"] = asm[\"dynCall_viiiiiiiii\"];\nvar dynCall_ii = Module[\"dynCall_ii\"] = asm[\"dynCall_ii\"];\nvar dynCall_viiiiiid = Module[\"dynCall_viiiiiid\"] = asm[\"dynCall_viiiiiid\"];\nvar dynCall_viii = Module[\"dynCall_viii\"] = asm[\"dynCall_viii\"];\nvar dynCall_viiiiid = Module[\"dynCall_viiiiid\"] = asm[\"dynCall_viiiiid\"];\nvar dynCall_v = Module[\"dynCall_v\"] = asm[\"dynCall_v\"];\nvar dynCall_iiiiiiiii = Module[\"dynCall_iiiiiiiii\"] = asm[\"dynCall_iiiiiiiii\"];\nvar dynCall_iiiii = Module[\"dynCall_iiiii\"] = asm[\"dynCall_iiiii\"];\nvar dynCall_viiiiiiii = Module[\"dynCall_viiiiiiii\"] = asm[\"dynCall_viiiiiiii\"];\nvar dynCall_viiiiii = Module[\"dynCall_viiiiii\"] = asm[\"dynCall_viiiiii\"];\nvar dynCall_iii = Module[\"dynCall_iii\"] = asm[\"dynCall_iii\"];\nvar dynCall_iiiiii = Module[\"dynCall_iiiiii\"] = asm[\"dynCall_iiiiii\"];\nvar dynCall_viiii = Module[\"dynCall_viiii\"] = asm[\"dynCall_viiii\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// TODO: strip out parts of this we do not need\n\n//======= begin closure i64 code =======\n\n// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\n * implementation is derived from LongLib in GWT.\n *\n */\n\nvar i64Math = (function() { // Emscripten wrapper\n  var goog = { math: {} };\n\n\n  /**\n   * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\n   * values as *signed* integers.  See the from* functions below for more\n   * convenient ways of constructing Longs.\n   *\n   * The internal representation of a long is the two given signed, 32-bit values.\n   * We use 32-bit pieces because these are the size of integers on which\n   * Javascript performs bit-operations.  For operations like addition and\n   * multiplication, we split each number into 16-bit pieces, which can easily be\n   * multiplied within Javascript's floating-point representation without overflow\n   * or change in sign.\n   *\n   * In the algorithms below, we frequently reduce the negative case to the\n   * positive case by negating the input(s) and then post-processing the result.\n   * Note that we must ALWAYS check specially whether those values are MIN_VALUE\n   * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n   * a positive number, it overflows back into a negative).  Not handling this\n   * case would often result in infinite recursion.\n   *\n   * @param {number} low  The low (signed) 32 bits of the long.\n   * @param {number} high  The high (signed) 32 bits of the long.\n   * @constructor\n   */\n  goog.math.Long = function(low, high) {\n    /**\n     * @type {number}\n     * @private\n     */\n    this.low_ = low | 0;  // force into 32 signed bits.\n\n    /**\n     * @type {number}\n     * @private\n     */\n    this.high_ = high | 0;  // force into 32 signed bits.\n  };\n\n\n  // NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\n  // from* methods on which they depend.\n\n\n  /**\n   * A cache of the Long representations of small integer values.\n   * @type {!Object}\n   * @private\n   */\n  goog.math.Long.IntCache_ = {};\n\n\n  /**\n   * Returns a Long representing the given (32-bit) integer value.\n   * @param {number} value The 32-bit integer in question.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromInt = function(value) {\n    if (-128 <= value && value < 128) {\n      var cachedObj = goog.math.Long.IntCache_[value];\n      if (cachedObj) {\n        return cachedObj;\n      }\n    }\n\n    var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\n    if (-128 <= value && value < 128) {\n      goog.math.Long.IntCache_[value] = obj;\n    }\n    return obj;\n  };\n\n\n  /**\n   * Returns a Long representing the given value, provided that it is a finite\n   * number.  Otherwise, zero is returned.\n   * @param {number} value The number in question.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromNumber = function(value) {\n    if (isNaN(value) || !isFinite(value)) {\n      return goog.math.Long.ZERO;\n    } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\n      return goog.math.Long.MIN_VALUE;\n    } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\n      return goog.math.Long.MAX_VALUE;\n    } else if (value < 0) {\n      return goog.math.Long.fromNumber(-value).negate();\n    } else {\n      return new goog.math.Long(\n          (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\n          (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\n    }\n  };\n\n\n  /**\n   * Returns a Long representing the 64-bit integer that comes by concatenating\n   * the given high and low bits.  Each is assumed to use 32 bits.\n   * @param {number} lowBits The low 32-bits.\n   * @param {number} highBits The high 32-bits.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromBits = function(lowBits, highBits) {\n    return new goog.math.Long(lowBits, highBits);\n  };\n\n\n  /**\n   * Returns a Long representation of the given string, written using the given\n   * radix.\n   * @param {string} str The textual representation of the Long.\n   * @param {number=} opt_radix The radix in which the text is written.\n   * @return {!goog.math.Long} The corresponding Long value.\n   */\n  goog.math.Long.fromString = function(str, opt_radix) {\n    if (str.length == 0) {\n      throw Error('number format error: empty string');\n    }\n\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw Error('radix out of range: ' + radix);\n    }\n\n    if (str.charAt(0) == '-') {\n      return goog.math.Long.fromString(str.substring(1), radix).negate();\n    } else if (str.indexOf('-') >= 0) {\n      throw Error('number format error: interior \"-\" character: ' + str);\n    }\n\n    // Do several (8) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\n\n    var result = goog.math.Long.ZERO;\n    for (var i = 0; i < str.length; i += 8) {\n      var size = Math.min(8, str.length - i);\n      var value = parseInt(str.substring(i, i + size), radix);\n      if (size < 8) {\n        var power = goog.math.Long.fromNumber(Math.pow(radix, size));\n        result = result.multiply(power).add(goog.math.Long.fromNumber(value));\n      } else {\n        result = result.multiply(radixToPower);\n        result = result.add(goog.math.Long.fromNumber(value));\n      }\n    }\n    return result;\n  };\n\n\n  // NOTE: the compiler should inline these constant values below and then remove\n  // these variables, so there should be no runtime penalty for these.\n\n\n  /**\n   * Number used repeated below in calculations.  This must appear before the\n   * first call to any from* function below.\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_32_DBL_ =\n      goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_31_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ / 2;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_48_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_64_DBL_ =\n      goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\n\n\n  /**\n   * @type {number}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_63_DBL_ =\n      goog.math.Long.TWO_PWR_64_DBL_ / 2;\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.ZERO = goog.math.Long.fromInt(0);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.ONE = goog.math.Long.fromInt(1);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.MAX_VALUE =\n      goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\n\n\n  /** @type {!goog.math.Long} */\n  goog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\n\n\n  /**\n   * @type {!goog.math.Long}\n   * @private\n   */\n  goog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\n\n\n  /** @return {number} The value, assuming it is a 32-bit integer. */\n  goog.math.Long.prototype.toInt = function() {\n    return this.low_;\n  };\n\n\n  /** @return {number} The closest floating-point representation to this value. */\n  goog.math.Long.prototype.toNumber = function() {\n    return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\n           this.getLowBitsUnsigned();\n  };\n\n\n  /**\n   * @param {number=} opt_radix The radix in which the text should be written.\n   * @return {string} The textual representation of this value.\n   */\n  goog.math.Long.prototype.toString = function(opt_radix) {\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw Error('radix out of range: ' + radix);\n    }\n\n    if (this.isZero()) {\n      return '0';\n    }\n\n    if (this.isNegative()) {\n      if (this.equals(goog.math.Long.MIN_VALUE)) {\n        // We need to change the Long value before it can be negated, so we remove\n        // the bottom-most digit in this base and then recurse to do the rest.\n        var radixLong = goog.math.Long.fromNumber(radix);\n        var div = this.div(radixLong);\n        var rem = div.multiply(radixLong).subtract(this);\n        return div.toString(radix) + rem.toInt().toString(radix);\n      } else {\n        return '-' + this.negate().toString(radix);\n      }\n    }\n\n    // Do several (6) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated div.\n    var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\n\n    var rem = this;\n    var result = '';\n    while (true) {\n      var remDiv = rem.div(radixToPower);\n      var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\n      var digits = intval.toString(radix);\n\n      rem = remDiv;\n      if (rem.isZero()) {\n        return digits + result;\n      } else {\n        while (digits.length < 6) {\n          digits = '0' + digits;\n        }\n        result = '' + digits + result;\n      }\n    }\n  };\n\n\n  /** @return {number} The high 32-bits as a signed value. */\n  goog.math.Long.prototype.getHighBits = function() {\n    return this.high_;\n  };\n\n\n  /** @return {number} The low 32-bits as a signed value. */\n  goog.math.Long.prototype.getLowBits = function() {\n    return this.low_;\n  };\n\n\n  /** @return {number} The low 32-bits as an unsigned value. */\n  goog.math.Long.prototype.getLowBitsUnsigned = function() {\n    return (this.low_ >= 0) ?\n        this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\n  };\n\n\n  /**\n   * @return {number} Returns the number of bits needed to represent the absolute\n   *     value of this Long.\n   */\n  goog.math.Long.prototype.getNumBitsAbs = function() {\n    if (this.isNegative()) {\n      if (this.equals(goog.math.Long.MIN_VALUE)) {\n        return 64;\n      } else {\n        return this.negate().getNumBitsAbs();\n      }\n    } else {\n      var val = this.high_ != 0 ? this.high_ : this.low_;\n      for (var bit = 31; bit > 0; bit--) {\n        if ((val & (1 << bit)) != 0) {\n          break;\n        }\n      }\n      return this.high_ != 0 ? bit + 33 : bit + 1;\n    }\n  };\n\n\n  /** @return {boolean} Whether this value is zero. */\n  goog.math.Long.prototype.isZero = function() {\n    return this.high_ == 0 && this.low_ == 0;\n  };\n\n\n  /** @return {boolean} Whether this value is negative. */\n  goog.math.Long.prototype.isNegative = function() {\n    return this.high_ < 0;\n  };\n\n\n  /** @return {boolean} Whether this value is odd. */\n  goog.math.Long.prototype.isOdd = function() {\n    return (this.low_ & 1) == 1;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long equals the other.\n   */\n  goog.math.Long.prototype.equals = function(other) {\n    return (this.high_ == other.high_) && (this.low_ == other.low_);\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long does not equal the other.\n   */\n  goog.math.Long.prototype.notEquals = function(other) {\n    return (this.high_ != other.high_) || (this.low_ != other.low_);\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than the other.\n   */\n  goog.math.Long.prototype.lessThan = function(other) {\n    return this.compare(other) < 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than or equal to the other.\n   */\n  goog.math.Long.prototype.lessThanOrEqual = function(other) {\n    return this.compare(other) <= 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than the other.\n   */\n  goog.math.Long.prototype.greaterThan = function(other) {\n    return this.compare(other) > 0;\n  };\n\n\n  /**\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than or equal to the other.\n   */\n  goog.math.Long.prototype.greaterThanOrEqual = function(other) {\n    return this.compare(other) >= 0;\n  };\n\n\n  /**\n   * Compares this Long with the given one.\n   * @param {goog.math.Long} other Long to compare against.\n   * @return {number} 0 if they are the same, 1 if the this is greater, and -1\n   *     if the given one is greater.\n   */\n  goog.math.Long.prototype.compare = function(other) {\n    if (this.equals(other)) {\n      return 0;\n    }\n\n    var thisNeg = this.isNegative();\n    var otherNeg = other.isNegative();\n    if (thisNeg && !otherNeg) {\n      return -1;\n    }\n    if (!thisNeg && otherNeg) {\n      return 1;\n    }\n\n    // at this point, the signs are the same, so subtraction will not overflow\n    if (this.subtract(other).isNegative()) {\n      return -1;\n    } else {\n      return 1;\n    }\n  };\n\n\n  /** @return {!goog.math.Long} The negation of this value. */\n  goog.math.Long.prototype.negate = function() {\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.MIN_VALUE;\n    } else {\n      return this.not().add(goog.math.Long.ONE);\n    }\n  };\n\n\n  /**\n   * Returns the sum of this and the given Long.\n   * @param {goog.math.Long} other Long to add to this one.\n   * @return {!goog.math.Long} The sum of this and the given Long.\n   */\n  goog.math.Long.prototype.add = function(other) {\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 + b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 + b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 + b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 + b48;\n    c48 &= 0xFFFF;\n    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  };\n\n\n  /**\n   * Returns the difference of this and the given Long.\n   * @param {goog.math.Long} other Long to subtract from this.\n   * @return {!goog.math.Long} The difference of this and the given Long.\n   */\n  goog.math.Long.prototype.subtract = function(other) {\n    return this.add(other.negate());\n  };\n\n\n  /**\n   * Returns the product of this and the given long.\n   * @param {goog.math.Long} other Long to multiply with this.\n   * @return {!goog.math.Long} The product of this and the other.\n   */\n  goog.math.Long.prototype.multiply = function(other) {\n    if (this.isZero()) {\n      return goog.math.Long.ZERO;\n    } else if (other.isZero()) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\n    }\n\n    if (this.isNegative()) {\n      if (other.isNegative()) {\n        return this.negate().multiply(other.negate());\n      } else {\n        return this.negate().multiply(other).negate();\n      }\n    } else if (other.isNegative()) {\n      return this.multiply(other.negate()).negate();\n    }\n\n    // If both longs are small, use float multiplication\n    if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\n        other.lessThan(goog.math.Long.TWO_PWR_24_)) {\n      return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\n    }\n\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n    // We can skip products that would overflow.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 * b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 * b00;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c16 += a00 * b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 * b00;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a16 * b16;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a00 * b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n    c48 &= 0xFFFF;\n    return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  };\n\n\n  /**\n   * Returns this Long divided by the given one.\n   * @param {goog.math.Long} other Long by which to divide.\n   * @return {!goog.math.Long} This Long divided by the given one.\n   */\n  goog.math.Long.prototype.div = function(other) {\n    if (other.isZero()) {\n      throw Error('division by zero');\n    } else if (this.isZero()) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.equals(goog.math.Long.MIN_VALUE)) {\n      if (other.equals(goog.math.Long.ONE) ||\n          other.equals(goog.math.Long.NEG_ONE)) {\n        return goog.math.Long.MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\n      } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n        return goog.math.Long.ONE;\n      } else {\n        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n        var halfThis = this.shiftRight(1);\n        var approx = halfThis.div(other).shiftLeft(1);\n        if (approx.equals(goog.math.Long.ZERO)) {\n          return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\n        } else {\n          var rem = this.subtract(other.multiply(approx));\n          var result = approx.add(rem.div(other));\n          return result;\n        }\n      }\n    } else if (other.equals(goog.math.Long.MIN_VALUE)) {\n      return goog.math.Long.ZERO;\n    }\n\n    if (this.isNegative()) {\n      if (other.isNegative()) {\n        return this.negate().div(other.negate());\n      } else {\n        return this.negate().div(other).negate();\n      }\n    } else if (other.isNegative()) {\n      return this.div(other.negate()).negate();\n    }\n\n    // Repeat the following until the remainder is less than other:  find a\n    // floating-point that approximates remainder / other *from below*, add this\n    // into the result, and subtract it from the remainder.  It is critical that\n    // the approximate value is less than or equal to the real value so that the\n    // remainder never becomes negative.\n    var res = goog.math.Long.ZERO;\n    var rem = this;\n    while (rem.greaterThanOrEqual(other)) {\n      // Approximate the result of division. This may be a little greater or\n      // smaller than the actual value.\n      var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\n\n      // We will tweak the approximate result by changing it in the 48-th digit or\n      // the smallest non-fractional digit, whichever is larger.\n      var log2 = Math.ceil(Math.log(approx) / Math.LN2);\n      var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\n\n      // Decrease the approximation until it is smaller than the remainder.  Note\n      // that if it is too large, the product overflows and is negative.\n      var approxRes = goog.math.Long.fromNumber(approx);\n      var approxRem = approxRes.multiply(other);\n      while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\n        approx -= delta;\n        approxRes = goog.math.Long.fromNumber(approx);\n        approxRem = approxRes.multiply(other);\n      }\n\n      // We know the answer can't be zero... and actually, zero would cause\n      // infinite recursion since we would make no progress.\n      if (approxRes.isZero()) {\n        approxRes = goog.math.Long.ONE;\n      }\n\n      res = res.add(approxRes);\n      rem = rem.subtract(approxRem);\n    }\n    return res;\n  };\n\n\n  /**\n   * Returns this Long modulo the given one.\n   * @param {goog.math.Long} other Long by which to mod.\n   * @return {!goog.math.Long} This Long modulo the given one.\n   */\n  goog.math.Long.prototype.modulo = function(other) {\n    return this.subtract(this.div(other).multiply(other));\n  };\n\n\n  /** @return {!goog.math.Long} The bitwise-NOT of this value. */\n  goog.math.Long.prototype.not = function() {\n    return goog.math.Long.fromBits(~this.low_, ~this.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-AND of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to AND.\n   * @return {!goog.math.Long} The bitwise-AND of this and the other.\n   */\n  goog.math.Long.prototype.and = function(other) {\n    return goog.math.Long.fromBits(this.low_ & other.low_,\n                                   this.high_ & other.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-OR of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to OR.\n   * @return {!goog.math.Long} The bitwise-OR of this and the other.\n   */\n  goog.math.Long.prototype.or = function(other) {\n    return goog.math.Long.fromBits(this.low_ | other.low_,\n                                   this.high_ | other.high_);\n  };\n\n\n  /**\n   * Returns the bitwise-XOR of this Long and the given one.\n   * @param {goog.math.Long} other The Long with which to XOR.\n   * @return {!goog.math.Long} The bitwise-XOR of this and the other.\n   */\n  goog.math.Long.prototype.xor = function(other) {\n    return goog.math.Long.fromBits(this.low_ ^ other.low_,\n                                   this.high_ ^ other.high_);\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the left by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the left by the given amount.\n   */\n  goog.math.Long.prototype.shiftLeft = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var low = this.low_;\n      if (numBits < 32) {\n        var high = this.high_;\n        return goog.math.Long.fromBits(\n            low << numBits,\n            (high << numBits) | (low >>> (32 - numBits)));\n      } else {\n        return goog.math.Long.fromBits(0, low << (numBits - 32));\n      }\n    }\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the right by the given amount.\n   */\n  goog.math.Long.prototype.shiftRight = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return goog.math.Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)),\n            high >> numBits);\n      } else {\n        return goog.math.Long.fromBits(\n            high >> (numBits - 32),\n            high >= 0 ? 0 : -1);\n      }\n    }\n  };\n\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount, with\n   * the new top bits matching the current sign bit.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!goog.math.Long} This shifted to the right by the given amount, with\n   *     zeros placed into the new leading bits.\n   */\n  goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return goog.math.Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)),\n            high >>> numBits);\n      } else if (numBits == 32) {\n        return goog.math.Long.fromBits(high, 0);\n      } else {\n        return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\n      }\n    }\n  };\n\n  //======= begin jsbn =======\n\n  var navigator = { appName: 'Modern Browser' }; // polyfill a little\n\n  // Copyright (c) 2005  Tom Wu\n  // All Rights Reserved.\n  // http://www-cs-students.stanford.edu/~tjw/jsbn/\n\n  /*\n   * Copyright (c) 2003-2005  Tom Wu\n   * All Rights Reserved.\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining\n   * a copy of this software and associated documentation files (the\n   * \"Software\"), to deal in the Software without restriction, including\n   * without limitation the rights to use, copy, modify, merge, publish,\n   * distribute, sublicense, and/or sell copies of the Software, and to\n   * permit persons to whom the Software is furnished to do so, subject to\n   * the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be\n   * included in all copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND, \n   * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY \n   * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  \n   *\n   * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n   * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n   * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n   * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n   * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n   *\n   * In addition, the following condition applies:\n   *\n   * All redistributions must retain an intact copy of this copyright notice\n   * and disclaimer.\n   */\n\n  // Basic JavaScript BN library - subset useful for RSA encryption.\n\n  // Bits per digit\n  var dbits;\n\n  // JavaScript engine analysis\n  var canary = 0xdeadbeefcafe;\n  var j_lm = ((canary&0xffffff)==0xefcafe);\n\n  // (public) Constructor\n  function BigInteger(a,b,c) {\n    if(a != null)\n      if(\"number\" == typeof a) this.fromNumber(a,b,c);\n      else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n      else this.fromString(a,b);\n  }\n\n  // return new, unset BigInteger\n  function nbi() { return new BigInteger(null); }\n\n  // am: Compute w_j += (x*this_i), propagate carries,\n  // c is initial carry, returns final carry.\n  // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n  // We need to select the fastest one that works in this environment.\n\n  // am1: use a single mult and divide to get the high bits,\n  // max digit bits should be 26 because\n  // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n  function am1(i,x,w,j,c,n) {\n    while(--n >= 0) {\n      var v = x*this[i++]+w[j]+c;\n      c = Math.floor(v/0x4000000);\n      w[j++] = v&0x3ffffff;\n    }\n    return c;\n  }\n  // am2 avoids a big mult-and-extract completely.\n  // Max digit bits should be <= 30 because we do bitwise ops\n  // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n  function am2(i,x,w,j,c,n) {\n    var xl = x&0x7fff, xh = x>>15;\n    while(--n >= 0) {\n      var l = this[i]&0x7fff;\n      var h = this[i++]>>15;\n      var m = xh*l+h*xl;\n      l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n      c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n      w[j++] = l&0x3fffffff;\n    }\n    return c;\n  }\n  // Alternately, set max digit bits to 28 since some\n  // browsers slow down when dealing with 32-bit numbers.\n  function am3(i,x,w,j,c,n) {\n    var xl = x&0x3fff, xh = x>>14;\n    while(--n >= 0) {\n      var l = this[i]&0x3fff;\n      var h = this[i++]>>14;\n      var m = xh*l+h*xl;\n      l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n      c = (l>>28)+(m>>14)+xh*h;\n      w[j++] = l&0xfffffff;\n    }\n    return c;\n  }\n  if(j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n    BigInteger.prototype.am = am2;\n    dbits = 30;\n  }\n  else if(j_lm && (navigator.appName != \"Netscape\")) {\n    BigInteger.prototype.am = am1;\n    dbits = 26;\n  }\n  else { // Mozilla/Netscape seems to prefer am3\n    BigInteger.prototype.am = am3;\n    dbits = 28;\n  }\n\n  BigInteger.prototype.DB = dbits;\n  BigInteger.prototype.DM = ((1<<dbits)-1);\n  BigInteger.prototype.DV = (1<<dbits);\n\n  var BI_FP = 52;\n  BigInteger.prototype.FV = Math.pow(2,BI_FP);\n  BigInteger.prototype.F1 = BI_FP-dbits;\n  BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n  // Digit conversions\n  var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n  var BI_RC = new Array();\n  var rr,vv;\n  rr = \"0\".charCodeAt(0);\n  for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n  rr = \"a\".charCodeAt(0);\n  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n  rr = \"A\".charCodeAt(0);\n  for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n  function int2char(n) { return BI_RM.charAt(n); }\n  function intAt(s,i) {\n    var c = BI_RC[s.charCodeAt(i)];\n    return (c==null)?-1:c;\n  }\n\n  // (protected) copy this to r\n  function bnpCopyTo(r) {\n    for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n    r.t = this.t;\n    r.s = this.s;\n  }\n\n  // (protected) set from integer value x, -DV <= x < DV\n  function bnpFromInt(x) {\n    this.t = 1;\n    this.s = (x<0)?-1:0;\n    if(x > 0) this[0] = x;\n    else if(x < -1) this[0] = x+DV;\n    else this.t = 0;\n  }\n\n  // return bigint initialized to value\n  function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n  // (protected) set from string and radix\n  function bnpFromString(s,b) {\n    var k;\n    if(b == 16) k = 4;\n    else if(b == 8) k = 3;\n    else if(b == 256) k = 8; // byte array\n    else if(b == 2) k = 1;\n    else if(b == 32) k = 5;\n    else if(b == 4) k = 2;\n    else { this.fromRadix(s,b); return; }\n    this.t = 0;\n    this.s = 0;\n    var i = s.length, mi = false, sh = 0;\n    while(--i >= 0) {\n      var x = (k==8)?s[i]&0xff:intAt(s,i);\n      if(x < 0) {\n        if(s.charAt(i) == \"-\") mi = true;\n        continue;\n      }\n      mi = false;\n      if(sh == 0)\n        this[this.t++] = x;\n      else if(sh+k > this.DB) {\n        this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n        this[this.t++] = (x>>(this.DB-sh));\n      }\n      else\n        this[this.t-1] |= x<<sh;\n      sh += k;\n      if(sh >= this.DB) sh -= this.DB;\n    }\n    if(k == 8 && (s[0]&0x80) != 0) {\n      this.s = -1;\n      if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n    }\n    this.clamp();\n    if(mi) BigInteger.ZERO.subTo(this,this);\n  }\n\n  // (protected) clamp off excess high words\n  function bnpClamp() {\n    var c = this.s&this.DM;\n    while(this.t > 0 && this[this.t-1] == c) --this.t;\n  }\n\n  // (public) return string representation in given radix\n  function bnToString(b) {\n    if(this.s < 0) return \"-\"+this.negate().toString(b);\n    var k;\n    if(b == 16) k = 4;\n    else if(b == 8) k = 3;\n    else if(b == 2) k = 1;\n    else if(b == 32) k = 5;\n    else if(b == 4) k = 2;\n    else return this.toRadix(b);\n    var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n    var p = this.DB-(i*this.DB)%k;\n    if(i-- > 0) {\n      if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n      while(i >= 0) {\n        if(p < k) {\n          d = (this[i]&((1<<p)-1))<<(k-p);\n          d |= this[--i]>>(p+=this.DB-k);\n        }\n        else {\n          d = (this[i]>>(p-=k))&km;\n          if(p <= 0) { p += this.DB; --i; }\n        }\n        if(d > 0) m = true;\n        if(m) r += int2char(d);\n      }\n    }\n    return m?r:\"0\";\n  }\n\n  // (public) -this\n  function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n  // (public) |this|\n  function bnAbs() { return (this.s<0)?this.negate():this; }\n\n  // (public) return + if this > a, - if this < a, 0 if equal\n  function bnCompareTo(a) {\n    var r = this.s-a.s;\n    if(r != 0) return r;\n    var i = this.t;\n    r = i-a.t;\n    if(r != 0) return (this.s<0)?-r:r;\n    while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n    return 0;\n  }\n\n  // returns bit length of the integer x\n  function nbits(x) {\n    var r = 1, t;\n    if((t=x>>>16) != 0) { x = t; r += 16; }\n    if((t=x>>8) != 0) { x = t; r += 8; }\n    if((t=x>>4) != 0) { x = t; r += 4; }\n    if((t=x>>2) != 0) { x = t; r += 2; }\n    if((t=x>>1) != 0) { x = t; r += 1; }\n    return r;\n  }\n\n  // (public) return the number of bits in \"this\"\n  function bnBitLength() {\n    if(this.t <= 0) return 0;\n    return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n  }\n\n  // (protected) r = this << n*DB\n  function bnpDLShiftTo(n,r) {\n    var i;\n    for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n    for(i = n-1; i >= 0; --i) r[i] = 0;\n    r.t = this.t+n;\n    r.s = this.s;\n  }\n\n  // (protected) r = this >> n*DB\n  function bnpDRShiftTo(n,r) {\n    for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n    r.t = Math.max(this.t-n,0);\n    r.s = this.s;\n  }\n\n  // (protected) r = this << n\n  function bnpLShiftTo(n,r) {\n    var bs = n%this.DB;\n    var cbs = this.DB-bs;\n    var bm = (1<<cbs)-1;\n    var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n    for(i = this.t-1; i >= 0; --i) {\n      r[i+ds+1] = (this[i]>>cbs)|c;\n      c = (this[i]&bm)<<bs;\n    }\n    for(i = ds-1; i >= 0; --i) r[i] = 0;\n    r[ds] = c;\n    r.t = this.t+ds+1;\n    r.s = this.s;\n    r.clamp();\n  }\n\n  // (protected) r = this >> n\n  function bnpRShiftTo(n,r) {\n    r.s = this.s;\n    var ds = Math.floor(n/this.DB);\n    if(ds >= this.t) { r.t = 0; return; }\n    var bs = n%this.DB;\n    var cbs = this.DB-bs;\n    var bm = (1<<bs)-1;\n    r[0] = this[ds]>>bs;\n    for(var i = ds+1; i < this.t; ++i) {\n      r[i-ds-1] |= (this[i]&bm)<<cbs;\n      r[i-ds] = this[i]>>bs;\n    }\n    if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n    r.t = this.t-ds;\n    r.clamp();\n  }\n\n  // (protected) r = this - a\n  function bnpSubTo(a,r) {\n    var i = 0, c = 0, m = Math.min(a.t,this.t);\n    while(i < m) {\n      c += this[i]-a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    if(a.t < this.t) {\n      c -= a.s;\n      while(i < this.t) {\n        c += this[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += this.s;\n    }\n    else {\n      c += this.s;\n      while(i < a.t) {\n        c -= a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c -= a.s;\n    }\n    r.s = (c<0)?-1:0;\n    if(c < -1) r[i++] = this.DV+c;\n    else if(c > 0) r[i++] = c;\n    r.t = i;\n    r.clamp();\n  }\n\n  // (protected) r = this * a, r != this,a (HAC 14.12)\n  // \"this\" should be the larger one if appropriate.\n  function bnpMultiplyTo(a,r) {\n    var x = this.abs(), y = a.abs();\n    var i = x.t;\n    r.t = i+y.t;\n    while(--i >= 0) r[i] = 0;\n    for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n    r.s = 0;\n    r.clamp();\n    if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n  }\n\n  // (protected) r = this^2, r != this (HAC 14.16)\n  function bnpSquareTo(r) {\n    var x = this.abs();\n    var i = r.t = 2*x.t;\n    while(--i >= 0) r[i] = 0;\n    for(i = 0; i < x.t-1; ++i) {\n      var c = x.am(i,x[i],r,2*i,0,1);\n      if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n        r[i+x.t] -= x.DV;\n        r[i+x.t+1] = 1;\n      }\n    }\n    if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n    r.s = 0;\n    r.clamp();\n  }\n\n  // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n  // r != q, this != m.  q or r may be null.\n  function bnpDivRemTo(m,q,r) {\n    var pm = m.abs();\n    if(pm.t <= 0) return;\n    var pt = this.abs();\n    if(pt.t < pm.t) {\n      if(q != null) q.fromInt(0);\n      if(r != null) this.copyTo(r);\n      return;\n    }\n    if(r == null) r = nbi();\n    var y = nbi(), ts = this.s, ms = m.s;\n    var nsh = this.DB-nbits(pm[pm.t-1]);\t// normalize modulus\n    if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n    else { pm.copyTo(y); pt.copyTo(r); }\n    var ys = y.t;\n    var y0 = y[ys-1];\n    if(y0 == 0) return;\n    var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n    var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n    var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n    y.dlShiftTo(j,t);\n    if(r.compareTo(t) >= 0) {\n      r[r.t++] = 1;\n      r.subTo(t,r);\n    }\n    BigInteger.ONE.dlShiftTo(ys,t);\n    t.subTo(y,y);\t// \"negative\" y so we can replace sub with am later\n    while(y.t < ys) y[y.t++] = 0;\n    while(--j >= 0) {\n      // Estimate quotient digit\n      var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n      if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {\t// Try it out\n        y.dlShiftTo(j,t);\n        r.subTo(t,r);\n        while(r[i] < --qd) r.subTo(t,r);\n      }\n    }\n    if(q != null) {\n      r.drShiftTo(ys,q);\n      if(ts != ms) BigInteger.ZERO.subTo(q,q);\n    }\n    r.t = ys;\n    r.clamp();\n    if(nsh > 0) r.rShiftTo(nsh,r);\t// Denormalize remainder\n    if(ts < 0) BigInteger.ZERO.subTo(r,r);\n  }\n\n  // (public) this mod a\n  function bnMod(a) {\n    var r = nbi();\n    this.abs().divRemTo(a,null,r);\n    if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n    return r;\n  }\n\n  // Modular reduction using \"classic\" algorithm\n  function Classic(m) { this.m = m; }\n  function cConvert(x) {\n    if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n    else return x;\n  }\n  function cRevert(x) { return x; }\n  function cReduce(x) { x.divRemTo(this.m,null,x); }\n  function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n  function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n  Classic.prototype.convert = cConvert;\n  Classic.prototype.revert = cRevert;\n  Classic.prototype.reduce = cReduce;\n  Classic.prototype.mulTo = cMulTo;\n  Classic.prototype.sqrTo = cSqrTo;\n\n  // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n  // justification:\n  //         xy == 1 (mod m)\n  //         xy =  1+km\n  //   xy(2-xy) = (1+km)(1-km)\n  // x[y(2-xy)] = 1-k^2m^2\n  // x[y(2-xy)] == 1 (mod m^2)\n  // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n  // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n  // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n  function bnpInvDigit() {\n    if(this.t < 1) return 0;\n    var x = this[0];\n    if((x&1) == 0) return 0;\n    var y = x&3;\t\t// y == 1/x mod 2^2\n    y = (y*(2-(x&0xf)*y))&0xf;\t// y == 1/x mod 2^4\n    y = (y*(2-(x&0xff)*y))&0xff;\t// y == 1/x mod 2^8\n    y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;\t// y == 1/x mod 2^16\n    // last step - calculate inverse mod DV directly;\n    // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n    y = (y*(2-x*y%this.DV))%this.DV;\t\t// y == 1/x mod 2^dbits\n    // we really want the negative inverse, and -DV < y < DV\n    return (y>0)?this.DV-y:-y;\n  }\n\n  // Montgomery reduction\n  function Montgomery(m) {\n    this.m = m;\n    this.mp = m.invDigit();\n    this.mpl = this.mp&0x7fff;\n    this.mph = this.mp>>15;\n    this.um = (1<<(m.DB-15))-1;\n    this.mt2 = 2*m.t;\n  }\n\n  // xR mod m\n  function montConvert(x) {\n    var r = nbi();\n    x.abs().dlShiftTo(this.m.t,r);\n    r.divRemTo(this.m,null,r);\n    if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n    return r;\n  }\n\n  // x/R mod m\n  function montRevert(x) {\n    var r = nbi();\n    x.copyTo(r);\n    this.reduce(r);\n    return r;\n  }\n\n  // x = x/R mod m (HAC 14.32)\n  function montReduce(x) {\n    while(x.t <= this.mt2)\t// pad x so am has enough room later\n      x[x.t++] = 0;\n    for(var i = 0; i < this.m.t; ++i) {\n      // faster way of calculating u0 = x[i]*mp mod DV\n      var j = x[i]&0x7fff;\n      var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n      // use am to combine the multiply-shift-add into one call\n      j = i+this.m.t;\n      x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n      // propagate carry\n      while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n    }\n    x.clamp();\n    x.drShiftTo(this.m.t,x);\n    if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n  }\n\n  // r = \"x^2/R mod m\"; x != r\n  function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n  // r = \"xy/R mod m\"; x,y != r\n  function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n  Montgomery.prototype.convert = montConvert;\n  Montgomery.prototype.revert = montRevert;\n  Montgomery.prototype.reduce = montReduce;\n  Montgomery.prototype.mulTo = montMulTo;\n  Montgomery.prototype.sqrTo = montSqrTo;\n\n  // (protected) true iff this is even\n  function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n  // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n  function bnpExp(e,z) {\n    if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n    var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n    g.copyTo(r);\n    while(--i >= 0) {\n      z.sqrTo(r,r2);\n      if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n      else { var t = r; r = r2; r2 = t; }\n    }\n    return z.revert(r);\n  }\n\n  // (public) this^e % m, 0 <= e < 2^32\n  function bnModPowInt(e,m) {\n    var z;\n    if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n    return this.exp(e,z);\n  }\n\n  // protected\n  BigInteger.prototype.copyTo = bnpCopyTo;\n  BigInteger.prototype.fromInt = bnpFromInt;\n  BigInteger.prototype.fromString = bnpFromString;\n  BigInteger.prototype.clamp = bnpClamp;\n  BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n  BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n  BigInteger.prototype.lShiftTo = bnpLShiftTo;\n  BigInteger.prototype.rShiftTo = bnpRShiftTo;\n  BigInteger.prototype.subTo = bnpSubTo;\n  BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n  BigInteger.prototype.squareTo = bnpSquareTo;\n  BigInteger.prototype.divRemTo = bnpDivRemTo;\n  BigInteger.prototype.invDigit = bnpInvDigit;\n  BigInteger.prototype.isEven = bnpIsEven;\n  BigInteger.prototype.exp = bnpExp;\n\n  // public\n  BigInteger.prototype.toString = bnToString;\n  BigInteger.prototype.negate = bnNegate;\n  BigInteger.prototype.abs = bnAbs;\n  BigInteger.prototype.compareTo = bnCompareTo;\n  BigInteger.prototype.bitLength = bnBitLength;\n  BigInteger.prototype.mod = bnMod;\n  BigInteger.prototype.modPowInt = bnModPowInt;\n\n  // \"constants\"\n  BigInteger.ZERO = nbv(0);\n  BigInteger.ONE = nbv(1);\n\n  // jsbn2 stuff\n\n  // (protected) convert from radix string\n  function bnpFromRadix(s,b) {\n    this.fromInt(0);\n    if(b == null) b = 10;\n    var cs = this.chunkSize(b);\n    var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n    for(var i = 0; i < s.length; ++i) {\n      var x = intAt(s,i);\n      if(x < 0) {\n        if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n        continue;\n      }\n      w = b*w+x;\n      if(++j >= cs) {\n        this.dMultiply(d);\n        this.dAddOffset(w,0);\n        j = 0;\n        w = 0;\n      }\n    }\n    if(j > 0) {\n      this.dMultiply(Math.pow(b,j));\n      this.dAddOffset(w,0);\n    }\n    if(mi) BigInteger.ZERO.subTo(this,this);\n  }\n\n  // (protected) return x s.t. r^x < DV\n  function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n  // (public) 0 if this == 0, 1 if this > 0\n  function bnSigNum() {\n    if(this.s < 0) return -1;\n    else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n    else return 1;\n  }\n\n  // (protected) this *= n, this >= 0, 1 < n < DV\n  function bnpDMultiply(n) {\n    this[this.t] = this.am(0,n-1,this,0,0,this.t);\n    ++this.t;\n    this.clamp();\n  }\n\n  // (protected) this += n << w words, this >= 0\n  function bnpDAddOffset(n,w) {\n    if(n == 0) return;\n    while(this.t <= w) this[this.t++] = 0;\n    this[w] += n;\n    while(this[w] >= this.DV) {\n      this[w] -= this.DV;\n      if(++w >= this.t) this[this.t++] = 0;\n      ++this[w];\n    }\n  }\n\n  // (protected) convert to radix string\n  function bnpToRadix(b) {\n    if(b == null) b = 10;\n    if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n    var cs = this.chunkSize(b);\n    var a = Math.pow(b,cs);\n    var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n    this.divRemTo(d,y,z);\n    while(y.signum() > 0) {\n      r = (a+z.intValue()).toString(b).substr(1) + r;\n      y.divRemTo(d,y,z);\n    }\n    return z.intValue().toString(b) + r;\n  }\n\n  // (public) return value as integer\n  function bnIntValue() {\n    if(this.s < 0) {\n      if(this.t == 1) return this[0]-this.DV;\n      else if(this.t == 0) return -1;\n    }\n    else if(this.t == 1) return this[0];\n    else if(this.t == 0) return 0;\n    // assumes 16 < DB < 32\n    return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n  }\n\n  // (protected) r = this + a\n  function bnpAddTo(a,r) {\n    var i = 0, c = 0, m = Math.min(a.t,this.t);\n    while(i < m) {\n      c += this[i]+a[i];\n      r[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    if(a.t < this.t) {\n      c += a.s;\n      while(i < this.t) {\n        c += this[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += this.s;\n    }\n    else {\n      c += this.s;\n      while(i < a.t) {\n        c += a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      c += a.s;\n    }\n    r.s = (c<0)?-1:0;\n    if(c > 0) r[i++] = c;\n    else if(c < -1) r[i++] = this.DV+c;\n    r.t = i;\n    r.clamp();\n  }\n\n  BigInteger.prototype.fromRadix = bnpFromRadix;\n  BigInteger.prototype.chunkSize = bnpChunkSize;\n  BigInteger.prototype.signum = bnSigNum;\n  BigInteger.prototype.dMultiply = bnpDMultiply;\n  BigInteger.prototype.dAddOffset = bnpDAddOffset;\n  BigInteger.prototype.toRadix = bnpToRadix;\n  BigInteger.prototype.intValue = bnIntValue;\n  BigInteger.prototype.addTo = bnpAddTo;\n\n  //======= end jsbn =======\n\n  // Emscripten wrapper\n  var Wrapper = {\n    abs: function(l, h) {\n      var x = new goog.math.Long(l, h);\n      var ret;\n      if (x.isNegative()) {\n        ret = x.negate();\n      } else {\n        ret = x;\n      }\n      HEAP32[tempDoublePtr>>2] = ret.low_;\n      HEAP32[tempDoublePtr+4>>2] = ret.high_;\n    },\n    ensureTemps: function() {\n      if (Wrapper.ensuredTemps) return;\n      Wrapper.ensuredTemps = true;\n      Wrapper.two32 = new BigInteger();\n      Wrapper.two32.fromString('4294967296', 10);\n      Wrapper.two64 = new BigInteger();\n      Wrapper.two64.fromString('18446744073709551616', 10);\n      Wrapper.temp1 = new BigInteger();\n      Wrapper.temp2 = new BigInteger();\n    },\n    lh2bignum: function(l, h) {\n      var a = new BigInteger();\n      a.fromString(h.toString(), 10);\n      var b = new BigInteger();\n      a.multiplyTo(Wrapper.two32, b);\n      var c = new BigInteger();\n      c.fromString(l.toString(), 10);\n      var d = new BigInteger();\n      c.addTo(b, d);\n      return d;\n    },\n    stringify: function(l, h, unsigned) {\n      var ret = new goog.math.Long(l, h).toString();\n      if (unsigned && ret[0] == '-') {\n        // unsign slowly using jsbn bignums\n        Wrapper.ensureTemps();\n        var bignum = new BigInteger();\n        bignum.fromString(ret, 10);\n        ret = new BigInteger();\n        Wrapper.two64.addTo(bignum, ret);\n        ret = ret.toString(10);\n      }\n      return ret;\n    },\n    fromString: function(str, base, min, max, unsigned) {\n      Wrapper.ensureTemps();\n      var bignum = new BigInteger();\n      bignum.fromString(str, base);\n      var bigmin = new BigInteger();\n      bigmin.fromString(min, 10);\n      var bigmax = new BigInteger();\n      bigmax.fromString(max, 10);\n      if (unsigned && bignum.compareTo(BigInteger.ZERO) < 0) {\n        var temp = new BigInteger();\n        bignum.addTo(Wrapper.two64, temp);\n        bignum = temp;\n      }\n      var error = false;\n      if (bignum.compareTo(bigmin) < 0) {\n        bignum = bigmin;\n        error = true;\n      } else if (bignum.compareTo(bigmax) > 0) {\n        bignum = bigmax;\n        error = true;\n      }\n      var ret = goog.math.Long.fromString(bignum.toString()); // min-max checks should have clamped this to a range goog.math.Long can handle well\n      HEAP32[tempDoublePtr>>2] = ret.low_;\n      HEAP32[tempDoublePtr+4>>2] = ret.high_;\n      if (error) throw 'range error';\n    }\n  };\n  return Wrapper;\n})();\n\n//======= end closure i64 code =======\n\n\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "hash-map", content:"//@ runDefault\n\n/*\n *  Licensed to the Apache Software Foundation (ASF) under one or more\n *  contributor license agreements.  See the NOTICE below for additional\n *  information regarding copyright ownership.\n *  The ASF licenses this file to You under the Apache License, Version 2.0\n *  (the \"License\"); you may not use this file except in compliance with\n *  the License.  You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\n\n/******* NOTICE *********\n\nApache Harmony\nCopyright 2006, 2010 The Apache Software Foundation.\n\nThis product includes software developed at\nThe Apache Software Foundation (http://www.apache.org/).\n\nPortions of Apache Harmony were originally developed by\nIntel Corporation and are licensed to the Apache Software\nFoundation under the \"Software Grant and Corporate Contribution\nLicense Agreement\" and for which the following copyright notices\napply\n         (C) Copyright 2005 Intel Corporation\n         (C) Copyright 2005-2006 Intel Corporation\n         (C) Copyright 2006 Intel Corporation\n\n\nThe following copyright notice(s) were affixed to portions of the code\nwith which this file is now or was at one time distributed\nand are placed here unaltered.\n\n(C) Copyright 1997,2004 International Business Machines Corporation.\nAll rights reserved.\n\n(C) Copyright IBM Corp. 2003. \n\n\nThis software contains code derived from UNIX V7, Copyright(C)\nCaldera International Inc.\n\n************************/\n\n// This code is a manual translation of Apache Harmony's HashMap class to\n// JavaScript.\n\nvar HashMap = (function() {\n    var DEFAULT_SIZE = 16;\n    \n    function calculateCapacity(x)\n    {\n        if (x >= 1 << 30)\n            return 1 << 30;\n        if (x == 0)\n            return 16;\n        x = x - 1;\n        x |= x >> 1;\n        x |= x >> 2;\n        x |= x >> 4;\n        x |= x >> 8;\n        x |= x >> 16;\n        return x + 1;\n    }\n    \n    function computeHashCode(key)\n    {\n        switch (typeof key) {\n        case \"undefined\":\n            return 0;\n        case \"object\":\n            if (!key)\n                return 0;\n        case \"function\":\n            return key.hashCode();\n        case \"boolean\":\n            return key | 0;\n        case \"number\":\n            if ((key | 0) == key)\n                return key;\n            key = \"\" + key; // Compute string hash of the double. It's the best we can do.\n        case \"string\":\n            // source: http://en.wikipedia.org/wiki/Java_hashCode()#Sample_implementations_of_the_java.lang.String_algorithm\n            var h = 0;\n            var len = key.length;\n            for (var index = 0; index < len; index++) {\n                h = (((31 * h) | 0) + key.charCodeAt(index)) | 0;\n            }\n            return h;\n        default:\n            throw new Error(\"Internal error: Bad JavaScript value type\");\n        }\n    }\n    \n    function equals(a, b)\n    {\n        if (typeof a != typeof b)\n            return false;\n        switch (typeof a) {\n        case \"object\":\n            if (!a)\n                return !b;\n        case \"function\":\n            switch (typeof b) {\n            case \"object\":\n            case \"function\":\n                return a.equals(b);\n            default:\n                return false;\n            }\n        default:\n            return a == b;\n        }\n    }\n    \n    function Entry(key, hash, value)\n    {\n        this._key = key;\n        this._value = value;\n        this._origKeyHash = hash;\n        this._next = null;\n    }\n\n    Entry.prototype = {\n        clone: function()\n        {\n            var result = new Entry(this._key, this._hash, this._value);\n            if (this._next)\n                result._next = this._next.clone();\n            return result;\n        },\n        \n        toString: function()\n        {\n            return this._key + \"=\" + this._value;\n        },\n        \n        get key()\n        {\n            return this._key;\n        },\n        \n        get value()\n        {\n            return this._value;\n        }\n    };\n    \n    function AbstractMapIterator(map)\n    {\n        this._associatedMap = map;\n        this._expectedModCount = map._modCount;\n        this._futureEntry = null;\n        this._currentEntry = null;\n        this._prevEntry = null;\n        this._position = 0;\n    }\n    \n    AbstractMapIterator.prototype = {\n        hasNext: function()\n        {\n            if (this._futureEntry)\n                return true;\n            while (this._position < this._associatedMap._elementData.length) {\n                if (!this._associatedMap._elementData[this._position])\n                    this._position++;\n                else\n                    return true;\n            }\n            return false;\n        },\n        \n        _checkConcurrentMod: function()\n        {\n            if (this._expectedModCount != this._associatedMap._modCount)\n                throw new Error(\"Concurrent HashMap modification detected\");\n        },\n        \n        _makeNext: function()\n        {\n            this._checkConcurrentMod();\n            if (!this.hasNext())\n                throw new Error(\"No such element\");\n            if (!this._futureEntry) {\n                this._currentEntry = this._associatedMap._elementData[this._position++];\n                this._futureEntry = this._currentEntry._next;\n                this._prevEntry = null;\n                return;\n            }\n            if (this._currentEntry)\n                this._prevEntry = this._currentEntry;\n            this._currentEntry = this._futureEntry;\n            this._futureEntry = this._futureEntry._next;\n        },\n        \n        remove: function()\n        {\n            this._checkConcurrentMod();\n            if (!this._currentEntry)\n                throw new Error(\"Illegal state\");\n            if (!this._prevEntry) {\n                var index = this._currentEntry._origKeyHash & (this._associatedMap._elementData.length - 1);\n                this._associatedMap._elementData[index] = this._associatedMap._elementData[index]._next;\n            } else\n                this._prevEntry._next = this._currentEntry._next;\n            this._currentEntry = null;\n            this._expectedModCount++;\n            this._associatedMap._modCount++;\n            this._associatedMap._elementCount--;\n        }\n    };\n    \n    function EntryIterator(map)\n    {\n        AbstractMapIterator.call(this, map);\n    }\n    \n    EntryIterator.prototype = {\n        next: function()\n        {\n            this._makeNext();\n            return this._currentEntry;\n        }\n    };\n    EntryIterator.prototype.__proto__ = AbstractMapIterator.prototype;\n    \n    function KeyIterator(map)\n    {\n        AbstractMapIterator.call(this, map);\n    }\n    \n    KeyIterator.prototype = {\n        next: function()\n        {\n            this.makeNext();\n            return this._currentEntry._key;\n        }\n    };\n    KeyIterator.prototype.__proto__ = AbstractMapIterator.prototype;\n    \n    function ValueIterator(map)\n    {\n        AbstractMapIterator.call(this, map);\n    }\n    \n    ValueIterator.prototype = {\n        next: function()\n        {\n            this.makeNext();\n            return this._currentEntry._value;\n        }\n    };\n    ValueIterator.prototype.__proto__ = AbstractMapIterator.prototype;\n    \n    function EntrySet(map)\n    {\n        this._associatedMap = map;\n    }\n    \n    EntrySet.prototype = {\n        size: function()\n        {\n            return this._associatedMap._elementCount;\n        },\n        \n        clear: function()\n        {\n            this._associatedMap.clear();\n        },\n        \n        remove: function(object)\n        {\n            var entry = this._associatedMap._getEntry(object.key);\n            if (!entry)\n                return false;\n            if (!equals(entry._value, object.value))\n                return false;\n            this._associatedMap._removeEntry(entry);\n            return true;\n        },\n        \n        contains: function(object)\n        {\n            var entry = this._associatedMap._getEntry(object.key);\n            if (!entry)\n                return false;\n            return equals(entry._value, object.value);\n        },\n        \n        iterator: function()\n        {\n            return new EntryIterator(this._associatedMap);\n        }\n    };\n    \n    function KeySet(map)\n    {\n        this._associatedMap = map;\n    }\n    \n    KeySet.prototype = {\n        contains: function(object)\n        {\n            return this._associatedMap.contains(object);\n        },\n        \n        size: function()\n        {\n            return this._associatedMap._elementCount;\n        },\n        \n        clear: function()\n        {\n            this._associatedMap.clear();\n        },\n        \n        remove: function(key)\n        {\n            return !!this._associatedMap.remove(key);\n        },\n        \n        iterator: function()\n        {\n            return new KeyIterator(this._associatedMap);\n        }\n    };\n    \n    function ValueCollection(map)\n    {\n        this._associatedMap = map;\n    }\n    \n    ValueCollection.prototype = {\n        contains: function(object)\n        {\n            return this._associatedMap.containsValue(object);\n        },\n        \n        size: function()\n        {\n            return this._associatedMap._elementCount;\n        },\n        \n        clear: function()\n        {\n            this._associatedMap.clear();\n        },\n        \n        iterator: function()\n        {\n            return new ValueIterator(this._associatedMap);\n        }\n    };\n    \n    function HashMap(capacity, loadFactor)\n    {\n        if (capacity == null)\n            capacity = DEFAULT_SIZE;\n        if (loadFactor == null)\n            loadFactor = 0.75;\n        \n        if (capacity < 0)\n            throw new Error(\"Invalid argument to HashMap constructor: capacity is negative\");\n        if (loadFactor <= 0)\n            throw new Error(\"Invalid argument to HashMap constructor: loadFactor is not positive\");\n        \n        this._capacity = calculateCapacity(capacity);\n        this._elementCount = 0;\n        this._elementData = new Array(this.capacity);\n        this._loadFactor = loadFactor;\n        this._modCount = 0;\n        this._computeThreshold();\n    }\n    \n    HashMap.prototype = {\n        _computeThreshold: function()\n        {\n            this._threshold = (this._elementData.length * this._loadFactor) | 0;\n        },\n        \n        clear: function()\n        {\n            if (!this._elementCount)\n                return;\n            \n            this._elementCount = 0;\n            for (var i = this._elementData.length; i--;)\n                this._elementData[i] = null;\n            this._modCount++;\n        },\n        \n        clone: function()\n        {\n            var result = new HashMap(this._elementData.length, this._loadFactor);\n            result.putAll(this);\n            return result;\n        },\n        \n        containsKey: function(key)\n        {\n            return !!this._getEntry(key);\n        },\n        \n        containsValue: function(value)\n        {\n            for (var i = this._elementData.length; i--;) {\n                for (var entry = this._elementData[i]; entry; entry = entry._next) {\n                    if (equals(value, entry._value))\n                        return true;\n                }\n            }\n            return false;\n        },\n        \n        entrySet: function()\n        {\n            return new EntrySet(this);\n        },\n        \n        get: function(key)\n        {\n            var entry = this._getEntry(key);\n            if (entry)\n                return entry._value;\n            return null;\n        },\n        \n        _getEntry: function(key)\n        {\n            var hash = computeHashCode(key);\n            var index = hash & (this._elementData.length - 1);\n            return this._findKeyEntry(key, index, hash);\n        },\n        \n        _findKeyEntry: function(key, index, keyHash)\n        {\n            var entry = this._elementData[index];\n            while (entry && (entry._origKeyHash != keyHash || !equals(key, entry._key)))\n                entry = entry._next;\n            return entry;\n        },\n        \n        isEmpty: function()\n        {\n            return !this._elementCount;\n        },\n        \n        keySet: function()\n        {\n            return new KeySet(this);\n        },\n        \n        put: function(key, value)\n        {\n            var hash = computeHashCode(key);\n            var index = hash & (this._elementData.length - 1);\n            var entry = this._findKeyEntry(key, index, hash);\n            if (!entry) {\n                this._modCount++;\n                entry = this._createHashedEntry(key, index, hash);\n                if (++this._elementCount > this._threshold)\n                    this._rehash();\n            }\n            \n            var result = entry._value;\n            entry._value = value;\n            return result;\n        },\n        \n        _createHashedEntry: function(key, index, hash)\n        {\n            var entry = new Entry(key, hash, null);\n            entry._next = this._elementData[index];\n            this._elementData[index] = entry;\n            return entry;\n        },\n        \n        putAll: function(map)\n        {\n            if (map.isEmpty())\n                return;\n            for (var iter = map.entrySet().iterator(); iter.hasNext();) {\n                var entry = iter.next();\n                put(entry.key, entry.value);\n            }\n        },\n        \n        _rehash: function(capacity)\n        {\n            if (capacity == null)\n                capacity = this._elementData.length;\n            \n            var length = calculateCapacity(!capacity ? 1 : capacity << 1);\n            var newData = new Array(length);\n            for (var i = 0; i < this._elementData.length; ++i) {\n                var entry = this._elementData[i];\n                this._elementData[i] = null;\n                while (entry) {\n                    var index = entry._origKeyHash & (length - 1);\n                    var next = entry._next;\n                    entry._next = newData[index];\n                    newData[index] = entry;\n                    entry = next;\n                }\n            }\n            this._elementData = newData;\n            this._computeThreshold();\n        },\n        \n        remove: function(key)\n        {\n            var entry = this._removeEntryForKey(key);\n            if (!entry)\n                return null;\n            return entry._value;\n        },\n        \n        _removeEntry: function(entry)\n        {\n            var index = entry._origKeyHash & (this._elementData.length - 1);\n            var current = this._elementData[index];\n            if (current == entry)\n                this._elementData[index] = entry._next;\n            else {\n                while (current._next != entry)\n                    current = current._next;\n                current._next = entry._next;\n            }\n            this._modCount++;\n            this._elementCount--;\n        },\n        \n        _removeEntryForKey: function(key)\n        {\n            var hash = computeHashCode(key);\n            var index = hash & (this._elementData.length - 1);\n            var entry = this._elementData[index];\n            var last = null;\n            while (entry != null && !(entry._origKeyHash == hash && equals(key, entry._key))) {\n                last = entry;\n                entry = entry._next;\n            }\n            if (!entry)\n                return null;\n            if (!last)\n                this._elementData[index] = entry._next;\n            else\n                last._next = entry._next;\n            this._modCount++;\n            this._elementCount--;\n            return entry;\n        },\n        \n        size: function()\n        {\n            return this._elementCount;\n        },\n        \n        values: function()\n        {\n            return new ValueCollection(this);\n        }\n    };\n    \n    return HashMap;\n})();\n\nvar map = new HashMap();\nvar COUNT = 500000;\n\nfor (var i = 0; i < COUNT; ++i)\n    map.put(i, 42);\n\nvar result = 0;\nfor (var j = 0; j < 5; ++j) {\n    for (var i = 0; i < COUNT; ++i)\n        result += map.get(i);\n}\n\nvar keySum = 0;\nvar valueSum = 0;\nfor (var iterator = map.entrySet().iterator(); iterator.hasNext();) {\n    var entry = iterator.next();\n    keySum += entry.key;\n    valueSum += entry.value;\n}\n\nif (result != 105000000)\n    throw \"Error: result = \" + result;\nif (keySum != 124999750000)\n    throw \"Error: keySum = \" + keySum;\nif (valueSum != 21000000)\n    throw \"Error: valueSum = \" + valueSum;\n\n"},
    {name: "n-body.c", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\n\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(291);\n/* global initializers */ __ATINIT__.push();\n\n\n/* memory initializer */ allocate([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,222,69,190,201,60,189,67,64,44,217,60,52,160,93,19,64,124,219,31,192,171,144,242,191,240,235,37,108,249,134,186,191,188,204,147,155,6,103,227,63,155,148,125,245,242,126,6,64,21,7,90,154,215,210,153,191,216,51,171,217,149,76,163,63,103,202,50,195,205,175,32,64,176,1,222,49,203,127,16,64,124,70,235,225,83,211,217,191,66,148,135,184,33,44,240,191,19,143,31,191,233,53,253,63,180,35,17,95,72,60,129,63,55,198,7,13,73,29,135,63,207,217,167,206,234,201,41,64,126,102,38,214,232,56,46,192,160,125,37,190,87,149,204,191,239,27,145,169,28,83,241,63,197,187,84,62,127,204,235,63,124,62,242,250,107,47,134,191,179,30,244,156,210,61,92,63,42,87,5,169,103,194,46,64,32,162,200,51,88,235,57,192,64,229,171,147,243,241,198,63,74,188,89,22,182,84,239,63,163,251,196,49,198,7,227,63,246,101,118,88,136,203,161,191,172,153,23,83,243,168,96,63,37,46,57,102,10,0,0,0], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  function _llvm_lifetime_end() {}\n\n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;\n\n   \n  Module[\"_memset\"] = _memset;\n\n  function _free() {\n  }\n  Module[\"_free\"] = _free;\n\n  function _llvm_lifetime_start() {}\n\n  \n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  var _sqrt=Math_sqrt;\n\n  \n  \n  \n  \n  \n  \n  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {\n        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createSocket:function (family, type, protocol) {\n        var streaming = type == 1;\n        if (protocol) {\n          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp\n        }\n  \n        // create our internal socket structure\n        var sock = {\n          family: family,\n          type: type,\n          protocol: protocol,\n          server: null,\n          peers: {},\n          pending: [],\n          recv_queue: [],\n          sock_ops: SOCKFS.websocket_sock_ops\n        };\n  \n        // create the filesystem node to store the socket structure\n        var name = SOCKFS.nextname();\n        var node = FS.createNode(SOCKFS.root, name, 49152, 0);\n        node.sock = sock;\n  \n        // and the wrapping stream that enables library functions such\n        // as read and write to indirectly interact with the socket\n        var stream = FS.createStream({\n          path: name,\n          node: node,\n          flags: FS.modeStringToFlags('r+'),\n          seekable: false,\n          stream_ops: SOCKFS.stream_ops\n        });\n  \n        // map the new stream to the socket structure (sockets have a 1:1\n        // relationship with a stream)\n        sock.stream = stream;\n  \n        return sock;\n      },getSocket:function (fd) {\n        var stream = FS.getStream(fd);\n        if (!stream || !FS.isSocket(stream.node.mode)) {\n          return null;\n        }\n        return stream.node.sock;\n      },stream_ops:{poll:function (stream) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.poll(sock);\n        },ioctl:function (stream, request, varargs) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.ioctl(sock, request, varargs);\n        },read:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          var msg = sock.sock_ops.recvmsg(sock, length);\n          if (!msg) {\n            // socket is closed\n            return 0;\n          }\n          buffer.set(msg.buffer, offset);\n          return msg.buffer.length;\n        },write:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.sendmsg(sock, buffer, offset, length);\n        },close:function (stream) {\n          var sock = stream.node.sock;\n          sock.sock_ops.close(sock);\n        }},nextname:function () {\n        if (!SOCKFS.nextname.current) {\n          SOCKFS.nextname.current = 0;\n        }\n        return 'socket[' + (SOCKFS.nextname.current++) + ']';\n      },websocket_sock_ops:{createPeer:function (sock, addr, port) {\n          var ws;\n  \n          if (typeof addr === 'object') {\n            ws = addr;\n            addr = null;\n            port = null;\n          }\n  \n          if (ws) {\n            // for sockets that've already connected (e.g. we're the server)\n            // we can inspect the _socket property for the address\n            if (ws._socket) {\n              addr = ws._socket.remoteAddress;\n              port = ws._socket.remotePort;\n            }\n            // if we're just now initializing a connection to the remote,\n            // inspect the url property\n            else {\n              var result = /ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);\n              if (!result) {\n                throw new Error('WebSocket URL must be in the format ws(s)://address:port');\n              }\n              addr = result[1];\n              port = parseInt(result[2], 10);\n            }\n          } else {\n            // create the actual websocket object and connect\n            try {\n              var url = 'ws://' + addr + ':' + port;\n              // the node ws library API is slightly different than the browser's\n              var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];\n              // If node we use the ws library.\n              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];\n              ws = new WebSocket(url, opts);\n              ws.binaryType = 'arraybuffer';\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);\n            }\n          }\n  \n  \n          var peer = {\n            addr: addr,\n            port: port,\n            socket: ws,\n            dgram_send_queue: []\n          };\n  \n          SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);\n  \n          // if this is a bound dgram socket, send the port number first to allow\n          // us to override the ephemeral port reported to us by remotePort on the\n          // remote end.\n          if (sock.type === 2 && typeof sock.sport !== 'undefined') {\n            peer.dgram_send_queue.push(new Uint8Array([\n                255, 255, 255, 255,\n                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),\n                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)\n            ]));\n          }\n  \n          return peer;\n        },getPeer:function (sock, addr, port) {\n          return sock.peers[addr + ':' + port];\n        },addPeer:function (sock, peer) {\n          sock.peers[peer.addr + ':' + peer.port] = peer;\n        },removePeer:function (sock, peer) {\n          delete sock.peers[peer.addr + ':' + peer.port];\n        },handlePeerEvents:function (sock, peer) {\n          var first = true;\n  \n          var handleOpen = function () {\n            try {\n              var queued = peer.dgram_send_queue.shift();\n              while (queued) {\n                peer.socket.send(queued);\n                queued = peer.dgram_send_queue.shift();\n              }\n            } catch (e) {\n              // not much we can do here in the way of proper error handling as we've already\n              // lied and said this data was sent. shut it down.\n              peer.socket.close();\n            }\n          };\n  \n          function handleMessage(data) {\n            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer\n            data = new Uint8Array(data);  // make a typed array view on the array buffer\n  \n  \n            // if this is the port message, override the peer's port with it\n            var wasfirst = first;\n            first = false;\n            if (wasfirst &&\n                data.length === 10 &&\n                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&\n                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {\n              // update the peer's port and it's key in the peer map\n              var newport = ((data[8] << 8) | data[9]);\n              SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n              peer.port = newport;\n              SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n              return;\n            }\n  \n            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });\n          };\n  \n          if (ENVIRONMENT_IS_NODE) {\n            peer.socket.on('open', handleOpen);\n            peer.socket.on('message', function(data, flags) {\n              if (!flags.binary) {\n                return;\n              }\n              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer\n            });\n            peer.socket.on('error', function() {\n              // don't throw\n            });\n          } else {\n            peer.socket.onopen = handleOpen;\n            peer.socket.onmessage = function peer_socket_onmessage(event) {\n              handleMessage(event.data);\n            };\n          }\n        },poll:function (sock) {\n          if (sock.type === 1 && sock.server) {\n            // listen sockets should only say they're available for reading\n            // if there are pending clients.\n            return sock.pending.length ? (64 | 1) : 0;\n          }\n  \n          var mask = 0;\n          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets\n            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :\n            null;\n  \n          if (sock.recv_queue.length ||\n              !dest ||  // connection-less sockets are always ready to read\n              (dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed\n            mask |= (64 | 1);\n          }\n  \n          if (!dest ||  // connection-less sockets are always ready to write\n              (dest && dest.socket.readyState === dest.socket.OPEN)) {\n            mask |= 4;\n          }\n  \n          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {\n            mask |= 16;\n          }\n  \n          return mask;\n        },ioctl:function (sock, request, arg) {\n          switch (request) {\n            case 21531:\n              var bytes = 0;\n              if (sock.recv_queue.length) {\n                bytes = sock.recv_queue[0].data.length;\n              }\n              HEAP32[((arg)>>2)]=bytes;\n              return 0;\n            default:\n              return ERRNO_CODES.EINVAL;\n          }\n        },close:function (sock) {\n          // if we've spawned a listen server, close it\n          if (sock.server) {\n            try {\n              sock.server.close();\n            } catch (e) {\n            }\n            sock.server = null;\n          }\n          // close any peer connections\n          var peers = Object.keys(sock.peers);\n          for (var i = 0; i < peers.length; i++) {\n            var peer = sock.peers[peers[i]];\n            try {\n              peer.socket.close();\n            } catch (e) {\n            }\n            SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n          }\n          return 0;\n        },bind:function (sock, addr, port) {\n          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound\n          }\n          sock.saddr = addr;\n          sock.sport = port || _mkport();\n          // in order to emulate dgram sockets, we need to launch a listen server when\n          // binding on a connection-less socket\n          // note: this is only required on the server side\n          if (sock.type === 2) {\n            // close the existing server if it exists\n            if (sock.server) {\n              sock.server.close();\n              sock.server = null;\n            }\n            // swallow error operation not supported error that occurs when binding in the\n            // browser where this isn't supported\n            try {\n              sock.sock_ops.listen(sock, 0);\n            } catch (e) {\n              if (!(e instanceof FS.ErrnoError)) throw e;\n              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;\n            }\n          }\n        },connect:function (sock, addr, port) {\n          if (sock.server) {\n            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);\n          }\n  \n          // TODO autobind\n          // if (!sock.addr && sock.type == 2) {\n          // }\n  \n          // early out if we're already connected / in the middle of connecting\n          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {\n            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n            if (dest) {\n              if (dest.socket.readyState === dest.socket.CONNECTING) {\n                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);\n              } else {\n                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);\n              }\n            }\n          }\n  \n          // add the socket to our peer list and set our\n          // destination address / port to match\n          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n          sock.daddr = peer.addr;\n          sock.dport = peer.port;\n  \n          // always \"fail\" in non-blocking mode\n          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);\n        },listen:function (sock, backlog) {\n          if (!ENVIRONMENT_IS_NODE) {\n            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n          }\n          if (sock.server) {\n             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening\n          }\n          var WebSocketServer = require('ws').Server;\n          var host = sock.saddr;\n          sock.server = new WebSocketServer({\n            host: host,\n            port: sock.sport\n            // TODO support backlog\n          });\n  \n          sock.server.on('connection', function(ws) {\n            if (sock.type === 1) {\n              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);\n  \n              // create a peer on the new socket\n              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);\n              newsock.daddr = peer.addr;\n              newsock.dport = peer.port;\n  \n              // push to queue for accept to pick up\n              sock.pending.push(newsock);\n            } else {\n              // create a peer on the listen socket so calling sendto\n              // with the listen socket and an address will resolve\n              // to the correct client\n              SOCKFS.websocket_sock_ops.createPeer(sock, ws);\n            }\n          });\n          sock.server.on('closed', function() {\n            sock.server = null;\n          });\n          sock.server.on('error', function() {\n            // don't throw\n          });\n        },accept:function (listensock) {\n          if (!listensock.server) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          var newsock = listensock.pending.shift();\n          newsock.stream.flags = listensock.stream.flags;\n          return newsock;\n        },getname:function (sock, peer) {\n          var addr, port;\n          if (peer) {\n            if (sock.daddr === undefined || sock.dport === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            }\n            addr = sock.daddr;\n            port = sock.dport;\n          } else {\n            // TODO saddr and sport will be set for bind()'d UDP sockets, but what\n            // should we be returning for TCP sockets that've been connect()'d?\n            addr = sock.saddr || 0;\n            port = sock.sport || 0;\n          }\n          return { addr: addr, port: port };\n        },sendmsg:function (sock, buffer, offset, length, addr, port) {\n          if (sock.type === 2) {\n            // connection-less sockets will honor the message address,\n            // and otherwise fall back to the bound destination address\n            if (addr === undefined || port === undefined) {\n              addr = sock.daddr;\n              port = sock.dport;\n            }\n            // if there was no address to fall back to, error out\n            if (addr === undefined || port === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);\n            }\n          } else {\n            // connection-based sockets will only use the bound\n            addr = sock.daddr;\n            port = sock.dport;\n          }\n  \n          // find the peer for the destination address\n          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);\n  \n          // early out if not connected with a connection-based socket\n          if (sock.type === 1) {\n            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            } else if (dest.socket.readyState === dest.socket.CONNECTING) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // create a copy of the incoming data to send, as the WebSocket API\n          // doesn't work entirely with an ArrayBufferView, it'll just send\n          // the entire underlying buffer\n          var data;\n          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {\n            data = buffer.slice(offset, offset + length);\n          } else {  // ArrayBufferView\n            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);\n          }\n  \n          // if we're emulating a connection-less dgram socket and don't have\n          // a cached connection, queue the buffer to send upon connect and\n          // lie, saying the data was sent now.\n          if (sock.type === 2) {\n            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {\n              // if we're not connected, open a new connection\n              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n              }\n              dest.dgram_send_queue.push(data);\n              return length;\n            }\n          }\n  \n          try {\n            // send the actual data\n            dest.socket.send(data);\n            return length;\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n        },recvmsg:function (sock, length) {\n          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html\n          if (sock.type === 1 && sock.server) {\n            // tcp servers should not be recv()'ing on the listen socket\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n          }\n  \n          var queued = sock.recv_queue.shift();\n          if (!queued) {\n            if (sock.type === 1) {\n              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n  \n              if (!dest) {\n                // if we have a destination address but are not connected, error out\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n              }\n              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                // return null if the socket has closed\n                return null;\n              }\n              else {\n                // else, our socket is in a valid state but truly has nothing available\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n            } else {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's\n          // requeued TCP data it'll be an ArrayBufferView\n          var queuedLength = queued.data.byteLength || queued.data.length;\n          var queuedOffset = queued.data.byteOffset || 0;\n          var queuedBuffer = queued.data.buffer || queued.data;\n          var bytesRead = Math.min(length, queuedLength);\n          var res = {\n            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),\n            addr: queued.addr,\n            port: queued.port\n          };\n  \n  \n          // push back any unread data for TCP connections\n          if (sock.type === 1 && bytesRead < queuedLength) {\n            var bytesRemaining = queuedLength - bytesRead;\n            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);\n            sock.recv_queue.unshift(queued);\n          }\n  \n          return res;\n        }}};function _send(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _write(fd, buf, len);\n    }\n  \n  function _pwrite(fildes, buf, nbyte, offset) {\n      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _write(fildes, buf, nbyte) {\n      // ssize_t write(int fildes, const void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }\n  \n  function _fileno(stream) {\n      // int fileno(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) return -1;\n      return stream.fd;\n    }function _fwrite(ptr, size, nitems, stream) {\n      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html\n      var bytesToWrite = nitems * size;\n      if (bytesToWrite == 0) return 0;\n      var fd = _fileno(stream);\n      var bytesWritten = _write(fd, ptr, bytesToWrite);\n      if (bytesWritten == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return 0;\n      } else {\n        return Math.floor(bytesWritten / size);\n      }\n    }\n  \n  \n   \n  Module[\"_strlen\"] = _strlen;\n  \n  function __reallyNegative(x) {\n      return x < 0 || (x === 0 && (1/x) === -Infinity);\n    }function __formatString(format, varargs) {\n      var textIndex = format;\n      var argIndex = 0;\n      function getNextArg(type) {\n        // NOTE: Explicitly ignoring type safety. Otherwise this fails:\n        //       int x = 4; printf(\"%c\\n\", (char)x);\n        var ret;\n        if (type === 'double') {\n          ret = (HEAP32[((tempDoublePtr)>>2)]=HEAP32[(((varargs)+(argIndex))>>2)],HEAP32[(((tempDoublePtr)+(4))>>2)]=HEAP32[(((varargs)+((argIndex)+(4)))>>2)],(+(HEAPF64[(tempDoublePtr)>>3])));\n        } else if (type == 'i64') {\n          ret = [HEAP32[(((varargs)+(argIndex))>>2)],\n                 HEAP32[(((varargs)+(argIndex+4))>>2)]];\n  \n        } else {\n          type = 'i32'; // varargs are always i32, i64, or double\n          ret = HEAP32[(((varargs)+(argIndex))>>2)];\n        }\n        argIndex += Runtime.getNativeFieldSize(type);\n        return ret;\n      }\n  \n      var ret = [];\n      var curr, next, currArg;\n      while(1) {\n        var startTextIndex = textIndex;\n        curr = HEAP8[(textIndex)];\n        if (curr === 0) break;\n        next = HEAP8[((textIndex+1)|0)];\n        if (curr == 37) {\n          // Handle flags.\n          var flagAlwaysSigned = false;\n          var flagLeftAlign = false;\n          var flagAlternative = false;\n          var flagZeroPad = false;\n          var flagPadSign = false;\n          flagsLoop: while (1) {\n            switch (next) {\n              case 43:\n                flagAlwaysSigned = true;\n                break;\n              case 45:\n                flagLeftAlign = true;\n                break;\n              case 35:\n                flagAlternative = true;\n                break;\n              case 48:\n                if (flagZeroPad) {\n                  break flagsLoop;\n                } else {\n                  flagZeroPad = true;\n                  break;\n                }\n              case 32:\n                flagPadSign = true;\n                break;\n              default:\n                break flagsLoop;\n            }\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          }\n  \n          // Handle width.\n          var width = 0;\n          if (next == 42) {\n            width = getNextArg('i32');\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          } else {\n            while (next >= 48 && next <= 57) {\n              width = width * 10 + (next - 48);\n              textIndex++;\n              next = HEAP8[((textIndex+1)|0)];\n            }\n          }\n  \n          // Handle precision.\n          var precisionSet = false, precision = -1;\n          if (next == 46) {\n            precision = 0;\n            precisionSet = true;\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n            if (next == 42) {\n              precision = getNextArg('i32');\n              textIndex++;\n            } else {\n              while(1) {\n                var precisionChr = HEAP8[((textIndex+1)|0)];\n                if (precisionChr < 48 ||\n                    precisionChr > 57) break;\n                precision = precision * 10 + (precisionChr - 48);\n                textIndex++;\n              }\n            }\n            next = HEAP8[((textIndex+1)|0)];\n          }\n          if (precision < 0) {\n            precision = 6; // Standard default.\n            precisionSet = false;\n          }\n  \n          // Handle integer sizes. WARNING: These assume a 32-bit architecture!\n          var argSize;\n          switch (String.fromCharCode(next)) {\n            case 'h':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 104) {\n                textIndex++;\n                argSize = 1; // char (actually i32 in varargs)\n              } else {\n                argSize = 2; // short (actually i32 in varargs)\n              }\n              break;\n            case 'l':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 108) {\n                textIndex++;\n                argSize = 8; // long long\n              } else {\n                argSize = 4; // long\n              }\n              break;\n            case 'L': // long long\n            case 'q': // int64_t\n            case 'j': // intmax_t\n              argSize = 8;\n              break;\n            case 'z': // size_t\n            case 't': // ptrdiff_t\n            case 'I': // signed ptrdiff_t or unsigned size_t\n              argSize = 4;\n              break;\n            default:\n              argSize = null;\n          }\n          if (argSize) textIndex++;\n          next = HEAP8[((textIndex+1)|0)];\n  \n          // Handle type specifier.\n          switch (String.fromCharCode(next)) {\n            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {\n              // Integer.\n              var signed = next == 100 || next == 105;\n              argSize = argSize || 4;\n              var currArg = getNextArg('i' + (argSize * 8));\n              var origArg = currArg;\n              var argText;\n              // Flatten i64-1 [low, high] into a (slightly rounded) double\n              if (argSize == 8) {\n                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);\n              }\n              // Truncate to requested size.\n              if (argSize <= 4) {\n                var limit = Math.pow(256, argSize) - 1;\n                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);\n              }\n              // Format the number.\n              var currAbsArg = Math.abs(currArg);\n              var prefix = '';\n              if (next == 100 || next == 105) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else\n                argText = reSign(currArg, 8 * argSize, 1).toString(10);\n              } else if (next == 117) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else\n                argText = unSign(currArg, 8 * argSize, 1).toString(10);\n                currArg = Math.abs(currArg);\n              } else if (next == 111) {\n                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);\n              } else if (next == 120 || next == 88) {\n                prefix = (flagAlternative && currArg != 0) ? '0x' : '';\n                if (argSize == 8 && i64Math) {\n                  if (origArg[1]) {\n                    argText = (origArg[1]>>>0).toString(16);\n                    var lower = (origArg[0]>>>0).toString(16);\n                    while (lower.length < 8) lower = '0' + lower;\n                    argText += lower;\n                  } else {\n                    argText = (origArg[0]>>>0).toString(16);\n                  }\n                } else\n                if (currArg < 0) {\n                  // Represent negative numbers in hex as 2's complement.\n                  currArg = -currArg;\n                  argText = (currAbsArg - 1).toString(16);\n                  var buffer = [];\n                  for (var i = 0; i < argText.length; i++) {\n                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));\n                  }\n                  argText = buffer.join('');\n                  while (argText.length < argSize * 2) argText = 'f' + argText;\n                } else {\n                  argText = currAbsArg.toString(16);\n                }\n                if (next == 88) {\n                  prefix = prefix.toUpperCase();\n                  argText = argText.toUpperCase();\n                }\n              } else if (next == 112) {\n                if (currAbsArg === 0) {\n                  argText = '(nil)';\n                } else {\n                  prefix = '0x';\n                  argText = currAbsArg.toString(16);\n                }\n              }\n              if (precisionSet) {\n                while (argText.length < precision) {\n                  argText = '0' + argText;\n                }\n              }\n  \n              // Add sign if needed\n              if (currArg >= 0) {\n                if (flagAlwaysSigned) {\n                  prefix = '+' + prefix;\n                } else if (flagPadSign) {\n                  prefix = ' ' + prefix;\n                }\n              }\n  \n              // Move sign to prefix so we zero-pad after the sign\n              if (argText.charAt(0) == '-') {\n                prefix = '-' + prefix;\n                argText = argText.substr(1);\n              }\n  \n              // Add padding.\n              while (prefix.length + argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad) {\n                    argText = '0' + argText;\n                  } else {\n                    prefix = ' ' + prefix;\n                  }\n                }\n              }\n  \n              // Insert the result into the buffer.\n              argText = prefix + argText;\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {\n              // Float.\n              var currArg = getNextArg('double');\n              var argText;\n              if (isNaN(currArg)) {\n                argText = 'nan';\n                flagZeroPad = false;\n              } else if (!isFinite(currArg)) {\n                argText = (currArg < 0 ? '-' : '') + 'inf';\n                flagZeroPad = false;\n              } else {\n                var isGeneral = false;\n                var effectivePrecision = Math.min(precision, 20);\n  \n                // Convert g/G to f/F or e/E, as per:\n                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html\n                if (next == 103 || next == 71) {\n                  isGeneral = true;\n                  precision = precision || 1;\n                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);\n                  if (precision > exponent && exponent >= -4) {\n                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);\n                    precision -= exponent + 1;\n                  } else {\n                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);\n                    precision--;\n                  }\n                  effectivePrecision = Math.min(precision, 20);\n                }\n  \n                if (next == 101 || next == 69) {\n                  argText = currArg.toExponential(effectivePrecision);\n                  // Make sure the exponent has at least 2 digits.\n                  if (/[eE][-+]\\d$/.test(argText)) {\n                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);\n                  }\n                } else if (next == 102 || next == 70) {\n                  argText = currArg.toFixed(effectivePrecision);\n                  if (currArg === 0 && __reallyNegative(currArg)) {\n                    argText = '-' + argText;\n                  }\n                }\n  \n                var parts = argText.split('e');\n                if (isGeneral && !flagAlternative) {\n                  // Discard trailing zeros and periods.\n                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&\n                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {\n                    parts[0] = parts[0].slice(0, -1);\n                  }\n                } else {\n                  // Make sure we have a period in alternative mode.\n                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';\n                  // Zero pad until required precision.\n                  while (precision > effectivePrecision++) parts[0] += '0';\n                }\n                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');\n  \n                // Capitalize 'E' if needed.\n                if (next == 69) argText = argText.toUpperCase();\n  \n                // Add sign.\n                if (currArg >= 0) {\n                  if (flagAlwaysSigned) {\n                    argText = '+' + argText;\n                  } else if (flagPadSign) {\n                    argText = ' ' + argText;\n                  }\n                }\n              }\n  \n              // Add padding.\n              while (argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {\n                    argText = argText[0] + '0' + argText.slice(1);\n                  } else {\n                    argText = (flagZeroPad ? '0' : ' ') + argText;\n                  }\n                }\n              }\n  \n              // Adjust case.\n              if (next < 97) argText = argText.toUpperCase();\n  \n              // Insert the result into the buffer.\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 's': {\n              // String.\n              var arg = getNextArg('i8*');\n              var argLength = arg ? _strlen(arg) : '(null)'.length;\n              if (precisionSet) argLength = Math.min(argLength, precision);\n              if (!flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              if (arg) {\n                for (var i = 0; i < argLength; i++) {\n                  ret.push(HEAPU8[((arg++)|0)]);\n                }\n              } else {\n                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));\n              }\n              if (flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              break;\n            }\n            case 'c': {\n              // Character.\n              if (flagLeftAlign) ret.push(getNextArg('i8'));\n              while (--width > 0) {\n                ret.push(32);\n              }\n              if (!flagLeftAlign) ret.push(getNextArg('i8'));\n              break;\n            }\n            case 'n': {\n              // Write the length written so far to the next parameter.\n              var ptr = getNextArg('i32*');\n              HEAP32[((ptr)>>2)]=ret.length;\n              break;\n            }\n            case '%': {\n              // Literal percent sign.\n              ret.push(curr);\n              break;\n            }\n            default: {\n              // Unknown specifiers remain untouched.\n              for (var i = startTextIndex; i < textIndex + 2; i++) {\n                ret.push(HEAP8[(i)]);\n              }\n            }\n          }\n          textIndex += 2;\n          // TODO: Support a/A (hex float) and m (last error) specifiers.\n          // TODO: Support %1${specifier} for arg selection.\n        } else {\n          ret.push(curr);\n          textIndex += 1;\n        }\n      }\n      return ret;\n    }function _fprintf(stream, format, varargs) {\n      // int fprintf(FILE *restrict stream, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var result = __formatString(format, varargs);\n      var stack = Runtime.stackSave();\n      var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);\n      Runtime.stackRestore(stack);\n      return ret;\n    }function _printf(format, varargs) {\n      // int printf(const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var stdout = HEAP32[((_stdout)>>2)];\n      return _fprintf(stdout, format, varargs);\n    }\n\n\n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\n__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n\nvar Math_min = Math.min;\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=0;var n=0;var o=0;var p=0;var q=+env.NaN,r=+env.Infinity;var s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0;var B=0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=global.Math.floor;var M=global.Math.abs;var N=global.Math.sqrt;var O=global.Math.pow;var P=global.Math.cos;var Q=global.Math.sin;var R=global.Math.tan;var S=global.Math.acos;var T=global.Math.asin;var U=global.Math.atan;var V=global.Math.atan2;var W=global.Math.exp;var X=global.Math.log;var Y=global.Math.ceil;var Z=global.Math.imul;var _=env.abort;var $=env.assert;var aa=env.asmPrintInt;var ba=env.asmPrintFloat;var ca=env.min;var da=env._llvm_lifetime_start;var ea=env._free;var fa=env.__formatString;var ga=env._printf;var ha=env._send;var ia=env._pwrite;var ja=env.___setErrNo;var ka=env._fwrite;var la=env._malloc;var ma=env._mkport;var na=env._fprintf;var oa=env.__reallyNegative;var pa=env._llvm_lifetime_end;var qa=env._fileno;var ra=env._sqrt;var sa=env._fflush;var ta=env._write;var ua=env._emscripten_memcpy_big;var va=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction wa(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function xa(){return i|0}function ya(a){a=a|0;i=a}function za(a,b){a=a|0;b=b|0;if((m|0)==0){m=a;n=b}}function Aa(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function Ba(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function Ca(a){a=a|0;B=a}function Da(a){a=a|0;C=a}function Ea(a){a=a|0;D=a}function Fa(a){a=a|0;E=a}function Ga(a){a=a|0;F=a}function Ha(a){a=a|0;G=a}function Ia(a){a=a|0;H=a}function Ja(a){a=a|0;I=a}function Ka(a){a=a|0;J=a}function La(a){a=a|0;K=a}function Ma(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0;d=i;e=(a|0)>0;if(e){f=0}else{i=d;return}while(1){g=f+1|0;if((g|0)<(a|0)){j=b+(f*56|0)|0;k=b+(f*56|0)+8|0;l=b+(f*56|0)+16|0;m=b+(f*56|0)+24|0;n=b+(f*56|0)+32|0;o=b+(f*56|0)+40|0;p=b+(f*56|0)+48|0;q=g;do{r=+h[j>>3]- +h[b+(q*56|0)>>3];s=+h[k>>3]- +h[b+(q*56|0)+8>>3];t=+h[l>>3]- +h[b+(q*56|0)+16>>3];u=+N(+(r*r+s*s+t*t));v=c/(u*u*u);w=b+(q*56|0)+48|0;h[m>>3]=+h[m>>3]-v*r*+h[w>>3];h[n>>3]=+h[n>>3]-v*s*+h[w>>3];h[o>>3]=+h[o>>3]-v*t*+h[w>>3];w=b+(q*56|0)+24|0;h[w>>3]=+h[w>>3]+v*r*+h[p>>3];w=b+(q*56|0)+32|0;h[w>>3]=+h[w>>3]+v*s*+h[p>>3];w=b+(q*56|0)+40|0;h[w>>3]=+h[w>>3]+v*t*+h[p>>3];q=q+1|0;}while((q|0)!=(a|0))}if((g|0)==(a|0)){break}else{f=g}}if(e){x=0}else{i=d;return}do{e=b+(x*56|0)|0;h[e>>3]=+h[e>>3]+ +h[b+(x*56|0)+24>>3]*c;e=b+(x*56|0)+8|0;h[e>>3]=+h[e>>3]+ +h[b+(x*56|0)+32>>3]*c;e=b+(x*56|0)+16|0;h[e>>3]=+h[e>>3]+ +h[b+(x*56|0)+40>>3]*c;x=x+1|0;}while((x|0)!=(a|0));i=d;return}function Na(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0.0,j=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0;b=i;i=i+8|0;a=b;d=i;i=i+8|0;e=+h[56>>3];f=+h[112>>3];g=+h[168>>3];j=+h[224>>3];l=+h[280>>3];m=e*+h[40>>3]+0.0+f*+h[96>>3]+g*+h[152>>3]+j*+h[208>>3]+l*+h[264>>3];n=e*+h[48>>3]+0.0+f*+h[104>>3]+g*+h[160>>3]+j*+h[216>>3]+l*+h[272>>3];o=-(+h[32>>3]*e+0.0+ +h[88>>3]*f+ +h[144>>3]*g+ +h[200>>3]*j+ +h[256>>3]*l)/39.47841760435743;h[32>>3]=o;l=-m/39.47841760435743;h[40>>3]=l;m=-n/39.47841760435743;h[48>>3]=m;n=m;m=l;l=o;o=e;e=0.0;p=0;while(1){j=e+o*.5*(l*l+m*m+n*n);q=p+1|0;if((q|0)<5){g=+h[8+(p*56|0)>>3];f=+h[16+(p*56|0)>>3];r=+h[24+(p*56|0)>>3];s=j;t=q;while(1){u=g- +h[8+(t*56|0)>>3];v=f- +h[16+(t*56|0)>>3];w=r- +h[24+(t*56|0)>>3];x=+N(+(u*u+v*v+w*w));w=s-o*+h[56+(t*56|0)>>3]/x;y=t+1|0;if((y|0)==5){z=w;break}else{t=y;s=w}}}else{z=j}if((q|0)==5){break}n=+h[48+(q*56|0)>>3];m=+h[40+(q*56|0)>>3];l=+h[32+(q*56|0)>>3];o=+h[56+(q*56|0)>>3];e=z;p=q}p=d;h[k>>3]=z;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];ga(288,d|0)|0;d=1;while(1){Ma(5,8,.01);p=d+1|0;if((p|0)==5000001){A=0.0;B=0;break}else{d=p}}while(1){z=+h[56+(B*56|0)>>3];e=+h[32+(B*56|0)>>3];o=+h[40+(B*56|0)>>3];l=+h[48+(B*56|0)>>3];m=A+z*.5*(e*e+o*o+l*l);d=B+1|0;if((d|0)<5){l=+h[8+(B*56|0)>>3];o=+h[16+(B*56|0)>>3];e=+h[24+(B*56|0)>>3];n=m;p=d;while(1){s=l- +h[8+(p*56|0)>>3];r=o- +h[16+(p*56|0)>>3];f=e- +h[24+(p*56|0)>>3];g=+N(+(s*s+r*r+f*f));f=n-z*+h[56+(p*56|0)>>3]/g;t=p+1|0;if((t|0)==5){C=f;break}else{p=t;n=f}}}else{C=m}if((d|0)==5){break}else{A=C;B=d}}B=a;h[k>>3]=C;c[B>>2]=c[k>>2];c[B+4>>2]=c[k+4>>2];ga(288,a|0)|0;i=b;return 0}function Oa(){}function Pa(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function Qa(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function Ra(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return ua(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nreturn{_strlen:Qa,_memcpy:Ra,_main:Na,_memset:Pa,runPostSets:Oa,stackAlloc:wa,stackSave:xa,stackRestore:ya,setThrew:za,setTempRet0:Ca,setTempRet1:Da,setTempRet2:Ea,setTempRet3:Fa,setTempRet4:Ga,setTempRet5:Ha,setTempRet6:Ia,setTempRet7:Ja,setTempRet8:Ka,setTempRet9:La}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"_llvm_lifetime_start\": _llvm_lifetime_start, \"_free\": _free, \"__formatString\": __formatString, \"_printf\": _printf, \"_send\": _send, \"_pwrite\": _pwrite, \"___setErrNo\": ___setErrNo, \"_fwrite\": _fwrite, \"_malloc\": _malloc, \"_mkport\": _mkport, \"_fprintf\": _fprintf, \"__reallyNegative\": __reallyNegative, \"_llvm_lifetime_end\": _llvm_lifetime_end, \"_fileno\": _fileno, \"_sqrt\": _sqrt, \"_fflush\": _fflush, \"_write\": _write, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"NaN\": NaN, \"Infinity\": Infinity }, buffer);\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included\nvar i64Math = null;\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "quicksort.c", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\n\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(200059);\n/* global initializers */ __ATINIT__.push();\n\n\n/* memory initializer */ allocate([], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n/* memory initializer */ allocate([32,69,114,114,111,114,32,105,110,32,81,117,105,99,107,46,0,0,0,0,0,0,0,0], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE+200032);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;\n\n  \n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  \n  \n  \n  \n  \n  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {\n        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createSocket:function (family, type, protocol) {\n        var streaming = type == 1;\n        if (protocol) {\n          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp\n        }\n  \n        // create our internal socket structure\n        var sock = {\n          family: family,\n          type: type,\n          protocol: protocol,\n          server: null,\n          peers: {},\n          pending: [],\n          recv_queue: [],\n          sock_ops: SOCKFS.websocket_sock_ops\n        };\n  \n        // create the filesystem node to store the socket structure\n        var name = SOCKFS.nextname();\n        var node = FS.createNode(SOCKFS.root, name, 49152, 0);\n        node.sock = sock;\n  \n        // and the wrapping stream that enables library functions such\n        // as read and write to indirectly interact with the socket\n        var stream = FS.createStream({\n          path: name,\n          node: node,\n          flags: FS.modeStringToFlags('r+'),\n          seekable: false,\n          stream_ops: SOCKFS.stream_ops\n        });\n  \n        // map the new stream to the socket structure (sockets have a 1:1\n        // relationship with a stream)\n        sock.stream = stream;\n  \n        return sock;\n      },getSocket:function (fd) {\n        var stream = FS.getStream(fd);\n        if (!stream || !FS.isSocket(stream.node.mode)) {\n          return null;\n        }\n        return stream.node.sock;\n      },stream_ops:{poll:function (stream) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.poll(sock);\n        },ioctl:function (stream, request, varargs) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.ioctl(sock, request, varargs);\n        },read:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          var msg = sock.sock_ops.recvmsg(sock, length);\n          if (!msg) {\n            // socket is closed\n            return 0;\n          }\n          buffer.set(msg.buffer, offset);\n          return msg.buffer.length;\n        },write:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.sendmsg(sock, buffer, offset, length);\n        },close:function (stream) {\n          var sock = stream.node.sock;\n          sock.sock_ops.close(sock);\n        }},nextname:function () {\n        if (!SOCKFS.nextname.current) {\n          SOCKFS.nextname.current = 0;\n        }\n        return 'socket[' + (SOCKFS.nextname.current++) + ']';\n      },websocket_sock_ops:{createPeer:function (sock, addr, port) {\n          var ws;\n  \n          if (typeof addr === 'object') {\n            ws = addr;\n            addr = null;\n            port = null;\n          }\n  \n          if (ws) {\n            // for sockets that've already connected (e.g. we're the server)\n            // we can inspect the _socket property for the address\n            if (ws._socket) {\n              addr = ws._socket.remoteAddress;\n              port = ws._socket.remotePort;\n            }\n            // if we're just now initializing a connection to the remote,\n            // inspect the url property\n            else {\n              var result = /ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);\n              if (!result) {\n                throw new Error('WebSocket URL must be in the format ws(s)://address:port');\n              }\n              addr = result[1];\n              port = parseInt(result[2], 10);\n            }\n          } else {\n            // create the actual websocket object and connect\n            try {\n              var url = 'ws://' + addr + ':' + port;\n              // the node ws library API is slightly different than the browser's\n              var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];\n              // If node we use the ws library.\n              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];\n              ws = new WebSocket(url, opts);\n              ws.binaryType = 'arraybuffer';\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);\n            }\n          }\n  \n  \n          var peer = {\n            addr: addr,\n            port: port,\n            socket: ws,\n            dgram_send_queue: []\n          };\n  \n          SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);\n  \n          // if this is a bound dgram socket, send the port number first to allow\n          // us to override the ephemeral port reported to us by remotePort on the\n          // remote end.\n          if (sock.type === 2 && typeof sock.sport !== 'undefined') {\n            peer.dgram_send_queue.push(new Uint8Array([\n                255, 255, 255, 255,\n                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),\n                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)\n            ]));\n          }\n  \n          return peer;\n        },getPeer:function (sock, addr, port) {\n          return sock.peers[addr + ':' + port];\n        },addPeer:function (sock, peer) {\n          sock.peers[peer.addr + ':' + peer.port] = peer;\n        },removePeer:function (sock, peer) {\n          delete sock.peers[peer.addr + ':' + peer.port];\n        },handlePeerEvents:function (sock, peer) {\n          var first = true;\n  \n          var handleOpen = function () {\n            try {\n              var queued = peer.dgram_send_queue.shift();\n              while (queued) {\n                peer.socket.send(queued);\n                queued = peer.dgram_send_queue.shift();\n              }\n            } catch (e) {\n              // not much we can do here in the way of proper error handling as we've already\n              // lied and said this data was sent. shut it down.\n              peer.socket.close();\n            }\n          };\n  \n          function handleMessage(data) {\n            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer\n            data = new Uint8Array(data);  // make a typed array view on the array buffer\n  \n  \n            // if this is the port message, override the peer's port with it\n            var wasfirst = first;\n            first = false;\n            if (wasfirst &&\n                data.length === 10 &&\n                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&\n                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {\n              // update the peer's port and it's key in the peer map\n              var newport = ((data[8] << 8) | data[9]);\n              SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n              peer.port = newport;\n              SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n              return;\n            }\n  \n            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });\n          };\n  \n          if (ENVIRONMENT_IS_NODE) {\n            peer.socket.on('open', handleOpen);\n            peer.socket.on('message', function(data, flags) {\n              if (!flags.binary) {\n                return;\n              }\n              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer\n            });\n            peer.socket.on('error', function() {\n              // don't throw\n            });\n          } else {\n            peer.socket.onopen = handleOpen;\n            peer.socket.onmessage = function peer_socket_onmessage(event) {\n              handleMessage(event.data);\n            };\n          }\n        },poll:function (sock) {\n          if (sock.type === 1 && sock.server) {\n            // listen sockets should only say they're available for reading\n            // if there are pending clients.\n            return sock.pending.length ? (64 | 1) : 0;\n          }\n  \n          var mask = 0;\n          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets\n            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :\n            null;\n  \n          if (sock.recv_queue.length ||\n              !dest ||  // connection-less sockets are always ready to read\n              (dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed\n            mask |= (64 | 1);\n          }\n  \n          if (!dest ||  // connection-less sockets are always ready to write\n              (dest && dest.socket.readyState === dest.socket.OPEN)) {\n            mask |= 4;\n          }\n  \n          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {\n            mask |= 16;\n          }\n  \n          return mask;\n        },ioctl:function (sock, request, arg) {\n          switch (request) {\n            case 21531:\n              var bytes = 0;\n              if (sock.recv_queue.length) {\n                bytes = sock.recv_queue[0].data.length;\n              }\n              HEAP32[((arg)>>2)]=bytes;\n              return 0;\n            default:\n              return ERRNO_CODES.EINVAL;\n          }\n        },close:function (sock) {\n          // if we've spawned a listen server, close it\n          if (sock.server) {\n            try {\n              sock.server.close();\n            } catch (e) {\n            }\n            sock.server = null;\n          }\n          // close any peer connections\n          var peers = Object.keys(sock.peers);\n          for (var i = 0; i < peers.length; i++) {\n            var peer = sock.peers[peers[i]];\n            try {\n              peer.socket.close();\n            } catch (e) {\n            }\n            SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n          }\n          return 0;\n        },bind:function (sock, addr, port) {\n          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound\n          }\n          sock.saddr = addr;\n          sock.sport = port || _mkport();\n          // in order to emulate dgram sockets, we need to launch a listen server when\n          // binding on a connection-less socket\n          // note: this is only required on the server side\n          if (sock.type === 2) {\n            // close the existing server if it exists\n            if (sock.server) {\n              sock.server.close();\n              sock.server = null;\n            }\n            // swallow error operation not supported error that occurs when binding in the\n            // browser where this isn't supported\n            try {\n              sock.sock_ops.listen(sock, 0);\n            } catch (e) {\n              if (!(e instanceof FS.ErrnoError)) throw e;\n              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;\n            }\n          }\n        },connect:function (sock, addr, port) {\n          if (sock.server) {\n            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);\n          }\n  \n          // TODO autobind\n          // if (!sock.addr && sock.type == 2) {\n          // }\n  \n          // early out if we're already connected / in the middle of connecting\n          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {\n            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n            if (dest) {\n              if (dest.socket.readyState === dest.socket.CONNECTING) {\n                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);\n              } else {\n                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);\n              }\n            }\n          }\n  \n          // add the socket to our peer list and set our\n          // destination address / port to match\n          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n          sock.daddr = peer.addr;\n          sock.dport = peer.port;\n  \n          // always \"fail\" in non-blocking mode\n          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);\n        },listen:function (sock, backlog) {\n          if (!ENVIRONMENT_IS_NODE) {\n            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n          }\n          if (sock.server) {\n             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening\n          }\n          var WebSocketServer = require('ws').Server;\n          var host = sock.saddr;\n          sock.server = new WebSocketServer({\n            host: host,\n            port: sock.sport\n            // TODO support backlog\n          });\n  \n          sock.server.on('connection', function(ws) {\n            if (sock.type === 1) {\n              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);\n  \n              // create a peer on the new socket\n              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);\n              newsock.daddr = peer.addr;\n              newsock.dport = peer.port;\n  \n              // push to queue for accept to pick up\n              sock.pending.push(newsock);\n            } else {\n              // create a peer on the listen socket so calling sendto\n              // with the listen socket and an address will resolve\n              // to the correct client\n              SOCKFS.websocket_sock_ops.createPeer(sock, ws);\n            }\n          });\n          sock.server.on('closed', function() {\n            sock.server = null;\n          });\n          sock.server.on('error', function() {\n            // don't throw\n          });\n        },accept:function (listensock) {\n          if (!listensock.server) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          var newsock = listensock.pending.shift();\n          newsock.stream.flags = listensock.stream.flags;\n          return newsock;\n        },getname:function (sock, peer) {\n          var addr, port;\n          if (peer) {\n            if (sock.daddr === undefined || sock.dport === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            }\n            addr = sock.daddr;\n            port = sock.dport;\n          } else {\n            // TODO saddr and sport will be set for bind()'d UDP sockets, but what\n            // should we be returning for TCP sockets that've been connect()'d?\n            addr = sock.saddr || 0;\n            port = sock.sport || 0;\n          }\n          return { addr: addr, port: port };\n        },sendmsg:function (sock, buffer, offset, length, addr, port) {\n          if (sock.type === 2) {\n            // connection-less sockets will honor the message address,\n            // and otherwise fall back to the bound destination address\n            if (addr === undefined || port === undefined) {\n              addr = sock.daddr;\n              port = sock.dport;\n            }\n            // if there was no address to fall back to, error out\n            if (addr === undefined || port === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);\n            }\n          } else {\n            // connection-based sockets will only use the bound\n            addr = sock.daddr;\n            port = sock.dport;\n          }\n  \n          // find the peer for the destination address\n          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);\n  \n          // early out if not connected with a connection-based socket\n          if (sock.type === 1) {\n            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            } else if (dest.socket.readyState === dest.socket.CONNECTING) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // create a copy of the incoming data to send, as the WebSocket API\n          // doesn't work entirely with an ArrayBufferView, it'll just send\n          // the entire underlying buffer\n          var data;\n          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {\n            data = buffer.slice(offset, offset + length);\n          } else {  // ArrayBufferView\n            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);\n          }\n  \n          // if we're emulating a connection-less dgram socket and don't have\n          // a cached connection, queue the buffer to send upon connect and\n          // lie, saying the data was sent now.\n          if (sock.type === 2) {\n            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {\n              // if we're not connected, open a new connection\n              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n              }\n              dest.dgram_send_queue.push(data);\n              return length;\n            }\n          }\n  \n          try {\n            // send the actual data\n            dest.socket.send(data);\n            return length;\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n        },recvmsg:function (sock, length) {\n          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html\n          if (sock.type === 1 && sock.server) {\n            // tcp servers should not be recv()'ing on the listen socket\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n          }\n  \n          var queued = sock.recv_queue.shift();\n          if (!queued) {\n            if (sock.type === 1) {\n              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n  \n              if (!dest) {\n                // if we have a destination address but are not connected, error out\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n              }\n              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                // return null if the socket has closed\n                return null;\n              }\n              else {\n                // else, our socket is in a valid state but truly has nothing available\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n            } else {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's\n          // requeued TCP data it'll be an ArrayBufferView\n          var queuedLength = queued.data.byteLength || queued.data.length;\n          var queuedOffset = queued.data.byteOffset || 0;\n          var queuedBuffer = queued.data.buffer || queued.data;\n          var bytesRead = Math.min(length, queuedLength);\n          var res = {\n            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),\n            addr: queued.addr,\n            port: queued.port\n          };\n  \n  \n          // push back any unread data for TCP connections\n          if (sock.type === 1 && bytesRead < queuedLength) {\n            var bytesRemaining = queuedLength - bytesRead;\n            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);\n            sock.recv_queue.unshift(queued);\n          }\n  \n          return res;\n        }}};function _send(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _write(fd, buf, len);\n    }\n  \n  function _pwrite(fildes, buf, nbyte, offset) {\n      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _write(fildes, buf, nbyte) {\n      // ssize_t write(int fildes, const void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }\n  \n   \n  Module[\"_strlen\"] = _strlen;\n  \n  function _fileno(stream) {\n      // int fileno(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) return -1;\n      return stream.fd;\n    }function _fputs(s, stream) {\n      // int fputs(const char *restrict s, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html\n      var fd = _fileno(stream);\n      return _write(fd, s, _strlen(s));\n    }\n  \n  function _fputc(c, stream) {\n      // int fputc(int c, FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html\n      var chr = unSign(c & 0xFF);\n      HEAP8[((_fputc.ret)|0)]=chr;\n      var fd = _fileno(stream);\n      var ret = _write(fd, _fputc.ret, 1);\n      if (ret == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return -1;\n      } else {\n        return chr;\n      }\n    }function _puts(s) {\n      // int puts(const char *s);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html\n      // NOTE: puts() always writes an extra newline.\n      var stdout = HEAP32[((_stdout)>>2)];\n      var ret = _fputs(s, stdout);\n      if (ret < 0) {\n        return ret;\n      } else {\n        var newlineRet = _fputc(10, stdout);\n        return (newlineRet < 0) ? -1 : ret + 1;\n      }\n    }\n\n   \n  Module[\"_memset\"] = _memset;\n\n\n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;\n\n  function _free() {\n  }\n  Module[\"_free\"] = _free;\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\n__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });\n_fputc.ret = allocate([0], \"i8\", ALLOC_STATIC);\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n\nvar Math_min = Math.min;\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=0;var n=0;var o=0;var p=0;var q=+env.NaN,r=+env.Infinity;var s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0;var B=0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=global.Math.floor;var M=global.Math.abs;var N=global.Math.sqrt;var O=global.Math.pow;var P=global.Math.cos;var Q=global.Math.sin;var R=global.Math.tan;var S=global.Math.acos;var T=global.Math.asin;var U=global.Math.atan;var V=global.Math.atan2;var W=global.Math.exp;var X=global.Math.log;var Y=global.Math.ceil;var Z=global.Math.imul;var _=env.abort;var $=env.assert;var aa=env.asmPrintInt;var ba=env.asmPrintFloat;var ca=env.min;var da=env._puts;var ea=env._free;var fa=env._fputc;var ga=env._send;var ha=env._pwrite;var ia=env._fputs;var ja=env.___setErrNo;var ka=env._malloc;var la=env._mkport;var ma=env._emscripten_memcpy_big;var na=env._fileno;var oa=env._fflush;var pa=env._write;var qa=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ra(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function sa(){return i|0}function ta(a){a=a|0;i=a}function ua(a,b){a=a|0;b=b|0;if((m|0)==0){m=a;n=b}}function va(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function wa(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function xa(a){a=a|0;B=a}function ya(a){a=a|0;C=a}function za(a){a=a|0;D=a}function Aa(a){a=a|0;E=a}function Ba(a){a=a|0;F=a}function Ca(a){a=a|0;G=a}function Da(a){a=a|0;H=a}function Ea(a){a=a|0;I=a}function Fa(a){a=a|0;J=a}function Ga(a){a=a|0;K=a}function Ha(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;f=b;while(1){b=c[a+(((f+d|0)/2|0)<<2)>>2]|0;g=f;h=d;while(1){j=g;while(1){k=a+(j<<2)|0;l=c[k>>2]|0;m=j+1|0;if((l|0)<(b|0)){j=m}else{n=h;break}}while(1){o=a+(n<<2)|0;p=c[o>>2]|0;q=n+ -1|0;if((b|0)<(p|0)){n=q}else{break}}if((j|0)>(n|0)){r=j;s=n}else{c[k>>2]=p;c[o>>2]=l;r=m;s=q}if((r|0)>(s|0)){break}else{g=r;h=s}}if((s|0)>(f|0)){Ha(a,f,s)}if((r|0)<(d|0)){f=r}else{break}}i=e;return}function Ia(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;b=0;do{c[2]=74755;c[4]=0;c[6]=0;d=0;e=0;f=74755;g=1;while(1){h=(f*1309|0)+13849&65535;j=((h>>>0)%1e5|0)+ -5e4|0;c[32+(g<<2)>>2]=j;do{if((j|0)>(e|0)){c[4]=j;k=d;l=j}else{if((j|0)>=(d|0)){k=d;l=e;break}c[6]=j;k=j;l=e}}while(0);j=g+1|0;if((j|0)==50001){break}else{d=k;e=l;g=j;f=h}}c[2]=h;Ha(32,1,5e4);if((c[36>>2]|0)==(c[6]|0)){if((c[200032>>2]|0)!=(c[4]|0)){m=10}}else{m=10}if((m|0)==10){m=0;da(200040)|0}b=b+1|0;}while((b|0)!=100);i=a;return 0}function Ja(){}function Ka(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function La(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function Ma(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return ma(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nreturn{_strlen:Ka,_memcpy:Ma,_main:Ia,_memset:La,runPostSets:Ja,stackAlloc:ra,stackSave:sa,stackRestore:ta,setThrew:ua,setTempRet0:xa,setTempRet1:ya,setTempRet2:za,setTempRet3:Aa,setTempRet4:Ba,setTempRet5:Ca,setTempRet6:Da,setTempRet7:Ea,setTempRet8:Fa,setTempRet9:Ga}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"_puts\": _puts, \"_free\": _free, \"_fputc\": _fputc, \"_send\": _send, \"_pwrite\": _pwrite, \"_fputs\": _fputs, \"___setErrNo\": ___setErrNo, \"_malloc\": _malloc, \"_mkport\": _mkport, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"_fileno\": _fileno, \"_fflush\": _fflush, \"_write\": _write, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"NaN\": NaN, \"Infinity\": Infinity }, buffer);\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included\nvar i64Math = null;\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
    {name: "towers.c", content:"// The Module object: Our interface to the outside world. We import\n// and export values on it, and do the work to get that through\n// closure compiler if necessary. There are various ways Module can be used:\n// 1. Not defined. We create it here\n// 2. A function parameter, function(Module) { ..generated code.. }\n// 3. pre-run appended it, var Module = {}; ..generated code..\n// 4. External script tag defines var Module.\n// We need to do an eval in order to handle the closure compiler\n// case, where this code here is minified but Module was defined\n// elsewhere (e.g. case 4 above). We also need to check if Module\n// already exists (e.g. case 3 above).\n// Note that if you want to run closure, and also to use Module\n// after the generated code, you will need to define   var Module = {};\n// before the code. Then that object will be used in the code, and you\n// can continue to use Module afterwards as well.\nvar Module;\nif (!Module) Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');\n\n// Sometimes an existing Module object exists with properties\n// meant to overwrite the default module functionality. Here\n// we collect those properties and reapply _after_ we configure\n// the current environment's defaults to avoid having to be so\n// defensive during initialization.\nvar moduleOverrides = {};\nfor (var key in Module) {\n  if (Module.hasOwnProperty(key)) {\n    moduleOverrides[key] = Module[key];\n  }\n}\n\n// The environment setup code below is customized to use Module.\n// *** Environment setup code ***\nvar ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function';\nvar ENVIRONMENT_IS_WEB = typeof window === 'object';\nvar ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\nvar ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n\nif (ENVIRONMENT_IS_NODE) {\n  // Expose functionality in the same simple way that the shells work\n  // Note that we pollute the global namespace here, otherwise we break in node\n  if (!Module['print']) Module['print'] = function print(x) {\n    process['stdout'].write(x + '\\n');\n  };\n  if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n    process['stderr'].write(x + '\\n');\n  };\n\n  var nodeFS = require('fs');\n  var nodePath = require('path');\n\n  Module['read'] = function read(filename, binary) {\n    filename = nodePath['normalize'](filename);\n    var ret = nodeFS['readFileSync'](filename);\n    // The path is absolute if the normalized version is the same as the resolved.\n    if (!ret && filename != nodePath['resolve'](filename)) {\n      filename = path.join(__dirname, '..', 'src', filename);\n      ret = nodeFS['readFileSync'](filename);\n    }\n    if (ret && !binary) ret = ret.toString();\n    return ret;\n  };\n\n  Module['readBinary'] = function readBinary(filename) { return Module['read'](filename, true) };\n\n  Module['load'] = function load(f) {\n    globalEval(read(f));\n  };\n\n  Module['arguments'] = process['argv'].slice(2);\n\n  module['exports'] = Module;\n}\nelse if (ENVIRONMENT_IS_SHELL) {\n  if (!Module['print']) Module['print'] = print;\n  if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm\n\n  if (typeof read != 'undefined') {\n    Module['read'] = read;\n  } else {\n    Module['read'] = function read() { throw 'no read() available (jsc?)' };\n  }\n\n  Module['readBinary'] = function readBinary(f) {\n    return read(f, 'binary');\n  };\n\n  if (typeof scriptArgs != 'undefined') {\n    Module['arguments'] = scriptArgs;\n  } else if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  this['Module'] = Module;\n\n  eval(\"if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined\"); // wipe out the SpiderMonkey shell 'gc' function, which can confuse closure (uses it as a minified name, and it is then initted to a non-falsey value unexpectedly)\n}\nelse if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n  Module['read'] = function read(url) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, false);\n    xhr.send(null);\n    return xhr.responseText;\n  };\n\n  if (typeof arguments != 'undefined') {\n    Module['arguments'] = arguments;\n  }\n\n  if (typeof console !== 'undefined') {\n    if (!Module['print']) Module['print'] = function print(x) {\n      console.log(x);\n    };\n    if (!Module['printErr']) Module['printErr'] = function printErr(x) {\n      console.log(x);\n    };\n  } else {\n    // Probably a worker, and without console.log. We can do very little here...\n    var TRY_USE_DUMP = false;\n    if (!Module['print']) Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== \"undefined\") ? (function(x) {\n      dump(x);\n    }) : (function(x) {\n      // self.postMessage(x); // enable this if you want stdout to be sent as messages\n    }));\n  }\n\n  if (ENVIRONMENT_IS_WEB) {\n    this['Module'] = Module;\n  } else {\n    Module['load'] = importScripts;\n  }\n}\nelse {\n  // Unreachable because SHELL is dependant on the others\n  throw 'Unknown runtime environment. Where are we?';\n}\n\nfunction globalEval(x) {\n  eval.call(null, x);\n}\nif (!Module['load'] == 'undefined' && Module['read']) {\n  Module['load'] = function load(f) {\n    globalEval(Module['read'](f));\n  };\n}\nif (!Module['print']) {\n  Module['print'] = function(){};\n}\nif (!Module['printErr']) {\n  Module['printErr'] = Module['print'];\n}\nif (!Module['arguments']) {\n  Module['arguments'] = [];\n}\n// *** Environment setup code ***\n\n// Closure helpers\nModule.print = Module['print'];\nModule.printErr = Module['printErr'];\n\n// Callbacks\nModule['preRun'] = [];\nModule['postRun'] = [];\n\n// Merge back in the overrides\nfor (var key in moduleOverrides) {\n  if (moduleOverrides.hasOwnProperty(key)) {\n    Module[key] = moduleOverrides[key];\n  }\n}\n\n\n\n// === Auto-generated preamble library stuff ===\n\n//========================================\n// Runtime code shared with compiler\n//========================================\n\nvar Runtime = {\n  stackSave: function () {\n    return STACKTOP;\n  },\n  stackRestore: function (stackTop) {\n    STACKTOP = stackTop;\n  },\n  forceAlign: function (target, quantum) {\n    quantum = quantum || 4;\n    if (quantum == 1) return target;\n    if (isNumber(target) && isNumber(quantum)) {\n      return Math.ceil(target/quantum)*quantum;\n    } else if (isNumber(quantum) && isPowerOfTwo(quantum)) {\n      return '(((' +target + ')+' + (quantum-1) + ')&' + -quantum + ')';\n    }\n    return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum;\n  },\n  isNumberType: function (type) {\n    return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES;\n  },\n  isPointerType: function isPointerType(type) {\n  return type[type.length-1] == '*';\n},\n  isStructType: function isStructType(type) {\n  if (isPointerType(type)) return false;\n  if (isArrayType(type)) return true;\n  if (/<?\\{ ?[^}]* ?\\}>?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types\n  // See comment in isStructPointerType()\n  return type[0] == '%';\n},\n  INT_TYPES: {\"i1\":0,\"i8\":0,\"i16\":0,\"i32\":0,\"i64\":0},\n  FLOAT_TYPES: {\"float\":0,\"double\":0},\n  or64: function (x, y) {\n    var l = (x | 0) | (y | 0);\n    var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  and64: function (x, y) {\n    var l = (x | 0) & (y | 0);\n    var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  xor64: function (x, y) {\n    var l = (x | 0) ^ (y | 0);\n    var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296;\n    return l + h;\n  },\n  getNativeTypeSize: function (type) {\n    switch (type) {\n      case 'i1': case 'i8': return 1;\n      case 'i16': return 2;\n      case 'i32': return 4;\n      case 'i64': return 8;\n      case 'float': return 4;\n      case 'double': return 8;\n      default: {\n        if (type[type.length-1] === '*') {\n          return Runtime.QUANTUM_SIZE; // A pointer\n        } else if (type[0] === 'i') {\n          var bits = parseInt(type.substr(1));\n          assert(bits % 8 === 0);\n          return bits/8;\n        } else {\n          return 0;\n        }\n      }\n    }\n  },\n  getNativeFieldSize: function (type) {\n    return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE);\n  },\n  dedup: function dedup(items, ident) {\n  var seen = {};\n  if (ident) {\n    return items.filter(function(item) {\n      if (seen[item[ident]]) return false;\n      seen[item[ident]] = true;\n      return true;\n    });\n  } else {\n    return items.filter(function(item) {\n      if (seen[item]) return false;\n      seen[item] = true;\n      return true;\n    });\n  }\n},\n  set: function set() {\n  var args = typeof arguments[0] === 'object' ? arguments[0] : arguments;\n  var ret = {};\n  for (var i = 0; i < args.length; i++) {\n    ret[args[i]] = 0;\n  }\n  return ret;\n},\n  STACK_ALIGN: 8,\n  getAlignSize: function (type, size, vararg) {\n    // we align i64s and doubles on 64-bit boundaries, unlike x86\n    if (!vararg && (type == 'i64' || type == 'double')) return 8;\n    if (!type) return Math.min(size, 8); // align structures internally to 64 bits\n    return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE);\n  },\n  calculateStructAlignment: function calculateStructAlignment(type) {\n    type.flatSize = 0;\n    type.alignSize = 0;\n    var diffs = [];\n    var prev = -1;\n    var index = 0;\n    type.flatIndexes = type.fields.map(function(field) {\n      index++;\n      var size, alignSize;\n      if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) {\n        size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s.\n        alignSize = Runtime.getAlignSize(field, size);\n      } else if (Runtime.isStructType(field)) {\n        if (field[1] === '0') {\n          // this is [0 x something]. When inside another structure like here, it must be at the end,\n          // and it adds no size\n          // XXX this happens in java-nbody for example... assert(index === type.fields.length, 'zero-length in the middle!');\n          size = 0;\n          if (Types.types[field]) {\n            alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n          } else {\n            alignSize = type.alignSize || QUANTUM_SIZE;\n          }\n        } else {\n          size = Types.types[field].flatSize;\n          alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize);\n        }\n      } else if (field[0] == 'b') {\n        // bN, large number field, like a [N x i8]\n        size = field.substr(1)|0;\n        alignSize = 1;\n      } else if (field[0] === '<') {\n        // vector type\n        size = alignSize = Types.types[field].flatSize; // fully aligned\n      } else if (field[0] === 'i') {\n        // illegal integer field, that could not be legalized because it is an internal structure field\n        // it is ok to have such fields, if we just use them as markers of field size and nothing more complex\n        size = alignSize = parseInt(field.substr(1))/8;\n        assert(size % 1 === 0, 'cannot handle non-byte-size field ' + field);\n      } else {\n        assert(false, 'invalid type for calculateStructAlignment');\n      }\n      if (type.packed) alignSize = 1;\n      type.alignSize = Math.max(type.alignSize, alignSize);\n      var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory\n      type.flatSize = curr + size;\n      if (prev >= 0) {\n        diffs.push(curr-prev);\n      }\n      prev = curr;\n      return curr;\n    });\n    if (type.name_ && type.name_[0] === '[') {\n      // arrays have 2 elements, so we get the proper difference. then we scale here. that way we avoid\n      // allocating a potentially huge array for [999999 x i8] etc.\n      type.flatSize = parseInt(type.name_.substr(1))*type.flatSize/2;\n    }\n    type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize);\n    if (diffs.length == 0) {\n      type.flatFactor = type.flatSize;\n    } else if (Runtime.dedup(diffs).length == 1) {\n      type.flatFactor = diffs[0];\n    }\n    type.needsFlattening = (type.flatFactor != 1);\n    return type.flatIndexes;\n  },\n  generateStructInfo: function (struct, typeName, offset) {\n    var type, alignment;\n    if (typeName) {\n      offset = offset || 0;\n      type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName];\n      if (!type) return null;\n      if (type.fields.length != struct.length) {\n        printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo');\n        return null;\n      }\n      alignment = type.flatIndexes;\n    } else {\n      var type = { fields: struct.map(function(item) { return item[0] }) };\n      alignment = Runtime.calculateStructAlignment(type);\n    }\n    var ret = {\n      __size__: type.flatSize\n    };\n    if (typeName) {\n      struct.forEach(function(item, i) {\n        if (typeof item === 'string') {\n          ret[item] = alignment[i] + offset;\n        } else {\n          // embedded struct\n          var key;\n          for (var k in item) key = k;\n          ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]);\n        }\n      });\n    } else {\n      struct.forEach(function(item, i) {\n        ret[item[1]] = alignment[i];\n      });\n    }\n    return ret;\n  },\n  dynCall: function (sig, ptr, args) {\n    if (args && args.length) {\n      if (!args.splice) args = Array.prototype.slice.call(args);\n      args.splice(0, 0, ptr);\n      return Module['dynCall_' + sig].apply(null, args);\n    } else {\n      return Module['dynCall_' + sig].call(null, ptr);\n    }\n  },\n  functionPointers: [],\n  addFunction: function (func) {\n    for (var i = 0; i < Runtime.functionPointers.length; i++) {\n      if (!Runtime.functionPointers[i]) {\n        Runtime.functionPointers[i] = func;\n        return 2*(1 + i);\n      }\n    }\n    throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.';\n  },\n  removeFunction: function (index) {\n    Runtime.functionPointers[(index-2)/2] = null;\n  },\n  getAsmConst: function (code, numArgs) {\n    // code is a constant string on the heap, so we can cache these\n    if (!Runtime.asmConstCache) Runtime.asmConstCache = {};\n    var func = Runtime.asmConstCache[code];\n    if (func) return func;\n    var args = [];\n    for (var i = 0; i < numArgs; i++) {\n      args.push(String.fromCharCode(36) + i); // $0, $1 etc\n    }\n    code = Pointer_stringify(code);\n    if (code[0] === '\"') {\n      // tolerate EM_ASM(\"..code..\") even though EM_ASM(..code..) is correct\n      if (code.indexOf('\"', 1) === code.length-1) {\n        code = code.substr(1, code.length-2);\n      } else {\n        // something invalid happened, e.g. EM_ASM(\"..code($0)..\", input)\n        abort('invalid EM_ASM input |' + code + '|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)');\n      }\n    }\n    return Runtime.asmConstCache[code] = eval('(function(' + args.join(',') + '){ ' + code + ' })'); // new Function does not allow upvars in node\n  },\n  warnOnce: function (text) {\n    if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {};\n    if (!Runtime.warnOnce.shown[text]) {\n      Runtime.warnOnce.shown[text] = 1;\n      Module.printErr(text);\n    }\n  },\n  funcWrappers: {},\n  getFuncWrapper: function (func, sig) {\n    assert(sig);\n    if (!Runtime.funcWrappers[func]) {\n      Runtime.funcWrappers[func] = function dynCall_wrapper() {\n        return Runtime.dynCall(sig, func, arguments);\n      };\n    }\n    return Runtime.funcWrappers[func];\n  },\n  UTF8Processor: function () {\n    var buffer = [];\n    var needed = 0;\n    this.processCChar = function (code) {\n      code = code & 0xFF;\n\n      if (buffer.length == 0) {\n        if ((code & 0x80) == 0x00) {        // 0xxxxxxx\n          return String.fromCharCode(code);\n        }\n        buffer.push(code);\n        if ((code & 0xE0) == 0xC0) {        // 110xxxxx\n          needed = 1;\n        } else if ((code & 0xF0) == 0xE0) { // 1110xxxx\n          needed = 2;\n        } else {                            // 11110xxx\n          needed = 3;\n        }\n        return '';\n      }\n\n      if (needed) {\n        buffer.push(code);\n        needed--;\n        if (needed > 0) return '';\n      }\n\n      var c1 = buffer[0];\n      var c2 = buffer[1];\n      var c3 = buffer[2];\n      var c4 = buffer[3];\n      var ret;\n      if (buffer.length == 2) {\n        ret = String.fromCharCode(((c1 & 0x1F) << 6)  | (c2 & 0x3F));\n      } else if (buffer.length == 3) {\n        ret = String.fromCharCode(((c1 & 0x0F) << 12) | ((c2 & 0x3F) << 6)  | (c3 & 0x3F));\n      } else {\n        // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n        var codePoint = ((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |\n                        ((c3 & 0x3F) << 6)  | (c4 & 0x3F);\n        ret = String.fromCharCode(\n          Math.floor((codePoint - 0x10000) / 0x400) + 0xD800,\n          (codePoint - 0x10000) % 0x400 + 0xDC00);\n      }\n      buffer.length = 0;\n      return ret;\n    }\n    this.processJSString = function processJSString(string) {\n      string = unescape(encodeURIComponent(string));\n      var ret = [];\n      for (var i = 0; i < string.length; i++) {\n        ret.push(string.charCodeAt(i));\n      }\n      return ret;\n    }\n  },\n  getCompilerSetting: function (name) {\n    throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work';\n  },\n  stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = (((STACKTOP)+7)&-8); return ret; },\n  staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = (((STATICTOP)+7)&-8); return ret; },\n  dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = (((DYNAMICTOP)+7)&-8); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; },\n  alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; },\n  makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+((low>>>0)))+((+((high>>>0)))*(+4294967296))) : ((+((low>>>0)))+((+((high|0)))*(+4294967296)))); return ret; },\n  GLOBAL_BASE: 8,\n  QUANTUM_SIZE: 4,\n  __dummy__: 0\n}\n\n\nModule['Runtime'] = Runtime;\n\n\n\n\n\n\n\n\n\n//========================================\n// Runtime essentials\n//========================================\n\nvar __THREW__ = 0; // Used in checking for thrown exceptions.\n\nvar ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort()\nvar EXITSTATUS = 0;\n\nvar undef = 0;\n// tempInt is used for 32-bit signed values or smaller. tempBigInt is used\n// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt\nvar tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD, tempDouble, tempFloat;\nvar tempI64, tempI64b;\nvar tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9;\n\nfunction assert(condition, text) {\n  if (!condition) {\n    abort('Assertion failed: ' + text);\n  }\n}\n\nvar globalScope = this;\n\n// C calling interface. A convenient way to call C functions (in C files, or\n// defined with extern \"C\").\n//\n// Note: LLVM optimizations can inline and remove functions, after which you will not be\n//       able to call them. Closure can also do so. To avoid that, add your function to\n//       the exports using something like\n//\n//         -s EXPORTED_FUNCTIONS='[\"_main\", \"_myfunc\"]'\n//\n// @param ident      The name of the C function (note that C++ functions will be name-mangled - use extern \"C\")\n// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and\n//                   'array' for JavaScript arrays and typed arrays; note that arrays are 8-bit).\n// @param argTypes   An array of the types of arguments for the function (if there are no arguments, this can be ommitted). Types are as in returnType,\n//                   except that 'array' is not possible (there is no way for us to know the length of the array)\n// @param args       An array of the arguments to the function, as native JS values (as in returnType)\n//                   Note that string arguments will be stored on the stack (the JS string will become a C string on the stack).\n// @return           The return value, as a native JS value (as in returnType)\nfunction ccall(ident, returnType, argTypes, args) {\n  return ccallFunc(getCFunc(ident), returnType, argTypes, args);\n}\nModule[\"ccall\"] = ccall;\n\n// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)\nfunction getCFunc(ident) {\n  try {\n    var func = Module['_' + ident]; // closure exported function\n    if (!func) func = eval('_' + ident); // explicit lookup\n  } catch(e) {\n  }\n  assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)');\n  return func;\n}\n\n// Internal function that does a C call using a function, not an identifier\nfunction ccallFunc(func, returnType, argTypes, args) {\n  var stack = 0;\n  function toC(value, type) {\n    if (type == 'string') {\n      if (value === null || value === undefined || value === 0) return 0; // null string\n      value = intArrayFromString(value);\n      type = 'array';\n    }\n    if (type == 'array') {\n      if (!stack) stack = Runtime.stackSave();\n      var ret = Runtime.stackAlloc(value.length);\n      writeArrayToMemory(value, ret);\n      return ret;\n    }\n    return value;\n  }\n  function fromC(value, type) {\n    if (type == 'string') {\n      return Pointer_stringify(value);\n    }\n    assert(type != 'array');\n    return value;\n  }\n  var i = 0;\n  var cArgs = args ? args.map(function(arg) {\n    return toC(arg, argTypes[i++]);\n  }) : [];\n  var ret = fromC(func.apply(null, cArgs), returnType);\n  if (stack) Runtime.stackRestore(stack);\n  return ret;\n}\n\n// Returns a native JS wrapper for a C function. This is similar to ccall, but\n// returns a function you can call repeatedly in a normal way. For example:\n//\n//   var my_function = cwrap('my_c_function', 'number', ['number', 'number']);\n//   alert(my_function(5, 22));\n//   alert(my_function(99, 12));\n//\nfunction cwrap(ident, returnType, argTypes) {\n  var func = getCFunc(ident);\n  return function() {\n    return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments));\n  }\n}\nModule[\"cwrap\"] = cwrap;\n\n// Sets a value in memory in a dynamic way at run-time. Uses the\n// type data. This is the same as makeSetValue, except that\n// makeSetValue is done at compile-time and generates the needed\n// code then, whereas this function picks the right code at\n// run-time.\n// Note that setValue and getValue only do *aligned* writes and reads!\n// Note that ccall uses JS types as for defining types, while setValue and\n// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation\nfunction setValue(ptr, value, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': HEAP8[(ptr)]=value; break;\n      case 'i8': HEAP8[(ptr)]=value; break;\n      case 'i16': HEAP16[((ptr)>>1)]=value; break;\n      case 'i32': HEAP32[((ptr)>>2)]=value; break;\n      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;\n      case 'float': HEAPF32[((ptr)>>2)]=value; break;\n      case 'double': HEAPF64[((ptr)>>3)]=value; break;\n      default: abort('invalid type for setValue: ' + type);\n    }\n}\nModule['setValue'] = setValue;\n\n// Parallel to setValue.\nfunction getValue(ptr, type, noSafe) {\n  type = type || 'i8';\n  if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit\n    switch(type) {\n      case 'i1': return HEAP8[(ptr)];\n      case 'i8': return HEAP8[(ptr)];\n      case 'i16': return HEAP16[((ptr)>>1)];\n      case 'i32': return HEAP32[((ptr)>>2)];\n      case 'i64': return HEAP32[((ptr)>>2)];\n      case 'float': return HEAPF32[((ptr)>>2)];\n      case 'double': return HEAPF64[((ptr)>>3)];\n      default: abort('invalid type for setValue: ' + type);\n    }\n  return null;\n}\nModule['getValue'] = getValue;\n\nvar ALLOC_NORMAL = 0; // Tries to use _malloc()\nvar ALLOC_STACK = 1; // Lives for the duration of the current function call\nvar ALLOC_STATIC = 2; // Cannot be freed\nvar ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk\nvar ALLOC_NONE = 4; // Do not allocate\nModule['ALLOC_NORMAL'] = ALLOC_NORMAL;\nModule['ALLOC_STACK'] = ALLOC_STACK;\nModule['ALLOC_STATIC'] = ALLOC_STATIC;\nModule['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC;\nModule['ALLOC_NONE'] = ALLOC_NONE;\n\n// allocate(): This is for internal use. You can use it yourself as well, but the interface\n//             is a little tricky (see docs right below). The reason is that it is optimized\n//             for multiple syntaxes to save space in generated code. So you should\n//             normally not use allocate(), and instead allocate memory using _malloc(),\n//             initialize it with setValue(), and so forth.\n// @slab: An array of data, or a number. If a number, then the size of the block to allocate,\n//        in *bytes* (note that this is sometimes confusing: the next parameter does not\n//        affect this!)\n// @types: Either an array of types, one for each byte (or 0 if no type at that position),\n//         or a single type which is used for the entire block. This only matters if there\n//         is initial data - if @slab is a number, then this does not matter at all and is\n//         ignored.\n// @allocator: How to allocate memory, see ALLOC_*\nfunction allocate(slab, types, allocator, ptr) {\n  var zeroinit, size;\n  if (typeof slab === 'number') {\n    zeroinit = true;\n    size = slab;\n  } else {\n    zeroinit = false;\n    size = slab.length;\n  }\n\n  var singleType = typeof types === 'string' ? types : null;\n\n  var ret;\n  if (allocator == ALLOC_NONE) {\n    ret = ptr;\n  } else {\n    ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length));\n  }\n\n  if (zeroinit) {\n    var ptr = ret, stop;\n    assert((ret & 3) == 0);\n    stop = ret + (size & ~3);\n    for (; ptr < stop; ptr += 4) {\n      HEAP32[((ptr)>>2)]=0;\n    }\n    stop = ret + size;\n    while (ptr < stop) {\n      HEAP8[((ptr++)|0)]=0;\n    }\n    return ret;\n  }\n\n  if (singleType === 'i8') {\n    if (slab.subarray || slab.slice) {\n      HEAPU8.set(slab, ret);\n    } else {\n      HEAPU8.set(new Uint8Array(slab), ret);\n    }\n    return ret;\n  }\n\n  var i = 0, type, typeSize, previousType;\n  while (i < size) {\n    var curr = slab[i];\n\n    if (typeof curr === 'function') {\n      curr = Runtime.getFunctionIndex(curr);\n    }\n\n    type = singleType || types[i];\n    if (type === 0) {\n      i++;\n      continue;\n    }\n\n    if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later\n\n    setValue(ret+i, curr, type);\n\n    // no need to look up size unless type changes, so cache it\n    if (previousType !== type) {\n      typeSize = Runtime.getNativeTypeSize(type);\n      previousType = type;\n    }\n    i += typeSize;\n  }\n\n  return ret;\n}\nModule['allocate'] = allocate;\n\nfunction Pointer_stringify(ptr, /* optional */ length) {\n  // TODO: use TextDecoder\n  // Find the length, and check for UTF while doing so\n  var hasUtf = false;\n  var t;\n  var i = 0;\n  while (1) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    if (t >= 128) hasUtf = true;\n    else if (t == 0 && !length) break;\n    i++;\n    if (length && i == length) break;\n  }\n  if (!length) length = i;\n\n  var ret = '';\n\n  if (!hasUtf) {\n    var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack\n    var curr;\n    while (length > 0) {\n      curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));\n      ret = ret ? ret + curr : curr;\n      ptr += MAX_CHUNK;\n      length -= MAX_CHUNK;\n    }\n    return ret;\n  }\n\n  var utf8 = new Runtime.UTF8Processor();\n  for (i = 0; i < length; i++) {\n    t = HEAPU8[(((ptr)+(i))|0)];\n    ret += utf8.processCChar(t);\n  }\n  return ret;\n}\nModule['Pointer_stringify'] = Pointer_stringify;\n\n// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF16ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];\n    if (codeUnit == 0)\n      return str;\n    ++i;\n    // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.\n    str += String.fromCharCode(codeUnit);\n  }\n}\nModule['UTF16ToString'] = UTF16ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF16LE form. The copy will require at most (str.length*2+1)*2 bytes of space in the HEAP.\nfunction stringToUTF16(str, outPtr) {\n  for(var i = 0; i < str.length; ++i) {\n    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.\n    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate\n    HEAP16[(((outPtr)+(i*2))>>1)]=codeUnit;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP16[(((outPtr)+(str.length*2))>>1)]=0;\n}\nModule['stringToUTF16'] = stringToUTF16;\n\n// Given a pointer 'ptr' to a null-terminated UTF32LE-encoded string in the emscripten HEAP, returns\n// a copy of that string as a Javascript String object.\nfunction UTF32ToString(ptr) {\n  var i = 0;\n\n  var str = '';\n  while (1) {\n    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];\n    if (utf32 == 0)\n      return str;\n    ++i;\n    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.\n    if (utf32 >= 0x10000) {\n      var ch = utf32 - 0x10000;\n      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));\n    } else {\n      str += String.fromCharCode(utf32);\n    }\n  }\n}\nModule['UTF32ToString'] = UTF32ToString;\n\n// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',\n// null-terminated and encoded in UTF32LE form. The copy will require at most (str.length+1)*4 bytes of space in the HEAP,\n// but can use less, since str.length does not return the number of characters in the string, but the number of UTF-16 code units in the string.\nfunction stringToUTF32(str, outPtr) {\n  var iChar = 0;\n  for(var iCodeUnit = 0; iCodeUnit < str.length; ++iCodeUnit) {\n    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.\n    var codeUnit = str.charCodeAt(iCodeUnit); // possibly a lead surrogate\n    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {\n      var trailSurrogate = str.charCodeAt(++iCodeUnit);\n      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);\n    }\n    HEAP32[(((outPtr)+(iChar*4))>>2)]=codeUnit;\n    ++iChar;\n  }\n  // Null-terminate the pointer to the HEAP.\n  HEAP32[(((outPtr)+(iChar*4))>>2)]=0;\n}\nModule['stringToUTF32'] = stringToUTF32;\n\nfunction demangle(func) {\n  var i = 3;\n  // params, etc.\n  var basicTypes = {\n    'v': 'void',\n    'b': 'bool',\n    'c': 'char',\n    's': 'short',\n    'i': 'int',\n    'l': 'long',\n    'f': 'float',\n    'd': 'double',\n    'w': 'wchar_t',\n    'a': 'signed char',\n    'h': 'unsigned char',\n    't': 'unsigned short',\n    'j': 'unsigned int',\n    'm': 'unsigned long',\n    'x': 'long long',\n    'y': 'unsigned long long',\n    'z': '...'\n  };\n  var subs = [];\n  var first = true;\n  function dump(x) {\n    //return;\n    if (x) Module.print(x);\n    Module.print(func);\n    var pre = '';\n    for (var a = 0; a < i; a++) pre += ' ';\n    Module.print (pre + '^');\n  }\n  function parseNested() {\n    i++;\n    if (func[i] === 'K') i++; // ignore const\n    var parts = [];\n    while (func[i] !== 'E') {\n      if (func[i] === 'S') { // substitution\n        i++;\n        var next = func.indexOf('_', i);\n        var num = func.substring(i, next) || 0;\n        parts.push(subs[num] || '?');\n        i = next+1;\n        continue;\n      }\n      if (func[i] === 'C') { // constructor\n        parts.push(parts[parts.length-1]);\n        i += 2;\n        continue;\n      }\n      var size = parseInt(func.substr(i));\n      var pre = size.toString().length;\n      if (!size || !pre) { i--; break; } // counter i++ below us\n      var curr = func.substr(i + pre, size);\n      parts.push(curr);\n      subs.push(curr);\n      i += pre + size;\n    }\n    i++; // skip E\n    return parts;\n  }\n  function parse(rawList, limit, allowVoid) { // main parser\n    limit = limit || Infinity;\n    var ret = '', list = [];\n    function flushList() {\n      return '(' + list.join(', ') + ')';\n    }\n    var name;\n    if (func[i] === 'N') {\n      // namespaced N-E\n      name = parseNested().join('::');\n      limit--;\n      if (limit === 0) return rawList ? [name] : name;\n    } else {\n      // not namespaced\n      if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L'\n      var size = parseInt(func.substr(i));\n      if (size) {\n        var pre = size.toString().length;\n        name = func.substr(i + pre, size);\n        i += pre + size;\n      }\n    }\n    first = false;\n    if (func[i] === 'I') {\n      i++;\n      var iList = parse(true);\n      var iRet = parse(true, 1, true);\n      ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';\n    } else {\n      ret = name;\n    }\n    paramLoop: while (i < func.length && limit-- > 0) {\n      //dump('paramLoop');\n      var c = func[i++];\n      if (c in basicTypes) {\n        list.push(basicTypes[c]);\n      } else {\n        switch (c) {\n          case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer\n          case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference\n          case 'L': { // literal\n            i++; // skip basic type\n            var end = func.indexOf('E', i);\n            var size = end - i;\n            list.push(func.substr(i, size));\n            i += size + 2; // size + 'EE'\n            break;\n          }\n          case 'A': { // array\n            var size = parseInt(func.substr(i));\n            i += size.toString().length;\n            if (func[i] !== '_') throw '?';\n            i++; // skip _\n            list.push(parse(true, 1, true)[0] + ' [' + size + ']');\n            break;\n          }\n          case 'E': break paramLoop;\n          default: ret += '?' + c; break paramLoop;\n        }\n      }\n    }\n    if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)\n    return rawList ? list : ret + flushList();\n  }\n  try {\n    // Special-case the entry point, since its name differs from other name mangling.\n    if (func == 'Object._main' || func == '_main') {\n      return 'main()';\n    }\n    if (typeof func === 'number') func = Pointer_stringify(func);\n    if (func[0] !== '_') return func;\n    if (func[1] !== '_') return func; // C function\n    if (func[2] !== 'Z') return func;\n    switch (func[3]) {\n      case 'n': return 'operator new()';\n      case 'd': return 'operator delete()';\n    }\n    return parse();\n  } catch(e) {\n    return func;\n  }\n}\n\nfunction demangleAll(text) {\n  return text.replace(/__Z[\\w\\d_]+/g, function(x) { var y = demangle(x); return x === y ? x : (x + ' [' + y + ']') });\n}\n\nfunction stackTrace() {\n  var stack = new Error().stack;\n  return stack ? demangleAll(stack) : '(no stack trace available)'; // Stack trace is not available at least on IE10 and Safari 6.\n}\n\n// Memory management\n\nvar PAGE_SIZE = 4096;\nfunction alignMemoryPage(x) {\n  return (x+4095)&-4096;\n}\n\nvar HEAP;\nvar HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\nvar STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area\nvar STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area\nvar DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk\n\nfunction enlargeMemory() {\n  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 ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.');\n}\n\nvar TOTAL_STACK = Module['TOTAL_STACK'] || 5242880;\nvar TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216;\nvar FAST_MEMORY = Module['FAST_MEMORY'] || 2097152;\n\nvar totalMemory = 4096;\nwhile (totalMemory < TOTAL_MEMORY || totalMemory < 2*TOTAL_STACK) {\n  if (totalMemory < 16*1024*1024) {\n    totalMemory *= 2;\n  } else {\n    totalMemory += 16*1024*1024\n  }\n}\nif (totalMemory !== TOTAL_MEMORY) {\n  Module.printErr('increasing TOTAL_MEMORY to ' + totalMemory + ' to be more reasonable');\n  TOTAL_MEMORY = totalMemory;\n}\n\n// Initialize the runtime's memory\n// check for full engine support (use string 'subarray' to avoid closure compiler confusion)\nassert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']),\n       'JS engine does not provide full typed array support');\n\nvar buffer = new ArrayBuffer(TOTAL_MEMORY);\nHEAP8 = new Int8Array(buffer);\nHEAP16 = new Int16Array(buffer);\nHEAP32 = new Int32Array(buffer);\nHEAPU8 = new Uint8Array(buffer);\nHEAPU16 = new Uint16Array(buffer);\nHEAPU32 = new Uint32Array(buffer);\nHEAPF32 = new Float32Array(buffer);\nHEAPF64 = new Float64Array(buffer);\n\n// Endianness check (note: assumes compiler arch was little-endian)\nHEAP32[0] = 255;\nassert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system');\n\nModule['HEAP'] = HEAP;\nModule['HEAP8'] = HEAP8;\nModule['HEAP16'] = HEAP16;\nModule['HEAP32'] = HEAP32;\nModule['HEAPU8'] = HEAPU8;\nModule['HEAPU16'] = HEAPU16;\nModule['HEAPU32'] = HEAPU32;\nModule['HEAPF32'] = HEAPF32;\nModule['HEAPF64'] = HEAPF64;\n\nfunction callRuntimeCallbacks(callbacks) {\n  while(callbacks.length > 0) {\n    var callback = callbacks.shift();\n    if (typeof callback == 'function') {\n      callback();\n      continue;\n    }\n    var func = callback.func;\n    if (typeof func === 'number') {\n      if (callback.arg === undefined) {\n        Runtime.dynCall('v', func);\n      } else {\n        Runtime.dynCall('vi', func, [callback.arg]);\n      }\n    } else {\n      func(callback.arg === undefined ? null : callback.arg);\n    }\n  }\n}\n\nvar __ATPRERUN__  = []; // functions called before the runtime is initialized\nvar __ATINIT__    = []; // functions called during startup\nvar __ATMAIN__    = []; // functions called when main() is to be run\nvar __ATEXIT__    = []; // functions called during shutdown\nvar __ATPOSTRUN__ = []; // functions called after the runtime has exited\n\nvar runtimeInitialized = false;\n\nfunction preRun() {\n  // compatibility - merge in anything from Module['preRun'] at this time\n  if (Module['preRun']) {\n    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];\n    while (Module['preRun'].length) {\n      addOnPreRun(Module['preRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPRERUN__);\n}\n\nfunction ensureInitRuntime() {\n  if (runtimeInitialized) return;\n  runtimeInitialized = true;\n  callRuntimeCallbacks(__ATINIT__);\n}\n\nfunction preMain() {\n  callRuntimeCallbacks(__ATMAIN__);\n}\n\nfunction exitRuntime() {\n  callRuntimeCallbacks(__ATEXIT__);\n}\n\nfunction postRun() {\n  // compatibility - merge in anything from Module['postRun'] at this time\n  if (Module['postRun']) {\n    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];\n    while (Module['postRun'].length) {\n      addOnPostRun(Module['postRun'].shift());\n    }\n  }\n  callRuntimeCallbacks(__ATPOSTRUN__);\n}\n\nfunction addOnPreRun(cb) {\n  __ATPRERUN__.unshift(cb);\n}\nModule['addOnPreRun'] = Module.addOnPreRun = addOnPreRun;\n\nfunction addOnInit(cb) {\n  __ATINIT__.unshift(cb);\n}\nModule['addOnInit'] = Module.addOnInit = addOnInit;\n\nfunction addOnPreMain(cb) {\n  __ATMAIN__.unshift(cb);\n}\nModule['addOnPreMain'] = Module.addOnPreMain = addOnPreMain;\n\nfunction addOnExit(cb) {\n  __ATEXIT__.unshift(cb);\n}\nModule['addOnExit'] = Module.addOnExit = addOnExit;\n\nfunction addOnPostRun(cb) {\n  __ATPOSTRUN__.unshift(cb);\n}\nModule['addOnPostRun'] = Module.addOnPostRun = addOnPostRun;\n\n// Tools\n\n// This processes a JS string into a C-line array of numbers, 0-terminated.\n// For LLVM-originating strings, see parser.js:parseLLVMString function\nfunction intArrayFromString(stringy, dontAddNull, length /* optional */) {\n  var ret = (new Runtime.UTF8Processor()).processJSString(stringy);\n  if (length) {\n    ret.length = length;\n  }\n  if (!dontAddNull) {\n    ret.push(0);\n  }\n  return ret;\n}\nModule['intArrayFromString'] = intArrayFromString;\n\nfunction intArrayToString(array) {\n  var ret = [];\n  for (var i = 0; i < array.length; i++) {\n    var chr = array[i];\n    if (chr > 0xFF) {\n      chr &= 0xFF;\n    }\n    ret.push(String.fromCharCode(chr));\n  }\n  return ret.join('');\n}\nModule['intArrayToString'] = intArrayToString;\n\n// Write a Javascript array to somewhere in the heap\nfunction writeStringToMemory(string, buffer, dontAddNull) {\n  var array = intArrayFromString(string, dontAddNull);\n  var i = 0;\n  while (i < array.length) {\n    var chr = array[i];\n    HEAP8[(((buffer)+(i))|0)]=chr;\n    i = i + 1;\n  }\n}\nModule['writeStringToMemory'] = writeStringToMemory;\n\nfunction writeArrayToMemory(array, buffer) {\n  for (var i = 0; i < array.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=array[i];\n  }\n}\nModule['writeArrayToMemory'] = writeArrayToMemory;\n\nfunction writeAsciiToMemory(str, buffer, dontAddNull) {\n  for (var i = 0; i < str.length; i++) {\n    HEAP8[(((buffer)+(i))|0)]=str.charCodeAt(i);\n  }\n  if (!dontAddNull) HEAP8[(((buffer)+(str.length))|0)]=0;\n}\nModule['writeAsciiToMemory'] = writeAsciiToMemory;\n\nfunction unSign(value, bits, ignore) {\n  if (value >= 0) {\n    return value;\n  }\n  return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts\n                    : Math.pow(2, bits)         + value;\n}\nfunction reSign(value, bits, ignore) {\n  if (value <= 0) {\n    return value;\n  }\n  var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32\n                        : Math.pow(2, bits-1);\n  if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that\n                                                       // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors\n                                                       // TODO: In i64 mode 1, resign the two parts separately and safely\n    value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts\n  }\n  return value;\n}\n\n// check for imul support, and also for correctness ( https://bugs.webkit.org/show_bug.cgi?id=126345 )\nif (!Math['imul'] || Math['imul'](0xffffffff, 5) !== -5) Math['imul'] = function imul(a, b) {\n  var ah  = a >>> 16;\n  var al = a & 0xffff;\n  var bh  = b >>> 16;\n  var bl = b & 0xffff;\n  return (al*bl + ((ah*bl + al*bh) << 16))|0;\n};\nMath.imul = Math['imul'];\n\n\nvar Math_abs = Math.abs;\nvar Math_cos = Math.cos;\nvar Math_sin = Math.sin;\nvar Math_tan = Math.tan;\nvar Math_acos = Math.acos;\nvar Math_asin = Math.asin;\nvar Math_atan = Math.atan;\nvar Math_atan2 = Math.atan2;\nvar Math_exp = Math.exp;\nvar Math_log = Math.log;\nvar Math_sqrt = Math.sqrt;\nvar Math_ceil = Math.ceil;\nvar Math_floor = Math.floor;\nvar Math_pow = Math.pow;\nvar Math_imul = Math.imul;\nvar Math_fround = Math.fround;\nvar Math_min = Math.min;\n\n// A counter of dependencies for calling run(). If we need to\n// do asynchronous work before running, increment this and\n// decrement it. Incrementing must happen in a place like\n// PRE_RUN_ADDITIONS (used by emcc to add file preloading).\n// Note that you can add dependencies in preRun, even though\n// it happens right before run - run will be postponed until\n// the dependencies are met.\nvar runDependencies = 0;\nvar runDependencyWatcher = null;\nvar dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled\n\nfunction addRunDependency(id) {\n  runDependencies++;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n}\nModule['addRunDependency'] = addRunDependency;\nfunction removeRunDependency(id) {\n  runDependencies--;\n  if (Module['monitorRunDependencies']) {\n    Module['monitorRunDependencies'](runDependencies);\n  }\n  if (runDependencies == 0) {\n    if (runDependencyWatcher !== null) {\n      clearInterval(runDependencyWatcher);\n      runDependencyWatcher = null;\n    }\n    if (dependenciesFulfilled) {\n      var callback = dependenciesFulfilled;\n      dependenciesFulfilled = null;\n      callback(); // can add another dependenciesFulfilled\n    }\n  }\n}\nModule['removeRunDependency'] = removeRunDependency;\n\nModule[\"preloadedImages\"] = {}; // maps url to image data\nModule[\"preloadedAudios\"] = {}; // maps url to audio data\n\n\nvar memoryInitializer = null;\n\n// === Body ===\n\n\n\n\n\nSTATIC_BASE = 8;\n\nSTATICTOP = STATIC_BASE + Runtime.alignMemory(283);\n/* global initializers */ __ATINIT__.push();\n\n\n/* memory initializer */ allocate([32,69,114,114,111,114,32,105,110,32,84,111,119,101,114,115,58,32,37,115,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,117,116,32,111,102,32,115,112,97,99,101,32,32,32,0,100,105,115,99,32,115,105,122,101,32,101,114,114,111,114,0,110,111,116,104,105,110,103,32,116,111,32,112,111,112,32,0,0,0,0,0,0,0,0,0,32,69,114,114,111,114,32,105,110,32,84,111,119,101,114,115,46,0,0,0,0,0,0,0], \"i8\", ALLOC_NONE, Runtime.GLOBAL_BASE);\n\n\n\n\nvar tempDoublePtr = Runtime.alignMemory(allocate(12, \"i8\", ALLOC_STATIC), 8);\n\nassert(tempDoublePtr % 8 == 0);\n\nfunction copyTempFloat(ptr) { // functions, because inlining this code increases code size too much\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n}\n\nfunction copyTempDouble(ptr) {\n\n  HEAP8[tempDoublePtr] = HEAP8[ptr];\n\n  HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];\n\n  HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];\n\n  HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];\n\n  HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];\n\n  HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];\n\n  HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];\n\n  HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];\n\n}\n\n\n  function _llvm_lifetime_end() {}\n\n  function _malloc(bytes) {\n      /* Over-allocate to make sure it is byte-aligned by 8.\n       * This will leak memory, but this is only the dummy\n       * implementation (replaced by dlmalloc normally) so\n       * not an issue.\n       */\n      var ptr = Runtime.dynamicAlloc(bytes + 8);\n      return (ptr+8) & 0xFFFFFFF8;\n    }\n  Module[\"_malloc\"] = _malloc;\n\n  \n  \n  \n  \n  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};\n  \n  var ERRNO_MESSAGES={0:\"Success\",1:\"Not super-user\",2:\"No such file or directory\",3:\"No such process\",4:\"Interrupted system call\",5:\"I/O error\",6:\"No such device or address\",7:\"Arg list too long\",8:\"Exec format error\",9:\"Bad file number\",10:\"No children\",11:\"No more processes\",12:\"Not enough core\",13:\"Permission denied\",14:\"Bad address\",15:\"Block device required\",16:\"Mount device busy\",17:\"File exists\",18:\"Cross-device link\",19:\"No such device\",20:\"Not a directory\",21:\"Is a directory\",22:\"Invalid argument\",23:\"Too many open files in system\",24:\"Too many open files\",25:\"Not a typewriter\",26:\"Text file busy\",27:\"File too large\",28:\"No space left on device\",29:\"Illegal seek\",30:\"Read only file system\",31:\"Too many links\",32:\"Broken pipe\",33:\"Math arg out of domain of func\",34:\"Math result not representable\",35:\"File locking deadlock error\",36:\"File or path name too long\",37:\"No record locks available\",38:\"Function not implemented\",39:\"Directory not empty\",40:\"Too many symbolic links\",42:\"No message of desired type\",43:\"Identifier removed\",44:\"Channel number out of range\",45:\"Level 2 not synchronized\",46:\"Level 3 halted\",47:\"Level 3 reset\",48:\"Link number out of range\",49:\"Protocol driver not attached\",50:\"No CSI structure available\",51:\"Level 2 halted\",52:\"Invalid exchange\",53:\"Invalid request descriptor\",54:\"Exchange full\",55:\"No anode\",56:\"Invalid request code\",57:\"Invalid slot\",59:\"Bad font file fmt\",60:\"Device not a stream\",61:\"No data (for no delay io)\",62:\"Timer expired\",63:\"Out of streams resources\",64:\"Machine is not on the network\",65:\"Package not installed\",66:\"The object is remote\",67:\"The link has been severed\",68:\"Advertise error\",69:\"Srmount error\",70:\"Communication error on send\",71:\"Protocol error\",72:\"Multihop attempted\",73:\"Cross mount point (not really error)\",74:\"Trying to read unreadable message\",75:\"Value too large for defined data type\",76:\"Given log. name not unique\",77:\"f.d. invalid for this operation\",78:\"Remote address changed\",79:\"Can   access a needed shared lib\",80:\"Accessing a corrupted shared lib\",81:\".lib section in a.out corrupted\",82:\"Attempting to link in too many libs\",83:\"Attempting to exec a shared library\",84:\"Illegal byte sequence\",86:\"Streams pipe error\",87:\"Too many users\",88:\"Socket operation on non-socket\",89:\"Destination address required\",90:\"Message too long\",91:\"Protocol wrong type for socket\",92:\"Protocol not available\",93:\"Unknown protocol\",94:\"Socket type not supported\",95:\"Not supported\",96:\"Protocol family not supported\",97:\"Address family not supported by protocol family\",98:\"Address already in use\",99:\"Address not available\",100:\"Network interface is not configured\",101:\"Network is unreachable\",102:\"Connection reset by network\",103:\"Connection aborted\",104:\"Connection reset by peer\",105:\"No buffer space available\",106:\"Socket is already connected\",107:\"Socket is not connected\",108:\"Can't send after socket shutdown\",109:\"Too many references\",110:\"Connection timed out\",111:\"Connection refused\",112:\"Host is down\",113:\"Host is unreachable\",114:\"Socket already connected\",115:\"Connection already in progress\",116:\"Stale file handle\",122:\"Quota exceeded\",123:\"No medium (in tape drive)\",125:\"Operation canceled\",130:\"Previous owner died\",131:\"State not recoverable\"};\n  \n  \n  var ___errno_state=0;function ___setErrNo(value) {\n      // For convenient setting and returning of errno.\n      HEAP32[((___errno_state)>>2)]=value;\n      return value;\n    }\n  \n  var PATH={splitPath:function (filename) {\n        var splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\n        return splitPathRe.exec(filename).slice(1);\n      },normalizeArray:function (parts, allowAboveRoot) {\n        // if the path tries to go above the root, `up` ends up > 0\n        var up = 0;\n        for (var i = parts.length - 1; i >= 0; i--) {\n          var last = parts[i];\n          if (last === '.') {\n            parts.splice(i, 1);\n          } else if (last === '..') {\n            parts.splice(i, 1);\n            up++;\n          } else if (up) {\n            parts.splice(i, 1);\n            up--;\n          }\n        }\n        // if the path is allowed to go above the root, restore leading ..s\n        if (allowAboveRoot) {\n          for (; up--; up) {\n            parts.unshift('..');\n          }\n        }\n        return parts;\n      },normalize:function (path) {\n        var isAbsolute = path.charAt(0) === '/',\n            trailingSlash = path.substr(-1) === '/';\n        // Normalize the path\n        path = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), !isAbsolute).join('/');\n        if (!path && !isAbsolute) {\n          path = '.';\n        }\n        if (path && trailingSlash) {\n          path += '/';\n        }\n        return (isAbsolute ? '/' : '') + path;\n      },dirname:function (path) {\n        var result = PATH.splitPath(path),\n            root = result[0],\n            dir = result[1];\n        if (!root && !dir) {\n          // No dirname whatsoever\n          return '.';\n        }\n        if (dir) {\n          // It has a dirname, strip trailing slash\n          dir = dir.substr(0, dir.length - 1);\n        }\n        return root + dir;\n      },basename:function (path) {\n        // EMSCRIPTEN return '/'' for '/', not an empty string\n        if (path === '/') return '/';\n        var lastSlash = path.lastIndexOf('/');\n        if (lastSlash === -1) return path;\n        return path.substr(lastSlash+1);\n      },extname:function (path) {\n        return PATH.splitPath(path)[3];\n      },join:function () {\n        var paths = Array.prototype.slice.call(arguments, 0);\n        return PATH.normalize(paths.join('/'));\n      },join2:function (l, r) {\n        return PATH.normalize(l + '/' + r);\n      },resolve:function () {\n        var resolvedPath = '',\n          resolvedAbsolute = false;\n        for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n          var path = (i >= 0) ? arguments[i] : FS.cwd();\n          // Skip empty and invalid entries\n          if (typeof path !== 'string') {\n            throw new TypeError('Arguments to path.resolve must be strings');\n          } else if (!path) {\n            continue;\n          }\n          resolvedPath = path + '/' + resolvedPath;\n          resolvedAbsolute = path.charAt(0) === '/';\n        }\n        // At this point the path should be resolved to a full absolute path, but\n        // handle relative paths to be safe (might happen when process.cwd() fails)\n        resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) {\n          return !!p;\n        }), !resolvedAbsolute).join('/');\n        return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n      },relative:function (from, to) {\n        from = PATH.resolve(from).substr(1);\n        to = PATH.resolve(to).substr(1);\n        function trim(arr) {\n          var start = 0;\n          for (; start < arr.length; start++) {\n            if (arr[start] !== '') break;\n          }\n          var end = arr.length - 1;\n          for (; end >= 0; end--) {\n            if (arr[end] !== '') break;\n          }\n          if (start > end) return [];\n          return arr.slice(start, end - start + 1);\n        }\n        var fromParts = trim(from.split('/'));\n        var toParts = trim(to.split('/'));\n        var length = Math.min(fromParts.length, toParts.length);\n        var samePartsLength = length;\n        for (var i = 0; i < length; i++) {\n          if (fromParts[i] !== toParts[i]) {\n            samePartsLength = i;\n            break;\n          }\n        }\n        var outputParts = [];\n        for (var i = samePartsLength; i < fromParts.length; i++) {\n          outputParts.push('..');\n        }\n        outputParts = outputParts.concat(toParts.slice(samePartsLength));\n        return outputParts.join('/');\n      }};\n  \n  var TTY={ttys:[],init:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // currently, FS.init does not distinguish if process.stdin is a file or TTY\n        //   // device, it always assumes it's a TTY device. because of this, we're forcing\n        //   // process.stdin to UTF8 encoding to at least make stdin reading compatible\n        //   // with text files until FS.init can be refactored.\n        //   process['stdin']['setEncoding']('utf8');\n        // }\n      },shutdown:function () {\n        // https://github.com/kripken/emscripten/pull/1555\n        // if (ENVIRONMENT_IS_NODE) {\n        //   // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)?\n        //   // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation\n        //   // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists?\n        //   // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle\n        //   // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call\n        //   process['stdin']['pause']();\n        // }\n      },register:function (dev, ops) {\n        TTY.ttys[dev] = { input: [], output: [], ops: ops };\n        FS.registerDevice(dev, TTY.stream_ops);\n      },stream_ops:{open:function (stream) {\n          var tty = TTY.ttys[stream.node.rdev];\n          if (!tty) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          stream.tty = tty;\n          stream.seekable = false;\n        },close:function (stream) {\n          // flush any pending line data\n          if (stream.tty.output.length) {\n            stream.tty.ops.put_char(stream.tty, 10);\n          }\n        },read:function (stream, buffer, offset, length, pos /* ignored */) {\n          if (!stream.tty || !stream.tty.ops.get_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          var bytesRead = 0;\n          for (var i = 0; i < length; i++) {\n            var result;\n            try {\n              result = stream.tty.ops.get_char(stream.tty);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            if (result === undefined && bytesRead === 0) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n            if (result === null || result === undefined) break;\n            bytesRead++;\n            buffer[offset+i] = result;\n          }\n          if (bytesRead) {\n            stream.node.timestamp = Date.now();\n          }\n          return bytesRead;\n        },write:function (stream, buffer, offset, length, pos) {\n          if (!stream.tty || !stream.tty.ops.put_char) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENXIO);\n          }\n          for (var i = 0; i < length; i++) {\n            try {\n              stream.tty.ops.put_char(stream.tty, buffer[offset+i]);\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n          }\n          if (length) {\n            stream.node.timestamp = Date.now();\n          }\n          return i;\n        }},default_tty_ops:{get_char:function (tty) {\n          if (!tty.input.length) {\n            var result = null;\n            if (ENVIRONMENT_IS_NODE) {\n              result = process['stdin']['read']();\n              if (!result) {\n                if (process['stdin']['_readableState'] && process['stdin']['_readableState']['ended']) {\n                  return null;  // EOF\n                }\n                return undefined;  // no data available\n              }\n            } else if (typeof window != 'undefined' &&\n              typeof window.prompt == 'function') {\n              // Browser.\n              result = window.prompt('Input: ');  // returns null on cancel\n              if (result !== null) {\n                result += '\\n';\n              }\n            } else if (typeof readline == 'function') {\n              // Command line.\n              result = readline();\n              if (result !== null) {\n                result += '\\n';\n              }\n            }\n            if (!result) {\n              return null;\n            }\n            tty.input = intArrayFromString(result, true);\n          }\n          return tty.input.shift();\n        },put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['print'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }},default_tty1_ops:{put_char:function (tty, val) {\n          if (val === null || val === 10) {\n            Module['printErr'](tty.output.join(''));\n            tty.output = [];\n          } else {\n            tty.output.push(TTY.utf8.processCChar(val));\n          }\n        }}};\n  \n  var MEMFS={ops_table:null,CONTENT_OWNING:1,CONTENT_FLEXIBLE:2,CONTENT_FIXED:3,mount:function (mount) {\n        return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {\n          // no supported\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (!MEMFS.ops_table) {\n          MEMFS.ops_table = {\n            dir: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                lookup: MEMFS.node_ops.lookup,\n                mknod: MEMFS.node_ops.mknod,\n                rename: MEMFS.node_ops.rename,\n                unlink: MEMFS.node_ops.unlink,\n                rmdir: MEMFS.node_ops.rmdir,\n                readdir: MEMFS.node_ops.readdir,\n                symlink: MEMFS.node_ops.symlink\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek\n              }\n            },\n            file: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: {\n                llseek: MEMFS.stream_ops.llseek,\n                read: MEMFS.stream_ops.read,\n                write: MEMFS.stream_ops.write,\n                allocate: MEMFS.stream_ops.allocate,\n                mmap: MEMFS.stream_ops.mmap\n              }\n            },\n            link: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr,\n                readlink: MEMFS.node_ops.readlink\n              },\n              stream: {}\n            },\n            chrdev: {\n              node: {\n                getattr: MEMFS.node_ops.getattr,\n                setattr: MEMFS.node_ops.setattr\n              },\n              stream: FS.chrdev_stream_ops\n            },\n          };\n        }\n        var node = FS.createNode(parent, name, mode, dev);\n        if (FS.isDir(node.mode)) {\n          node.node_ops = MEMFS.ops_table.dir.node;\n          node.stream_ops = MEMFS.ops_table.dir.stream;\n          node.contents = {};\n        } else if (FS.isFile(node.mode)) {\n          node.node_ops = MEMFS.ops_table.file.node;\n          node.stream_ops = MEMFS.ops_table.file.stream;\n          node.contents = [];\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        } else if (FS.isLink(node.mode)) {\n          node.node_ops = MEMFS.ops_table.link.node;\n          node.stream_ops = MEMFS.ops_table.link.stream;\n        } else if (FS.isChrdev(node.mode)) {\n          node.node_ops = MEMFS.ops_table.chrdev.node;\n          node.stream_ops = MEMFS.ops_table.chrdev.stream;\n        }\n        node.timestamp = Date.now();\n        // add the new node to the parent\n        if (parent) {\n          parent.contents[name] = node;\n        }\n        return node;\n      },ensureFlexible:function (node) {\n        if (node.contentMode !== MEMFS.CONTENT_FLEXIBLE) {\n          var contents = node.contents;\n          node.contents = Array.prototype.slice.call(contents);\n          node.contentMode = MEMFS.CONTENT_FLEXIBLE;\n        }\n      },node_ops:{getattr:function (node) {\n          var attr = {};\n          // device numbers reuse inode numbers.\n          attr.dev = FS.isChrdev(node.mode) ? node.id : 1;\n          attr.ino = node.id;\n          attr.mode = node.mode;\n          attr.nlink = 1;\n          attr.uid = 0;\n          attr.gid = 0;\n          attr.rdev = node.rdev;\n          if (FS.isDir(node.mode)) {\n            attr.size = 4096;\n          } else if (FS.isFile(node.mode)) {\n            attr.size = node.contents.length;\n          } else if (FS.isLink(node.mode)) {\n            attr.size = node.link.length;\n          } else {\n            attr.size = 0;\n          }\n          attr.atime = new Date(node.timestamp);\n          attr.mtime = new Date(node.timestamp);\n          attr.ctime = new Date(node.timestamp);\n          // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize),\n          //       but this is not required by the standard.\n          attr.blksize = 4096;\n          attr.blocks = Math.ceil(attr.size / attr.blksize);\n          return attr;\n        },setattr:function (node, attr) {\n          if (attr.mode !== undefined) {\n            node.mode = attr.mode;\n          }\n          if (attr.timestamp !== undefined) {\n            node.timestamp = attr.timestamp;\n          }\n          if (attr.size !== undefined) {\n            MEMFS.ensureFlexible(node);\n            var contents = node.contents;\n            if (attr.size < contents.length) contents.length = attr.size;\n            else while (attr.size > contents.length) contents.push(0);\n          }\n        },lookup:function (parent, name) {\n          throw FS.genericErrors[ERRNO_CODES.ENOENT];\n        },mknod:function (parent, name, mode, dev) {\n          return MEMFS.createNode(parent, name, mode, dev);\n        },rename:function (old_node, new_dir, new_name) {\n          // if we're overwriting a directory at new_name, make sure it's empty.\n          if (FS.isDir(old_node.mode)) {\n            var new_node;\n            try {\n              new_node = FS.lookupNode(new_dir, new_name);\n            } catch (e) {\n            }\n            if (new_node) {\n              for (var i in new_node.contents) {\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n              }\n            }\n          }\n          // do the internal rewiring\n          delete old_node.parent.contents[old_node.name];\n          old_node.name = new_name;\n          new_dir.contents[new_name] = old_node;\n          old_node.parent = new_dir;\n        },unlink:function (parent, name) {\n          delete parent.contents[name];\n        },rmdir:function (parent, name) {\n          var node = FS.lookupNode(parent, name);\n          for (var i in node.contents) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n          }\n          delete parent.contents[name];\n        },readdir:function (node) {\n          var entries = ['.', '..']\n          for (var key in node.contents) {\n            if (!node.contents.hasOwnProperty(key)) {\n              continue;\n            }\n            entries.push(key);\n          }\n          return entries;\n        },symlink:function (parent, newname, oldpath) {\n          var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0);\n          node.link = oldpath;\n          return node;\n        },readlink:function (node) {\n          if (!FS.isLink(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          return node.link;\n        }},stream_ops:{read:function (stream, buffer, offset, length, position) {\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (size > 8 && contents.subarray) { // non-trivial, and typed array\n            buffer.set(contents.subarray(position, position + size), offset);\n          } else\n          {\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          }\n          return size;\n        },write:function (stream, buffer, offset, length, position, canOwn) {\n          var node = stream.node;\n          node.timestamp = Date.now();\n          var contents = node.contents;\n          if (length && contents.length === 0 && position === 0 && buffer.subarray) {\n            // just replace it with the new data\n            if (canOwn && offset === 0) {\n              node.contents = buffer; // this could be a subarray of Emscripten HEAP, or allocated from some other source.\n              node.contentMode = (buffer.buffer === HEAP8.buffer) ? MEMFS.CONTENT_OWNING : MEMFS.CONTENT_FIXED;\n            } else {\n              node.contents = new Uint8Array(buffer.subarray(offset, offset+length));\n              node.contentMode = MEMFS.CONTENT_FIXED;\n            }\n            return length;\n          }\n          MEMFS.ensureFlexible(node);\n          var contents = node.contents;\n          while (contents.length < position) contents.push(0);\n          for (var i = 0; i < length; i++) {\n            contents[position + i] = buffer[offset + i];\n          }\n          return length;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              position += stream.node.contents.length;\n            }\n          }\n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          stream.ungotten = [];\n          stream.position = position;\n          return position;\n        },allocate:function (stream, offset, length) {\n          MEMFS.ensureFlexible(stream.node);\n          var contents = stream.node.contents;\n          var limit = offset + length;\n          while (limit > contents.length) contents.push(0);\n        },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n          if (!FS.isFile(stream.node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n          }\n          var ptr;\n          var allocated;\n          var contents = stream.node.contents;\n          // Only make a new copy when MAP_PRIVATE is specified.\n          if ( !(flags & 2) &&\n                (contents.buffer === buffer || contents.buffer === buffer.buffer) ) {\n            // We can't emulate MAP_SHARED when the file is not backed by the buffer\n            // we're mapping to (e.g. the HEAP buffer).\n            allocated = false;\n            ptr = contents.byteOffset;\n          } else {\n            // Try to avoid unnecessary slices.\n            if (position > 0 || position + length < contents.length) {\n              if (contents.subarray) {\n                contents = contents.subarray(position, position + length);\n              } else {\n                contents = Array.prototype.slice.call(contents, position, position + length);\n              }\n            }\n            allocated = true;\n            ptr = _malloc(length);\n            if (!ptr) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);\n            }\n            buffer.set(contents, ptr);\n          }\n          return { ptr: ptr, allocated: allocated };\n        }}};\n  \n  var IDBFS={dbs:{},indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_VERSION:21,DB_STORE_NAME:\"FILE_DATA\",mount:function (mount) {\n        // reuse all of the core MEMFS functionality\n        return MEMFS.mount.apply(null, arguments);\n      },syncfs:function (mount, populate, callback) {\n        IDBFS.getLocalSet(mount, function(err, local) {\n          if (err) return callback(err);\n  \n          IDBFS.getRemoteSet(mount, function(err, remote) {\n            if (err) return callback(err);\n  \n            var src = populate ? remote : local;\n            var dst = populate ? local : remote;\n  \n            IDBFS.reconcile(src, dst, callback);\n          });\n        });\n      },getDB:function (name, callback) {\n        // check the cache first\n        var db = IDBFS.dbs[name];\n        if (db) {\n          return callback(null, db);\n        }\n  \n        var req;\n        try {\n          req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);\n        } catch (e) {\n          return callback(e);\n        }\n        req.onupgradeneeded = function(e) {\n          var db = e.target.result;\n          var transaction = e.target.transaction;\n  \n          var fileStore;\n  \n          if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {\n            fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          } else {\n            fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);\n          }\n  \n          fileStore.createIndex('timestamp', 'timestamp', { unique: false });\n        };\n        req.onsuccess = function() {\n          db = req.result;\n  \n          // add to the cache\n          IDBFS.dbs[name] = db;\n          callback(null, db);\n        };\n        req.onerror = function() {\n          callback(this.error);\n        };\n      },getLocalSet:function (mount, callback) {\n        var entries = {};\n  \n        function isRealDir(p) {\n          return p !== '.' && p !== '..';\n        };\n        function toAbsolute(root) {\n          return function(p) {\n            return PATH.join2(root, p);\n          }\n        };\n  \n        var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));\n  \n        while (check.length) {\n          var path = check.pop();\n          var stat;\n  \n          try {\n            stat = FS.stat(path);\n          } catch (e) {\n            return callback(e);\n          }\n  \n          if (FS.isDir(stat.mode)) {\n            check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));\n          }\n  \n          entries[path] = { timestamp: stat.mtime };\n        }\n  \n        return callback(null, { type: 'local', entries: entries });\n      },getRemoteSet:function (mount, callback) {\n        var entries = {};\n  \n        IDBFS.getDB(mount.mountpoint, function(err, db) {\n          if (err) return callback(err);\n  \n          var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly');\n          transaction.onerror = function() { callback(this.error); };\n  \n          var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n          var index = store.index('timestamp');\n  \n          index.openKeyCursor().onsuccess = function(event) {\n            var cursor = event.target.result;\n  \n            if (!cursor) {\n              return callback(null, { type: 'remote', db: db, entries: entries });\n            }\n  \n            entries[cursor.primaryKey] = { timestamp: cursor.key };\n  \n            cursor.continue();\n          };\n        });\n      },loadLocalEntry:function (path, callback) {\n        var stat, node;\n  \n        try {\n          var lookup = FS.lookupPath(path);\n          node = lookup.node;\n          stat = FS.stat(path);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        if (FS.isDir(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode });\n        } else if (FS.isFile(stat.mode)) {\n          return callback(null, { timestamp: stat.mtime, mode: stat.mode, contents: node.contents });\n        } else {\n          return callback(new Error('node type not supported'));\n        }\n      },storeLocalEntry:function (path, entry, callback) {\n        try {\n          if (FS.isDir(entry.mode)) {\n            FS.mkdir(path, entry.mode);\n          } else if (FS.isFile(entry.mode)) {\n            FS.writeFile(path, entry.contents, { encoding: 'binary', canOwn: true });\n          } else {\n            return callback(new Error('node type not supported'));\n          }\n  \n          FS.utime(path, entry.timestamp, entry.timestamp);\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },removeLocalEntry:function (path, callback) {\n        try {\n          var lookup = FS.lookupPath(path);\n          var stat = FS.stat(path);\n  \n          if (FS.isDir(stat.mode)) {\n            FS.rmdir(path);\n          } else if (FS.isFile(stat.mode)) {\n            FS.unlink(path);\n          }\n        } catch (e) {\n          return callback(e);\n        }\n  \n        callback(null);\n      },loadRemoteEntry:function (store, path, callback) {\n        var req = store.get(path);\n        req.onsuccess = function(event) { callback(null, event.target.result); };\n        req.onerror = function() { callback(this.error); };\n      },storeRemoteEntry:function (store, path, entry, callback) {\n        var req = store.put(entry, path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },removeRemoteEntry:function (store, path, callback) {\n        var req = store.delete(path);\n        req.onsuccess = function() { callback(null); };\n        req.onerror = function() { callback(this.error); };\n      },reconcile:function (src, dst, callback) {\n        var total = 0;\n  \n        var create = [];\n        Object.keys(src.entries).forEach(function (key) {\n          var e = src.entries[key];\n          var e2 = dst.entries[key];\n          if (!e2 || e.timestamp > e2.timestamp) {\n            create.push(key);\n            total++;\n          }\n        });\n  \n        var remove = [];\n        Object.keys(dst.entries).forEach(function (key) {\n          var e = dst.entries[key];\n          var e2 = src.entries[key];\n          if (!e2) {\n            remove.push(key);\n            total++;\n          }\n        });\n  \n        if (!total) {\n          return callback(null);\n        }\n  \n        var errored = false;\n        var completed = 0;\n        var db = src.type === 'remote' ? src.db : dst.db;\n        var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite');\n        var store = transaction.objectStore(IDBFS.DB_STORE_NAME);\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= total) {\n            return callback(null);\n          }\n        };\n  \n        transaction.onerror = function() { done(this.error); };\n  \n        // sort paths in ascending order so directory entries are created\n        // before the files inside them\n        create.sort().forEach(function (path) {\n          if (dst.type === 'local') {\n            IDBFS.loadRemoteEntry(store, path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeLocalEntry(path, entry, done);\n            });\n          } else {\n            IDBFS.loadLocalEntry(path, function (err, entry) {\n              if (err) return done(err);\n              IDBFS.storeRemoteEntry(store, path, entry, done);\n            });\n          }\n        });\n  \n        // sort paths in descending order so files are deleted before their\n        // parent directories\n        remove.sort().reverse().forEach(function(path) {\n          if (dst.type === 'local') {\n            IDBFS.removeLocalEntry(path, done);\n          } else {\n            IDBFS.removeRemoteEntry(store, path, done);\n          }\n        });\n      }};\n  \n  var NODEFS={isWindows:false,staticInit:function () {\n        NODEFS.isWindows = !!process.platform.match(/^win/);\n      },mount:function (mount) {\n        assert(ENVIRONMENT_IS_NODE);\n        return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0);\n      },createNode:function (parent, name, mode, dev) {\n        if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node = FS.createNode(parent, name, mode);\n        node.node_ops = NODEFS.node_ops;\n        node.stream_ops = NODEFS.stream_ops;\n        return node;\n      },getMode:function (path) {\n        var stat;\n        try {\n          stat = fs.lstatSync(path);\n          if (NODEFS.isWindows) {\n            // On Windows, directories return permission bits 'rw-rw-rw-', even though they have 'rwxrwxrwx', so \n            // propagate write bits to execute bits.\n            stat.mode = stat.mode | ((stat.mode & 146) >> 1);\n          }\n        } catch (e) {\n          if (!e.code) throw e;\n          throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n        }\n        return stat.mode;\n      },realPath:function (node) {\n        var parts = [];\n        while (node.parent !== node) {\n          parts.push(node.name);\n          node = node.parent;\n        }\n        parts.push(node.mount.opts.root);\n        parts.reverse();\n        return PATH.join.apply(null, parts);\n      },flagsToPermissionStringMap:{0:\"r\",1:\"r+\",2:\"r+\",64:\"r\",65:\"r+\",66:\"r+\",129:\"rx+\",193:\"rx+\",514:\"w+\",577:\"w\",578:\"w+\",705:\"wx\",706:\"wx+\",1024:\"a\",1025:\"a\",1026:\"a+\",1089:\"a\",1090:\"a+\",1153:\"ax\",1154:\"ax+\",1217:\"ax\",1218:\"ax+\",4096:\"rs\",4098:\"rs+\"},flagsToPermissionString:function (flags) {\n        if (flags in NODEFS.flagsToPermissionStringMap) {\n          return NODEFS.flagsToPermissionStringMap[flags];\n        } else {\n          return flags;\n        }\n      },node_ops:{getattr:function (node) {\n          var path = NODEFS.realPath(node);\n          var stat;\n          try {\n            stat = fs.lstatSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          // node.js v0.10.20 doesn't report blksize and blocks on Windows. Fake them with default blksize of 4096.\n          // See http://support.microsoft.com/kb/140365\n          if (NODEFS.isWindows && !stat.blksize) {\n            stat.blksize = 4096;\n          }\n          if (NODEFS.isWindows && !stat.blocks) {\n            stat.blocks = (stat.size+stat.blksize-1)/stat.blksize|0;\n          }\n          return {\n            dev: stat.dev,\n            ino: stat.ino,\n            mode: stat.mode,\n            nlink: stat.nlink,\n            uid: stat.uid,\n            gid: stat.gid,\n            rdev: stat.rdev,\n            size: stat.size,\n            atime: stat.atime,\n            mtime: stat.mtime,\n            ctime: stat.ctime,\n            blksize: stat.blksize,\n            blocks: stat.blocks\n          };\n        },setattr:function (node, attr) {\n          var path = NODEFS.realPath(node);\n          try {\n            if (attr.mode !== undefined) {\n              fs.chmodSync(path, attr.mode);\n              // update the common node structure mode as well\n              node.mode = attr.mode;\n            }\n            if (attr.timestamp !== undefined) {\n              var date = new Date(attr.timestamp);\n              fs.utimesSync(path, date, date);\n            }\n            if (attr.size !== undefined) {\n              fs.truncateSync(path, attr.size);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },lookup:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          var mode = NODEFS.getMode(path);\n          return NODEFS.createNode(parent, name, mode);\n        },mknod:function (parent, name, mode, dev) {\n          var node = NODEFS.createNode(parent, name, mode, dev);\n          // create the backing node for this in the fs root as well\n          var path = NODEFS.realPath(node);\n          try {\n            if (FS.isDir(node.mode)) {\n              fs.mkdirSync(path, node.mode);\n            } else {\n              fs.writeFileSync(path, '', { mode: node.mode });\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return node;\n        },rename:function (oldNode, newDir, newName) {\n          var oldPath = NODEFS.realPath(oldNode);\n          var newPath = PATH.join2(NODEFS.realPath(newDir), newName);\n          try {\n            fs.renameSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },unlink:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.unlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },rmdir:function (parent, name) {\n          var path = PATH.join2(NODEFS.realPath(parent), name);\n          try {\n            fs.rmdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readdir:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readdirSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },symlink:function (parent, newName, oldPath) {\n          var newPath = PATH.join2(NODEFS.realPath(parent), newName);\n          try {\n            fs.symlinkSync(oldPath, newPath);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },readlink:function (node) {\n          var path = NODEFS.realPath(node);\n          try {\n            return fs.readlinkSync(path);\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        }},stream_ops:{open:function (stream) {\n          var path = NODEFS.realPath(stream.node);\n          try {\n            if (FS.isFile(stream.node.mode)) {\n              stream.nfd = fs.openSync(path, NODEFS.flagsToPermissionString(stream.flags));\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },close:function (stream) {\n          try {\n            if (FS.isFile(stream.node.mode) && stream.nfd) {\n              fs.closeSync(stream.nfd);\n            }\n          } catch (e) {\n            if (!e.code) throw e;\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n        },read:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(length);\n          var res;\n          try {\n            res = fs.readSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          if (res > 0) {\n            for (var i = 0; i < res; i++) {\n              buffer[offset + i] = nbuffer[i];\n            }\n          }\n          return res;\n        },write:function (stream, buffer, offset, length, position) {\n          // FIXME this is terrible.\n          var nbuffer = new Buffer(buffer.subarray(offset, offset + length));\n          var res;\n          try {\n            res = fs.writeSync(stream.nfd, nbuffer, 0, length, position);\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n          }\n          return res;\n        },llseek:function (stream, offset, whence) {\n          var position = offset;\n          if (whence === 1) {  // SEEK_CUR.\n            position += stream.position;\n          } else if (whence === 2) {  // SEEK_END.\n            if (FS.isFile(stream.node.mode)) {\n              try {\n                var stat = fs.fstatSync(stream.nfd);\n                position += stat.size;\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES[e.code]);\n              }\n            }\n          }\n  \n          if (position < 0) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n  \n          stream.position = position;\n          return position;\n        }}};\n  \n  var _stdin=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stdout=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  var _stderr=allocate(1, \"i32*\", ALLOC_STATIC);\n  \n  function _fflush(stream) {\n      // int fflush(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html\n      // we don't currently perform any user-space buffering of data\n    }var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},handleFSError:function (e) {\n        if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace();\n        return ___setErrNo(e.errno);\n      },lookupPath:function (path, opts) {\n        path = PATH.resolve(FS.cwd(), path);\n        opts = opts || {};\n  \n        var defaults = {\n          follow_mount: true,\n          recurse_count: 0\n        };\n        for (var key in defaults) {\n          if (opts[key] === undefined) {\n            opts[key] = defaults[key];\n          }\n        }\n  \n        if (opts.recurse_count > 8) {  // max recursive lookup of 8\n          throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n        }\n  \n        // split the path\n        var parts = PATH.normalizeArray(path.split('/').filter(function(p) {\n          return !!p;\n        }), false);\n  \n        // start at the root\n        var current = FS.root;\n        var current_path = '/';\n  \n        for (var i = 0; i < parts.length; i++) {\n          var islast = (i === parts.length-1);\n          if (islast && opts.parent) {\n            // stop resolving\n            break;\n          }\n  \n          current = FS.lookupNode(current, parts[i]);\n          current_path = PATH.join2(current_path, parts[i]);\n  \n          // jump to the mount's root node if this is a mountpoint\n          if (FS.isMountpoint(current)) {\n            if (!islast || (islast && opts.follow_mount)) {\n              current = current.mounted.root;\n            }\n          }\n  \n          // by default, lookupPath will not follow a symlink if it is the final path component.\n          // setting opts.follow = true will override this behavior.\n          if (!islast || opts.follow) {\n            var count = 0;\n            while (FS.isLink(current.mode)) {\n              var link = FS.readlink(current_path);\n              current_path = PATH.resolve(PATH.dirname(current_path), link);\n              \n              var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count });\n              current = lookup.node;\n  \n              if (count++ > 40) {  // limit max consecutive symlinks to 40 (SYMLOOP_MAX).\n                throw new FS.ErrnoError(ERRNO_CODES.ELOOP);\n              }\n            }\n          }\n        }\n  \n        return { path: current_path, node: current };\n      },getPath:function (node) {\n        var path;\n        while (true) {\n          if (FS.isRoot(node)) {\n            var mount = node.mount.mountpoint;\n            if (!path) return mount;\n            return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path;\n          }\n          path = path ? node.name + '/' + path : node.name;\n          node = node.parent;\n        }\n      },hashName:function (parentid, name) {\n        var hash = 0;\n  \n  \n        for (var i = 0; i < name.length; i++) {\n          hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;\n        }\n        return ((parentid + hash) >>> 0) % FS.nameTable.length;\n      },hashAddNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        node.name_next = FS.nameTable[hash];\n        FS.nameTable[hash] = node;\n      },hashRemoveNode:function (node) {\n        var hash = FS.hashName(node.parent.id, node.name);\n        if (FS.nameTable[hash] === node) {\n          FS.nameTable[hash] = node.name_next;\n        } else {\n          var current = FS.nameTable[hash];\n          while (current) {\n            if (current.name_next === node) {\n              current.name_next = node.name_next;\n              break;\n            }\n            current = current.name_next;\n          }\n        }\n      },lookupNode:function (parent, name) {\n        var err = FS.mayLookup(parent);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        var hash = FS.hashName(parent.id, name);\n        for (var node = FS.nameTable[hash]; node; node = node.name_next) {\n          var nodeName = node.name;\n          if (node.parent.id === parent.id && nodeName === name) {\n            return node;\n          }\n        }\n        // if we failed to find it in the cache, call into the VFS\n        return FS.lookup(parent, name);\n      },createNode:function (parent, name, mode, rdev) {\n        if (!FS.FSNode) {\n          FS.FSNode = function(parent, name, mode, rdev) {\n            if (!parent) {\n              parent = this;  // root node sets parent to itself\n            }\n            this.parent = parent;\n            this.mount = parent.mount;\n            this.mounted = null;\n            this.id = FS.nextInode++;\n            this.name = name;\n            this.mode = mode;\n            this.node_ops = {};\n            this.stream_ops = {};\n            this.rdev = rdev;\n          };\n  \n          FS.FSNode.prototype = {};\n  \n          // compatibility\n          var readMode = 292 | 73;\n          var writeMode = 146;\n  \n          // NOTE we must use Object.defineProperties instead of individual calls to\n          // Object.defineProperty in order to make closure compiler happy\n          Object.defineProperties(FS.FSNode.prototype, {\n            read: {\n              get: function() { return (this.mode & readMode) === readMode; },\n              set: function(val) { val ? this.mode |= readMode : this.mode &= ~readMode; }\n            },\n            write: {\n              get: function() { return (this.mode & writeMode) === writeMode; },\n              set: function(val) { val ? this.mode |= writeMode : this.mode &= ~writeMode; }\n            },\n            isFolder: {\n              get: function() { return FS.isDir(this.mode); },\n            },\n            isDevice: {\n              get: function() { return FS.isChrdev(this.mode); },\n            },\n          });\n        }\n  \n        var node = new FS.FSNode(parent, name, mode, rdev);\n  \n        FS.hashAddNode(node);\n  \n        return node;\n      },destroyNode:function (node) {\n        FS.hashRemoveNode(node);\n      },isRoot:function (node) {\n        return node === node.parent;\n      },isMountpoint:function (node) {\n        return !!node.mounted;\n      },isFile:function (mode) {\n        return (mode & 61440) === 32768;\n      },isDir:function (mode) {\n        return (mode & 61440) === 16384;\n      },isLink:function (mode) {\n        return (mode & 61440) === 40960;\n      },isChrdev:function (mode) {\n        return (mode & 61440) === 8192;\n      },isBlkdev:function (mode) {\n        return (mode & 61440) === 24576;\n      },isFIFO:function (mode) {\n        return (mode & 61440) === 4096;\n      },isSocket:function (mode) {\n        return (mode & 49152) === 49152;\n      },flagModes:{\"r\":0,\"rs\":1052672,\"r+\":2,\"w\":577,\"wx\":705,\"xw\":705,\"w+\":578,\"wx+\":706,\"xw+\":706,\"a\":1089,\"ax\":1217,\"xa\":1217,\"a+\":1090,\"ax+\":1218,\"xa+\":1218},modeStringToFlags:function (str) {\n        var flags = FS.flagModes[str];\n        if (typeof flags === 'undefined') {\n          throw new Error('Unknown file open mode: ' + str);\n        }\n        return flags;\n      },flagsToPermissionString:function (flag) {\n        var accmode = flag & 2097155;\n        var perms = ['r', 'w', 'rw'][accmode];\n        if ((flag & 512)) {\n          perms += 'w';\n        }\n        return perms;\n      },nodePermissions:function (node, perms) {\n        if (FS.ignorePermissions) {\n          return 0;\n        }\n        // return 0 if any user, group or owner bits are set.\n        if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {\n          return ERRNO_CODES.EACCES;\n        } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {\n          return ERRNO_CODES.EACCES;\n        }\n        return 0;\n      },mayLookup:function (dir) {\n        return FS.nodePermissions(dir, 'x');\n      },mayCreate:function (dir, name) {\n        try {\n          var node = FS.lookupNode(dir, name);\n          return ERRNO_CODES.EEXIST;\n        } catch (e) {\n        }\n        return FS.nodePermissions(dir, 'wx');\n      },mayDelete:function (dir, name, isdir) {\n        var node;\n        try {\n          node = FS.lookupNode(dir, name);\n        } catch (e) {\n          return e.errno;\n        }\n        var err = FS.nodePermissions(dir, 'wx');\n        if (err) {\n          return err;\n        }\n        if (isdir) {\n          if (!FS.isDir(node.mode)) {\n            return ERRNO_CODES.ENOTDIR;\n          }\n          if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {\n            return ERRNO_CODES.EBUSY;\n          }\n        } else {\n          if (FS.isDir(node.mode)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return 0;\n      },mayOpen:function (node, flags) {\n        if (!node) {\n          return ERRNO_CODES.ENOENT;\n        }\n        if (FS.isLink(node.mode)) {\n          return ERRNO_CODES.ELOOP;\n        } else if (FS.isDir(node.mode)) {\n          if ((flags & 2097155) !== 0 ||  // opening for write\n              (flags & 512)) {\n            return ERRNO_CODES.EISDIR;\n          }\n        }\n        return FS.nodePermissions(node, FS.flagsToPermissionString(flags));\n      },MAX_OPEN_FDS:4096,nextfd:function (fd_start, fd_end) {\n        fd_start = fd_start || 0;\n        fd_end = fd_end || FS.MAX_OPEN_FDS;\n        for (var fd = fd_start; fd <= fd_end; fd++) {\n          if (!FS.streams[fd]) {\n            return fd;\n          }\n        }\n        throw new FS.ErrnoError(ERRNO_CODES.EMFILE);\n      },getStream:function (fd) {\n        return FS.streams[fd];\n      },createStream:function (stream, fd_start, fd_end) {\n        if (!FS.FSStream) {\n          FS.FSStream = function(){};\n          FS.FSStream.prototype = {};\n          // compatibility\n          Object.defineProperties(FS.FSStream.prototype, {\n            object: {\n              get: function() { return this.node; },\n              set: function(val) { this.node = val; }\n            },\n            isRead: {\n              get: function() { return (this.flags & 2097155) !== 1; }\n            },\n            isWrite: {\n              get: function() { return (this.flags & 2097155) !== 0; }\n            },\n            isAppend: {\n              get: function() { return (this.flags & 1024); }\n            }\n          });\n        }\n        if (stream.__proto__) {\n          // reuse the object\n          stream.__proto__ = FS.FSStream.prototype;\n        } else {\n          var newStream = new FS.FSStream();\n          for (var p in stream) {\n            newStream[p] = stream[p];\n          }\n          stream = newStream;\n        }\n        var fd = FS.nextfd(fd_start, fd_end);\n        stream.fd = fd;\n        FS.streams[fd] = stream;\n        return stream;\n      },closeStream:function (fd) {\n        FS.streams[fd] = null;\n      },getStreamFromPtr:function (ptr) {\n        return FS.streams[ptr - 1];\n      },getPtrForStream:function (stream) {\n        return stream ? stream.fd + 1 : 0;\n      },chrdev_stream_ops:{open:function (stream) {\n          var device = FS.getDevice(stream.node.rdev);\n          // override node's stream ops with the device's\n          stream.stream_ops = device.stream_ops;\n          // forward the open call\n          if (stream.stream_ops.open) {\n            stream.stream_ops.open(stream);\n          }\n        },llseek:function () {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }},major:function (dev) {\n        return ((dev) >> 8);\n      },minor:function (dev) {\n        return ((dev) & 0xff);\n      },makedev:function (ma, mi) {\n        return ((ma) << 8 | (mi));\n      },registerDevice:function (dev, ops) {\n        FS.devices[dev] = { stream_ops: ops };\n      },getDevice:function (dev) {\n        return FS.devices[dev];\n      },getMounts:function (mount) {\n        var mounts = [];\n        var check = [mount];\n  \n        while (check.length) {\n          var m = check.pop();\n  \n          mounts.push(m);\n  \n          check.push.apply(check, m.mounts);\n        }\n  \n        return mounts;\n      },syncfs:function (populate, callback) {\n        if (typeof(populate) === 'function') {\n          callback = populate;\n          populate = false;\n        }\n  \n        var mounts = FS.getMounts(FS.root.mount);\n        var completed = 0;\n  \n        function done(err) {\n          if (err) {\n            if (!done.errored) {\n              done.errored = true;\n              return callback(err);\n            }\n            return;\n          }\n          if (++completed >= mounts.length) {\n            callback(null);\n          }\n        };\n  \n        // sync all mounts\n        mounts.forEach(function (mount) {\n          if (!mount.type.syncfs) {\n            return done(null);\n          }\n          mount.type.syncfs(mount, populate, done);\n        });\n      },mount:function (type, opts, mountpoint) {\n        var root = mountpoint === '/';\n        var pseudo = !mountpoint;\n        var node;\n  \n        if (root && FS.root) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        } else if (!root && !pseudo) {\n          var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n          mountpoint = lookup.path;  // use the absolute path\n          node = lookup.node;\n  \n          if (FS.isMountpoint(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n          }\n  \n          if (!FS.isDir(node.mode)) {\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n          }\n        }\n  \n        var mount = {\n          type: type,\n          opts: opts,\n          mountpoint: mountpoint,\n          mounts: []\n        };\n  \n        // create a root node for the fs\n        var mountRoot = type.mount(mount);\n        mountRoot.mount = mount;\n        mount.root = mountRoot;\n  \n        if (root) {\n          FS.root = mountRoot;\n        } else if (node) {\n          // set as a mountpoint\n          node.mounted = mount;\n  \n          // add the new mount to the current mount's children\n          if (node.mount) {\n            node.mount.mounts.push(mount);\n          }\n        }\n  \n        return mountRoot;\n      },unmount:function (mountpoint) {\n        var lookup = FS.lookupPath(mountpoint, { follow_mount: false });\n  \n        if (!FS.isMountpoint(lookup.node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n  \n        // destroy the nodes for this mount, and all its child mounts\n        var node = lookup.node;\n        var mount = node.mounted;\n        var mounts = FS.getMounts(mount);\n  \n        Object.keys(FS.nameTable).forEach(function (hash) {\n          var current = FS.nameTable[hash];\n  \n          while (current) {\n            var next = current.name_next;\n  \n            if (mounts.indexOf(current.mount) !== -1) {\n              FS.destroyNode(current);\n            }\n  \n            current = next;\n          }\n        });\n  \n        // no longer a mountpoint\n        node.mounted = null;\n  \n        // remove this mount from the child mounts\n        var idx = node.mount.mounts.indexOf(mount);\n        assert(idx !== -1);\n        node.mount.mounts.splice(idx, 1);\n      },lookup:function (parent, name) {\n        return parent.node_ops.lookup(parent, name);\n      },mknod:function (path, mode, dev) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var err = FS.mayCreate(parent, name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.mknod) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.mknod(parent, name, mode, dev);\n      },create:function (path, mode) {\n        mode = mode !== undefined ? mode : 438 /* 0666 */;\n        mode &= 4095;\n        mode |= 32768;\n        return FS.mknod(path, mode, 0);\n      },mkdir:function (path, mode) {\n        mode = mode !== undefined ? mode : 511 /* 0777 */;\n        mode &= 511 | 512;\n        mode |= 16384;\n        return FS.mknod(path, mode, 0);\n      },mkdev:function (path, mode, dev) {\n        if (typeof(dev) === 'undefined') {\n          dev = mode;\n          mode = 438 /* 0666 */;\n        }\n        mode |= 8192;\n        return FS.mknod(path, mode, dev);\n      },symlink:function (oldpath, newpath) {\n        var lookup = FS.lookupPath(newpath, { parent: true });\n        var parent = lookup.node;\n        var newname = PATH.basename(newpath);\n        var err = FS.mayCreate(parent, newname);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.symlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return parent.node_ops.symlink(parent, newname, oldpath);\n      },rename:function (old_path, new_path) {\n        var old_dirname = PATH.dirname(old_path);\n        var new_dirname = PATH.dirname(new_path);\n        var old_name = PATH.basename(old_path);\n        var new_name = PATH.basename(new_path);\n        // parents must exist\n        var lookup, old_dir, new_dir;\n        try {\n          lookup = FS.lookupPath(old_path, { parent: true });\n          old_dir = lookup.node;\n          lookup = FS.lookupPath(new_path, { parent: true });\n          new_dir = lookup.node;\n        } catch (e) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // need to be part of the same mount\n        if (old_dir.mount !== new_dir.mount) {\n          throw new FS.ErrnoError(ERRNO_CODES.EXDEV);\n        }\n        // source must exist\n        var old_node = FS.lookupNode(old_dir, old_name);\n        // old path should not be an ancestor of the new path\n        var relative = PATH.relative(old_path, new_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        // new path should not be an ancestor of the old path\n        relative = PATH.relative(new_path, old_dirname);\n        if (relative.charAt(0) !== '.') {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);\n        }\n        // see if the new path already exists\n        var new_node;\n        try {\n          new_node = FS.lookupNode(new_dir, new_name);\n        } catch (e) {\n          // not fatal\n        }\n        // early out if nothing needs to change\n        if (old_node === new_node) {\n          return;\n        }\n        // we'll need to delete the old entry\n        var isdir = FS.isDir(old_node.mode);\n        var err = FS.mayDelete(old_dir, old_name, isdir);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // need delete permissions if we'll be overwriting.\n        // need create permissions if new doesn't already exist.\n        err = new_node ?\n          FS.mayDelete(new_dir, new_name, isdir) :\n          FS.mayCreate(new_dir, new_name);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!old_dir.node_ops.rename) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        // if we are going to change the parent, check write permissions\n        if (new_dir !== old_dir) {\n          err = FS.nodePermissions(old_dir, 'w');\n          if (err) {\n            throw new FS.ErrnoError(err);\n          }\n        }\n        // remove the node from the lookup hash\n        FS.hashRemoveNode(old_node);\n        // do the underlying fs rename\n        try {\n          old_dir.node_ops.rename(old_node, new_dir, new_name);\n        } catch (e) {\n          throw e;\n        } finally {\n          // add the node back to the hash (in case node_ops.rename\n          // changed its name)\n          FS.hashAddNode(old_node);\n        }\n      },rmdir:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, true);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.rmdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.rmdir(parent, name);\n        FS.destroyNode(node);\n      },readdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        if (!node.node_ops.readdir) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        return node.node_ops.readdir(node);\n      },unlink:function (path) {\n        var lookup = FS.lookupPath(path, { parent: true });\n        var parent = lookup.node;\n        var name = PATH.basename(path);\n        var node = FS.lookupNode(parent, name);\n        var err = FS.mayDelete(parent, name, false);\n        if (err) {\n          // POSIX says unlink should set EPERM, not EISDIR\n          if (err === ERRNO_CODES.EISDIR) err = ERRNO_CODES.EPERM;\n          throw new FS.ErrnoError(err);\n        }\n        if (!parent.node_ops.unlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isMountpoint(node)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBUSY);\n        }\n        parent.node_ops.unlink(parent, name);\n        FS.destroyNode(node);\n      },readlink:function (path) {\n        var lookup = FS.lookupPath(path);\n        var link = lookup.node;\n        if (!link.node_ops.readlink) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        return link.node_ops.readlink(link);\n      },stat:function (path, dontFollow) {\n        var lookup = FS.lookupPath(path, { follow: !dontFollow });\n        var node = lookup.node;\n        if (!node.node_ops.getattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        return node.node_ops.getattr(node);\n      },lstat:function (path) {\n        return FS.stat(path, true);\n      },chmod:function (path, mode, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          mode: (mode & 4095) | (node.mode & ~4095),\n          timestamp: Date.now()\n        });\n      },lchmod:function (path, mode) {\n        FS.chmod(path, mode, true);\n      },fchmod:function (fd, mode) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chmod(stream.node, mode);\n      },chown:function (path, uid, gid, dontFollow) {\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: !dontFollow });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        node.node_ops.setattr(node, {\n          timestamp: Date.now()\n          // we ignore the uid / gid for now\n        });\n      },lchown:function (path, uid, gid) {\n        FS.chown(path, uid, gid, true);\n      },fchown:function (fd, uid, gid) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        FS.chown(stream.node, uid, gid);\n      },truncate:function (path, len) {\n        if (len < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var node;\n        if (typeof path === 'string') {\n          var lookup = FS.lookupPath(path, { follow: true });\n          node = lookup.node;\n        } else {\n          node = path;\n        }\n        if (!node.node_ops.setattr) {\n          throw new FS.ErrnoError(ERRNO_CODES.EPERM);\n        }\n        if (FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!FS.isFile(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var err = FS.nodePermissions(node, 'w');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        node.node_ops.setattr(node, {\n          size: len,\n          timestamp: Date.now()\n        });\n      },ftruncate:function (fd, len) {\n        var stream = FS.getStream(fd);\n        if (!stream) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        FS.truncate(stream.node, len);\n      },utime:function (path, atime, mtime) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        var node = lookup.node;\n        node.node_ops.setattr(node, {\n          timestamp: Math.max(atime, mtime)\n        });\n      },open:function (path, flags, mode, fd_start, fd_end) {\n        flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags;\n        mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode;\n        if ((flags & 64)) {\n          mode = (mode & 4095) | 32768;\n        } else {\n          mode = 0;\n        }\n        var node;\n        if (typeof path === 'object') {\n          node = path;\n        } else {\n          path = PATH.normalize(path);\n          try {\n            var lookup = FS.lookupPath(path, {\n              follow: !(flags & 131072)\n            });\n            node = lookup.node;\n          } catch (e) {\n            // ignore\n          }\n        }\n        // perhaps we need to create the node\n        if ((flags & 64)) {\n          if (node) {\n            // if O_CREAT and O_EXCL are set, error out if the node already exists\n            if ((flags & 128)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EEXIST);\n            }\n          } else {\n            // node doesn't exist, try to create it\n            node = FS.mknod(path, mode, 0);\n          }\n        }\n        if (!node) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOENT);\n        }\n        // can't truncate a device\n        if (FS.isChrdev(node.mode)) {\n          flags &= ~512;\n        }\n        // check permissions\n        var err = FS.mayOpen(node, flags);\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        // do truncation if necessary\n        if ((flags & 512)) {\n          FS.truncate(node, 0);\n        }\n        // we've already handled these, don't pass down to the underlying vfs\n        flags &= ~(128 | 512);\n  \n        // register the stream with the filesystem\n        var stream = FS.createStream({\n          node: node,\n          path: FS.getPath(node),  // we want the absolute path to the node\n          flags: flags,\n          seekable: true,\n          position: 0,\n          stream_ops: node.stream_ops,\n          // used by the file family libc calls (fopen, fwrite, ferror, etc.)\n          ungotten: [],\n          error: false\n        }, fd_start, fd_end);\n        // call the new stream's open function\n        if (stream.stream_ops.open) {\n          stream.stream_ops.open(stream);\n        }\n        if (Module['logReadFiles'] && !(flags & 1)) {\n          if (!FS.readFiles) FS.readFiles = {};\n          if (!(path in FS.readFiles)) {\n            FS.readFiles[path] = 1;\n            Module['printErr']('read file: ' + path);\n          }\n        }\n        return stream;\n      },close:function (stream) {\n        try {\n          if (stream.stream_ops.close) {\n            stream.stream_ops.close(stream);\n          }\n        } catch (e) {\n          throw e;\n        } finally {\n          FS.closeStream(stream.fd);\n        }\n      },llseek:function (stream, offset, whence) {\n        if (!stream.seekable || !stream.stream_ops.llseek) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        return stream.stream_ops.llseek(stream, offset, whence);\n      },read:function (stream, buffer, offset, length, position) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.read) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);\n        if (!seeking) stream.position += bytesRead;\n        return bytesRead;\n      },write:function (stream, buffer, offset, length, position, canOwn) {\n        if (length < 0 || position < 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (FS.isDir(stream.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.EISDIR);\n        }\n        if (!stream.stream_ops.write) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        var seeking = true;\n        if (typeof position === 'undefined') {\n          position = stream.position;\n          seeking = false;\n        } else if (!stream.seekable) {\n          throw new FS.ErrnoError(ERRNO_CODES.ESPIPE);\n        }\n        if (stream.flags & 1024) {\n          // seek to the end before writing in append mode\n          FS.llseek(stream, 0, 2);\n        }\n        var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);\n        if (!seeking) stream.position += bytesWritten;\n        return bytesWritten;\n      },allocate:function (stream, offset, length) {\n        if (offset < 0 || length <= 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n        }\n        if ((stream.flags & 2097155) === 0) {\n          throw new FS.ErrnoError(ERRNO_CODES.EBADF);\n        }\n        if (!FS.isFile(stream.node.mode) && !FS.isDir(node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        if (!stream.stream_ops.allocate) {\n          throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n        }\n        stream.stream_ops.allocate(stream, offset, length);\n      },mmap:function (stream, buffer, offset, length, position, prot, flags) {\n        // TODO if PROT is PROT_WRITE, make sure we have write access\n        if ((stream.flags & 2097155) === 1) {\n          throw new FS.ErrnoError(ERRNO_CODES.EACCES);\n        }\n        if (!stream.stream_ops.mmap) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENODEV);\n        }\n        return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);\n      },ioctl:function (stream, cmd, arg) {\n        if (!stream.stream_ops.ioctl) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTTY);\n        }\n        return stream.stream_ops.ioctl(stream, cmd, arg);\n      },readFile:function (path, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'r';\n        opts.encoding = opts.encoding || 'binary';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var ret;\n        var stream = FS.open(path, opts.flags);\n        var stat = FS.stat(path);\n        var length = stat.size;\n        var buf = new Uint8Array(length);\n        FS.read(stream, buf, 0, length, 0);\n        if (opts.encoding === 'utf8') {\n          ret = '';\n          var utf8 = new Runtime.UTF8Processor();\n          for (var i = 0; i < length; i++) {\n            ret += utf8.processCChar(buf[i]);\n          }\n        } else if (opts.encoding === 'binary') {\n          ret = buf;\n        }\n        FS.close(stream);\n        return ret;\n      },writeFile:function (path, data, opts) {\n        opts = opts || {};\n        opts.flags = opts.flags || 'w';\n        opts.encoding = opts.encoding || 'utf8';\n        if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {\n          throw new Error('Invalid encoding type \"' + opts.encoding + '\"');\n        }\n        var stream = FS.open(path, opts.flags, opts.mode);\n        if (opts.encoding === 'utf8') {\n          var utf8 = new Runtime.UTF8Processor();\n          var buf = new Uint8Array(utf8.processJSString(data));\n          FS.write(stream, buf, 0, buf.length, 0, opts.canOwn);\n        } else if (opts.encoding === 'binary') {\n          FS.write(stream, data, 0, data.length, 0, opts.canOwn);\n        }\n        FS.close(stream);\n      },cwd:function () {\n        return FS.currentPath;\n      },chdir:function (path) {\n        var lookup = FS.lookupPath(path, { follow: true });\n        if (!FS.isDir(lookup.node.mode)) {\n          throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR);\n        }\n        var err = FS.nodePermissions(lookup.node, 'x');\n        if (err) {\n          throw new FS.ErrnoError(err);\n        }\n        FS.currentPath = lookup.path;\n      },createDefaultDirectories:function () {\n        FS.mkdir('/tmp');\n      },createDefaultDevices:function () {\n        // create /dev\n        FS.mkdir('/dev');\n        // setup /dev/null\n        FS.registerDevice(FS.makedev(1, 3), {\n          read: function() { return 0; },\n          write: function() { return 0; }\n        });\n        FS.mkdev('/dev/null', FS.makedev(1, 3));\n        // setup /dev/tty and /dev/tty1\n        // stderr needs to print output using Module['printErr']\n        // so we register a second tty just for it.\n        TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);\n        TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);\n        FS.mkdev('/dev/tty', FS.makedev(5, 0));\n        FS.mkdev('/dev/tty1', FS.makedev(6, 0));\n        // we're not going to emulate the actual shm device,\n        // just create the tmp dirs that reside in it commonly\n        FS.mkdir('/dev/shm');\n        FS.mkdir('/dev/shm/tmp');\n      },createStandardStreams:function () {\n        // TODO deprecate the old functionality of a single\n        // input / output callback and that utilizes FS.createDevice\n        // and instead require a unique set of stream ops\n  \n        // by default, we symlink the standard streams to the\n        // default tty devices. however, if the standard streams\n        // have been overwritten we create a unique device for\n        // them instead.\n        if (Module['stdin']) {\n          FS.createDevice('/dev', 'stdin', Module['stdin']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdin');\n        }\n        if (Module['stdout']) {\n          FS.createDevice('/dev', 'stdout', null, Module['stdout']);\n        } else {\n          FS.symlink('/dev/tty', '/dev/stdout');\n        }\n        if (Module['stderr']) {\n          FS.createDevice('/dev', 'stderr', null, Module['stderr']);\n        } else {\n          FS.symlink('/dev/tty1', '/dev/stderr');\n        }\n  \n        // open default streams for the stdin, stdout and stderr devices\n        var stdin = FS.open('/dev/stdin', 'r');\n        HEAP32[((_stdin)>>2)]=FS.getPtrForStream(stdin);\n        assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')');\n  \n        var stdout = FS.open('/dev/stdout', 'w');\n        HEAP32[((_stdout)>>2)]=FS.getPtrForStream(stdout);\n        assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')');\n  \n        var stderr = FS.open('/dev/stderr', 'w');\n        HEAP32[((_stderr)>>2)]=FS.getPtrForStream(stderr);\n        assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')');\n      },ensureErrnoError:function () {\n        if (FS.ErrnoError) return;\n        FS.ErrnoError = function ErrnoError(errno) {\n          this.errno = errno;\n          for (var key in ERRNO_CODES) {\n            if (ERRNO_CODES[key] === errno) {\n              this.code = key;\n              break;\n            }\n          }\n          this.message = ERRNO_MESSAGES[errno];\n        };\n        FS.ErrnoError.prototype = new Error();\n        FS.ErrnoError.prototype.constructor = FS.ErrnoError;\n        // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info)\n        [ERRNO_CODES.ENOENT].forEach(function(code) {\n          FS.genericErrors[code] = new FS.ErrnoError(code);\n          FS.genericErrors[code].stack = '<generic error, no stack>';\n        });\n      },staticInit:function () {\n        FS.ensureErrnoError();\n  \n        FS.nameTable = new Array(4096);\n  \n        FS.mount(MEMFS, {}, '/');\n  \n        FS.createDefaultDirectories();\n        FS.createDefaultDevices();\n      },init:function (input, output, error) {\n        assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)');\n        FS.init.initialized = true;\n  \n        FS.ensureErrnoError();\n  \n        // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here\n        Module['stdin'] = input || Module['stdin'];\n        Module['stdout'] = output || Module['stdout'];\n        Module['stderr'] = error || Module['stderr'];\n  \n        FS.createStandardStreams();\n      },quit:function () {\n        FS.init.initialized = false;\n        for (var i = 0; i < FS.streams.length; i++) {\n          var stream = FS.streams[i];\n          if (!stream) {\n            continue;\n          }\n          FS.close(stream);\n        }\n      },getMode:function (canRead, canWrite) {\n        var mode = 0;\n        if (canRead) mode |= 292 | 73;\n        if (canWrite) mode |= 146;\n        return mode;\n      },joinPath:function (parts, forceRelative) {\n        var path = PATH.join.apply(null, parts);\n        if (forceRelative && path[0] == '/') path = path.substr(1);\n        return path;\n      },absolutePath:function (relative, base) {\n        return PATH.resolve(base, relative);\n      },standardizePath:function (path) {\n        return PATH.normalize(path);\n      },findObject:function (path, dontResolveLastLink) {\n        var ret = FS.analyzePath(path, dontResolveLastLink);\n        if (ret.exists) {\n          return ret.object;\n        } else {\n          ___setErrNo(ret.error);\n          return null;\n        }\n      },analyzePath:function (path, dontResolveLastLink) {\n        // operate from within the context of the symlink's target\n        try {\n          var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          path = lookup.path;\n        } catch (e) {\n        }\n        var ret = {\n          isRoot: false, exists: false, error: 0, name: null, path: null, object: null,\n          parentExists: false, parentPath: null, parentObject: null\n        };\n        try {\n          var lookup = FS.lookupPath(path, { parent: true });\n          ret.parentExists = true;\n          ret.parentPath = lookup.path;\n          ret.parentObject = lookup.node;\n          ret.name = PATH.basename(path);\n          lookup = FS.lookupPath(path, { follow: !dontResolveLastLink });\n          ret.exists = true;\n          ret.path = lookup.path;\n          ret.object = lookup.node;\n          ret.name = lookup.node.name;\n          ret.isRoot = lookup.path === '/';\n        } catch (e) {\n          ret.error = e.errno;\n        };\n        return ret;\n      },createFolder:function (parent, name, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.mkdir(path, mode);\n      },createPath:function (parent, path, canRead, canWrite) {\n        parent = typeof parent === 'string' ? parent : FS.getPath(parent);\n        var parts = path.split('/').reverse();\n        while (parts.length) {\n          var part = parts.pop();\n          if (!part) continue;\n          var current = PATH.join2(parent, part);\n          try {\n            FS.mkdir(current);\n          } catch (e) {\n            // ignore EEXIST\n          }\n          parent = current;\n        }\n        return current;\n      },createFile:function (parent, name, properties, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(canRead, canWrite);\n        return FS.create(path, mode);\n      },createDataFile:function (parent, name, data, canRead, canWrite, canOwn) {\n        var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent;\n        var mode = FS.getMode(canRead, canWrite);\n        var node = FS.create(path, mode);\n        if (data) {\n          if (typeof data === 'string') {\n            var arr = new Array(data.length);\n            for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);\n            data = arr;\n          }\n          // make sure we can write to the file\n          FS.chmod(node, mode | 146);\n          var stream = FS.open(node, 'w');\n          FS.write(stream, data, 0, data.length, 0, canOwn);\n          FS.close(stream);\n          FS.chmod(node, mode);\n        }\n        return node;\n      },createDevice:function (parent, name, input, output) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        var mode = FS.getMode(!!input, !!output);\n        if (!FS.createDevice.major) FS.createDevice.major = 64;\n        var dev = FS.makedev(FS.createDevice.major++, 0);\n        // Create a fake device that a set of stream ops to emulate\n        // the old behavior.\n        FS.registerDevice(dev, {\n          open: function(stream) {\n            stream.seekable = false;\n          },\n          close: function(stream) {\n            // flush any pending line data\n            if (output && output.buffer && output.buffer.length) {\n              output(10);\n            }\n          },\n          read: function(stream, buffer, offset, length, pos /* ignored */) {\n            var bytesRead = 0;\n            for (var i = 0; i < length; i++) {\n              var result;\n              try {\n                result = input();\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n              if (result === undefined && bytesRead === 0) {\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n              if (result === null || result === undefined) break;\n              bytesRead++;\n              buffer[offset+i] = result;\n            }\n            if (bytesRead) {\n              stream.node.timestamp = Date.now();\n            }\n            return bytesRead;\n          },\n          write: function(stream, buffer, offset, length, pos) {\n            for (var i = 0; i < length; i++) {\n              try {\n                output(buffer[offset+i]);\n              } catch (e) {\n                throw new FS.ErrnoError(ERRNO_CODES.EIO);\n              }\n            }\n            if (length) {\n              stream.node.timestamp = Date.now();\n            }\n            return i;\n          }\n        });\n        return FS.mkdev(path, mode, dev);\n      },createLink:function (parent, name, target, canRead, canWrite) {\n        var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name);\n        return FS.symlink(target, path);\n      },forceLoadFile:function (obj) {\n        if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;\n        var success = true;\n        if (typeof XMLHttpRequest !== 'undefined') {\n          throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");\n        } else if (Module['read']) {\n          // Command-line.\n          try {\n            // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as\n            //          read() will try to parse UTF8.\n            obj.contents = intArrayFromString(Module['read'](obj.url), true);\n          } catch (e) {\n            success = false;\n          }\n        } else {\n          throw new Error('Cannot load without read() or XMLHttpRequest.');\n        }\n        if (!success) ___setErrNo(ERRNO_CODES.EIO);\n        return success;\n      },createLazyFile:function (parent, name, url, canRead, canWrite) {\n        if (typeof XMLHttpRequest !== 'undefined') {\n          if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc';\n          // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse.\n          function LazyUint8Array() {\n            this.lengthKnown = false;\n            this.chunks = []; // Loaded chunks. Index is the chunk number\n          }\n          LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {\n            if (idx > this.length-1 || idx < 0) {\n              return undefined;\n            }\n            var chunkOffset = idx % this.chunkSize;\n            var chunkNum = Math.floor(idx / this.chunkSize);\n            return this.getter(chunkNum)[chunkOffset];\n          }\n          LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {\n            this.getter = getter;\n          }\n          LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {\n              // Find length\n              var xhr = new XMLHttpRequest();\n              xhr.open('HEAD', url, false);\n              xhr.send(null);\n              if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n              var datalength = Number(xhr.getResponseHeader(\"Content-length\"));\n              var header;\n              var hasByteServing = (header = xhr.getResponseHeader(\"Accept-Ranges\")) && header === \"bytes\";\n              var chunkSize = 1024*1024; // Chunk size in bytes\n  \n              if (!hasByteServing) chunkSize = datalength;\n  \n              // Function to get a range from the remote URL.\n              var doXHR = (function(from, to) {\n                if (from > to) throw new Error(\"invalid range (\" + from + \", \" + to + \") or no bytes requested!\");\n                if (to > datalength-1) throw new Error(\"only \" + datalength + \" bytes available! programmer error!\");\n  \n                // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available.\n                var xhr = new XMLHttpRequest();\n                xhr.open('GET', url, false);\n                if (datalength !== chunkSize) xhr.setRequestHeader(\"Range\", \"bytes=\" + from + \"-\" + to);\n  \n                // Some hints to the browser that we want binary data.\n                if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer';\n                if (xhr.overrideMimeType) {\n                  xhr.overrideMimeType('text/plain; charset=x-user-defined');\n                }\n  \n                xhr.send(null);\n                if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error(\"Couldn't load \" + url + \". Status: \" + xhr.status);\n                if (xhr.response !== undefined) {\n                  return new Uint8Array(xhr.response || []);\n                } else {\n                  return intArrayFromString(xhr.responseText || '', true);\n                }\n              });\n              var lazyArray = this;\n              lazyArray.setDataGetter(function(chunkNum) {\n                var start = chunkNum * chunkSize;\n                var end = (chunkNum+1) * chunkSize - 1; // including this byte\n                end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") {\n                  lazyArray.chunks[chunkNum] = doXHR(start, end);\n                }\n                if (typeof(lazyArray.chunks[chunkNum]) === \"undefined\") throw new Error(\"doXHR failed!\");\n                return lazyArray.chunks[chunkNum];\n              });\n  \n              this._length = datalength;\n              this._chunkSize = chunkSize;\n              this.lengthKnown = true;\n          }\n  \n          var lazyArray = new LazyUint8Array();\n          Object.defineProperty(lazyArray, \"length\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._length;\n              }\n          });\n          Object.defineProperty(lazyArray, \"chunkSize\", {\n              get: function() {\n                  if(!this.lengthKnown) {\n                      this.cacheLength();\n                  }\n                  return this._chunkSize;\n              }\n          });\n  \n          var properties = { isDevice: false, contents: lazyArray };\n        } else {\n          var properties = { isDevice: false, url: url };\n        }\n  \n        var node = FS.createFile(parent, name, properties, canRead, canWrite);\n        // This is a total hack, but I want to get this lazy file code out of the\n        // core of MEMFS. If we want to keep this lazy file concept I feel it should\n        // be its own thin LAZYFS proxying calls to MEMFS.\n        if (properties.contents) {\n          node.contents = properties.contents;\n        } else if (properties.url) {\n          node.contents = null;\n          node.url = properties.url;\n        }\n        // override each stream op with one that tries to force load the lazy file first\n        var stream_ops = {};\n        var keys = Object.keys(node.stream_ops);\n        keys.forEach(function(key) {\n          var fn = node.stream_ops[key];\n          stream_ops[key] = function forceLoadLazyFile() {\n            if (!FS.forceLoadFile(node)) {\n              throw new FS.ErrnoError(ERRNO_CODES.EIO);\n            }\n            return fn.apply(null, arguments);\n          };\n        });\n        // use a custom read function\n        stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {\n          if (!FS.forceLoadFile(node)) {\n            throw new FS.ErrnoError(ERRNO_CODES.EIO);\n          }\n          var contents = stream.node.contents;\n          if (position >= contents.length)\n            return 0;\n          var size = Math.min(contents.length - position, length);\n          assert(size >= 0);\n          if (contents.slice) { // normal array\n            for (var i = 0; i < size; i++) {\n              buffer[offset + i] = contents[position + i];\n            }\n          } else {\n            for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR\n              buffer[offset + i] = contents.get(position + i);\n            }\n          }\n          return size;\n        };\n        node.stream_ops = stream_ops;\n        return node;\n      },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn) {\n        Browser.init();\n        // TODO we should allow people to just pass in a complete filename instead\n        // of parent and name being that we just join them anyways\n        var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;\n        function processData(byteArray) {\n          function finish(byteArray) {\n            if (!dontCreateFile) {\n              FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);\n            }\n            if (onload) onload();\n            removeRunDependency('cp ' + fullname);\n          }\n          var handled = false;\n          Module['preloadPlugins'].forEach(function(plugin) {\n            if (handled) return;\n            if (plugin['canHandle'](fullname)) {\n              plugin['handle'](byteArray, fullname, finish, function() {\n                if (onerror) onerror();\n                removeRunDependency('cp ' + fullname);\n              });\n              handled = true;\n            }\n          });\n          if (!handled) finish(byteArray);\n        }\n        addRunDependency('cp ' + fullname);\n        if (typeof url == 'string') {\n          Browser.asyncLoad(url, function(byteArray) {\n            processData(byteArray);\n          }, onerror);\n        } else {\n          processData(url);\n        }\n      },indexedDB:function () {\n        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;\n      },DB_NAME:function () {\n        return 'EM_FS_' + window.location.pathname;\n      },DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {\n          console.log('creating db');\n          var db = openRequest.result;\n          db.createObjectStore(FS.DB_STORE_NAME);\n        };\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite');\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var putRequest = files.put(FS.analyzePath(path).object.contents, path);\n            putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() };\n            putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      },loadFilesFromDB:function (paths, onload, onerror) {\n        onload = onload || function(){};\n        onerror = onerror || function(){};\n        var indexedDB = FS.indexedDB();\n        try {\n          var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);\n        } catch (e) {\n          return onerror(e);\n        }\n        openRequest.onupgradeneeded = onerror; // no database to load from\n        openRequest.onsuccess = function openRequest_onsuccess() {\n          var db = openRequest.result;\n          try {\n            var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly');\n          } catch(e) {\n            onerror(e);\n            return;\n          }\n          var files = transaction.objectStore(FS.DB_STORE_NAME);\n          var ok = 0, fail = 0, total = paths.length;\n          function finish() {\n            if (fail == 0) onload(); else onerror();\n          }\n          paths.forEach(function(path) {\n            var getRequest = files.get(path);\n            getRequest.onsuccess = function getRequest_onsuccess() {\n              if (FS.analyzePath(path).exists) {\n                FS.unlink(path);\n              }\n              FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);\n              ok++;\n              if (ok + fail == total) finish();\n            };\n            getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() };\n          });\n          transaction.onerror = onerror;\n        };\n        openRequest.onerror = onerror;\n      }};\n  \n  \n  \n  function _mkport() { throw 'TODO' }var SOCKFS={mount:function (mount) {\n        return FS.createNode(null, '/', 16384 | 511 /* 0777 */, 0);\n      },createSocket:function (family, type, protocol) {\n        var streaming = type == 1;\n        if (protocol) {\n          assert(streaming == (protocol == 6)); // if SOCK_STREAM, must be tcp\n        }\n  \n        // create our internal socket structure\n        var sock = {\n          family: family,\n          type: type,\n          protocol: protocol,\n          server: null,\n          peers: {},\n          pending: [],\n          recv_queue: [],\n          sock_ops: SOCKFS.websocket_sock_ops\n        };\n  \n        // create the filesystem node to store the socket structure\n        var name = SOCKFS.nextname();\n        var node = FS.createNode(SOCKFS.root, name, 49152, 0);\n        node.sock = sock;\n  \n        // and the wrapping stream that enables library functions such\n        // as read and write to indirectly interact with the socket\n        var stream = FS.createStream({\n          path: name,\n          node: node,\n          flags: FS.modeStringToFlags('r+'),\n          seekable: false,\n          stream_ops: SOCKFS.stream_ops\n        });\n  \n        // map the new stream to the socket structure (sockets have a 1:1\n        // relationship with a stream)\n        sock.stream = stream;\n  \n        return sock;\n      },getSocket:function (fd) {\n        var stream = FS.getStream(fd);\n        if (!stream || !FS.isSocket(stream.node.mode)) {\n          return null;\n        }\n        return stream.node.sock;\n      },stream_ops:{poll:function (stream) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.poll(sock);\n        },ioctl:function (stream, request, varargs) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.ioctl(sock, request, varargs);\n        },read:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          var msg = sock.sock_ops.recvmsg(sock, length);\n          if (!msg) {\n            // socket is closed\n            return 0;\n          }\n          buffer.set(msg.buffer, offset);\n          return msg.buffer.length;\n        },write:function (stream, buffer, offset, length, position /* ignored */) {\n          var sock = stream.node.sock;\n          return sock.sock_ops.sendmsg(sock, buffer, offset, length);\n        },close:function (stream) {\n          var sock = stream.node.sock;\n          sock.sock_ops.close(sock);\n        }},nextname:function () {\n        if (!SOCKFS.nextname.current) {\n          SOCKFS.nextname.current = 0;\n        }\n        return 'socket[' + (SOCKFS.nextname.current++) + ']';\n      },websocket_sock_ops:{createPeer:function (sock, addr, port) {\n          var ws;\n  \n          if (typeof addr === 'object') {\n            ws = addr;\n            addr = null;\n            port = null;\n          }\n  \n          if (ws) {\n            // for sockets that've already connected (e.g. we're the server)\n            // we can inspect the _socket property for the address\n            if (ws._socket) {\n              addr = ws._socket.remoteAddress;\n              port = ws._socket.remotePort;\n            }\n            // if we're just now initializing a connection to the remote,\n            // inspect the url property\n            else {\n              var result = /ws[s]?:\\/\\/([^:]+):(\\d+)/.exec(ws.url);\n              if (!result) {\n                throw new Error('WebSocket URL must be in the format ws(s)://address:port');\n              }\n              addr = result[1];\n              port = parseInt(result[2], 10);\n            }\n          } else {\n            // create the actual websocket object and connect\n            try {\n              var url = 'ws://' + addr + ':' + port;\n              // the node ws library API is slightly different than the browser's\n              var opts = ENVIRONMENT_IS_NODE ? {headers: {'websocket-protocol': ['binary']}} : ['binary'];\n              // If node we use the ws library.\n              var WebSocket = ENVIRONMENT_IS_NODE ? require('ws') : window['WebSocket'];\n              ws = new WebSocket(url, opts);\n              ws.binaryType = 'arraybuffer';\n            } catch (e) {\n              throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH);\n            }\n          }\n  \n  \n          var peer = {\n            addr: addr,\n            port: port,\n            socket: ws,\n            dgram_send_queue: []\n          };\n  \n          SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n          SOCKFS.websocket_sock_ops.handlePeerEvents(sock, peer);\n  \n          // if this is a bound dgram socket, send the port number first to allow\n          // us to override the ephemeral port reported to us by remotePort on the\n          // remote end.\n          if (sock.type === 2 && typeof sock.sport !== 'undefined') {\n            peer.dgram_send_queue.push(new Uint8Array([\n                255, 255, 255, 255,\n                'p'.charCodeAt(0), 'o'.charCodeAt(0), 'r'.charCodeAt(0), 't'.charCodeAt(0),\n                ((sock.sport & 0xff00) >> 8) , (sock.sport & 0xff)\n            ]));\n          }\n  \n          return peer;\n        },getPeer:function (sock, addr, port) {\n          return sock.peers[addr + ':' + port];\n        },addPeer:function (sock, peer) {\n          sock.peers[peer.addr + ':' + peer.port] = peer;\n        },removePeer:function (sock, peer) {\n          delete sock.peers[peer.addr + ':' + peer.port];\n        },handlePeerEvents:function (sock, peer) {\n          var first = true;\n  \n          var handleOpen = function () {\n            try {\n              var queued = peer.dgram_send_queue.shift();\n              while (queued) {\n                peer.socket.send(queued);\n                queued = peer.dgram_send_queue.shift();\n              }\n            } catch (e) {\n              // not much we can do here in the way of proper error handling as we've already\n              // lied and said this data was sent. shut it down.\n              peer.socket.close();\n            }\n          };\n  \n          function handleMessage(data) {\n            assert(typeof data !== 'string' && data.byteLength !== undefined);  // must receive an ArrayBuffer\n            data = new Uint8Array(data);  // make a typed array view on the array buffer\n  \n  \n            // if this is the port message, override the peer's port with it\n            var wasfirst = first;\n            first = false;\n            if (wasfirst &&\n                data.length === 10 &&\n                data[0] === 255 && data[1] === 255 && data[2] === 255 && data[3] === 255 &&\n                data[4] === 'p'.charCodeAt(0) && data[5] === 'o'.charCodeAt(0) && data[6] === 'r'.charCodeAt(0) && data[7] === 't'.charCodeAt(0)) {\n              // update the peer's port and it's key in the peer map\n              var newport = ((data[8] << 8) | data[9]);\n              SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n              peer.port = newport;\n              SOCKFS.websocket_sock_ops.addPeer(sock, peer);\n              return;\n            }\n  \n            sock.recv_queue.push({ addr: peer.addr, port: peer.port, data: data });\n          };\n  \n          if (ENVIRONMENT_IS_NODE) {\n            peer.socket.on('open', handleOpen);\n            peer.socket.on('message', function(data, flags) {\n              if (!flags.binary) {\n                return;\n              }\n              handleMessage((new Uint8Array(data)).buffer);  // copy from node Buffer -> ArrayBuffer\n            });\n            peer.socket.on('error', function() {\n              // don't throw\n            });\n          } else {\n            peer.socket.onopen = handleOpen;\n            peer.socket.onmessage = function peer_socket_onmessage(event) {\n              handleMessage(event.data);\n            };\n          }\n        },poll:function (sock) {\n          if (sock.type === 1 && sock.server) {\n            // listen sockets should only say they're available for reading\n            // if there are pending clients.\n            return sock.pending.length ? (64 | 1) : 0;\n          }\n  \n          var mask = 0;\n          var dest = sock.type === 1 ?  // we only care about the socket state for connection-based sockets\n            SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport) :\n            null;\n  \n          if (sock.recv_queue.length ||\n              !dest ||  // connection-less sockets are always ready to read\n              (dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {  // let recv return 0 once closed\n            mask |= (64 | 1);\n          }\n  \n          if (!dest ||  // connection-less sockets are always ready to write\n              (dest && dest.socket.readyState === dest.socket.OPEN)) {\n            mask |= 4;\n          }\n  \n          if ((dest && dest.socket.readyState === dest.socket.CLOSING) ||\n              (dest && dest.socket.readyState === dest.socket.CLOSED)) {\n            mask |= 16;\n          }\n  \n          return mask;\n        },ioctl:function (sock, request, arg) {\n          switch (request) {\n            case 21531:\n              var bytes = 0;\n              if (sock.recv_queue.length) {\n                bytes = sock.recv_queue[0].data.length;\n              }\n              HEAP32[((arg)>>2)]=bytes;\n              return 0;\n            default:\n              return ERRNO_CODES.EINVAL;\n          }\n        },close:function (sock) {\n          // if we've spawned a listen server, close it\n          if (sock.server) {\n            try {\n              sock.server.close();\n            } catch (e) {\n            }\n            sock.server = null;\n          }\n          // close any peer connections\n          var peers = Object.keys(sock.peers);\n          for (var i = 0; i < peers.length; i++) {\n            var peer = sock.peers[peers[i]];\n            try {\n              peer.socket.close();\n            } catch (e) {\n            }\n            SOCKFS.websocket_sock_ops.removePeer(sock, peer);\n          }\n          return 0;\n        },bind:function (sock, addr, port) {\n          if (typeof sock.saddr !== 'undefined' || typeof sock.sport !== 'undefined') {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already bound\n          }\n          sock.saddr = addr;\n          sock.sport = port || _mkport();\n          // in order to emulate dgram sockets, we need to launch a listen server when\n          // binding on a connection-less socket\n          // note: this is only required on the server side\n          if (sock.type === 2) {\n            // close the existing server if it exists\n            if (sock.server) {\n              sock.server.close();\n              sock.server = null;\n            }\n            // swallow error operation not supported error that occurs when binding in the\n            // browser where this isn't supported\n            try {\n              sock.sock_ops.listen(sock, 0);\n            } catch (e) {\n              if (!(e instanceof FS.ErrnoError)) throw e;\n              if (e.errno !== ERRNO_CODES.EOPNOTSUPP) throw e;\n            }\n          }\n        },connect:function (sock, addr, port) {\n          if (sock.server) {\n            throw new FS.ErrnoError(ERRNO_CODS.EOPNOTSUPP);\n          }\n  \n          // TODO autobind\n          // if (!sock.addr && sock.type == 2) {\n          // }\n  \n          // early out if we're already connected / in the middle of connecting\n          if (typeof sock.daddr !== 'undefined' && typeof sock.dport !== 'undefined') {\n            var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n            if (dest) {\n              if (dest.socket.readyState === dest.socket.CONNECTING) {\n                throw new FS.ErrnoError(ERRNO_CODES.EALREADY);\n              } else {\n                throw new FS.ErrnoError(ERRNO_CODES.EISCONN);\n              }\n            }\n          }\n  \n          // add the socket to our peer list and set our\n          // destination address / port to match\n          var peer = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n          sock.daddr = peer.addr;\n          sock.dport = peer.port;\n  \n          // always \"fail\" in non-blocking mode\n          throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS);\n        },listen:function (sock, backlog) {\n          if (!ENVIRONMENT_IS_NODE) {\n            throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP);\n          }\n          if (sock.server) {\n             throw new FS.ErrnoError(ERRNO_CODES.EINVAL);  // already listening\n          }\n          var WebSocketServer = require('ws').Server;\n          var host = sock.saddr;\n          sock.server = new WebSocketServer({\n            host: host,\n            port: sock.sport\n            // TODO support backlog\n          });\n  \n          sock.server.on('connection', function(ws) {\n            if (sock.type === 1) {\n              var newsock = SOCKFS.createSocket(sock.family, sock.type, sock.protocol);\n  \n              // create a peer on the new socket\n              var peer = SOCKFS.websocket_sock_ops.createPeer(newsock, ws);\n              newsock.daddr = peer.addr;\n              newsock.dport = peer.port;\n  \n              // push to queue for accept to pick up\n              sock.pending.push(newsock);\n            } else {\n              // create a peer on the listen socket so calling sendto\n              // with the listen socket and an address will resolve\n              // to the correct client\n              SOCKFS.websocket_sock_ops.createPeer(sock, ws);\n            }\n          });\n          sock.server.on('closed', function() {\n            sock.server = null;\n          });\n          sock.server.on('error', function() {\n            // don't throw\n          });\n        },accept:function (listensock) {\n          if (!listensock.server) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n          var newsock = listensock.pending.shift();\n          newsock.stream.flags = listensock.stream.flags;\n          return newsock;\n        },getname:function (sock, peer) {\n          var addr, port;\n          if (peer) {\n            if (sock.daddr === undefined || sock.dport === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            }\n            addr = sock.daddr;\n            port = sock.dport;\n          } else {\n            // TODO saddr and sport will be set for bind()'d UDP sockets, but what\n            // should we be returning for TCP sockets that've been connect()'d?\n            addr = sock.saddr || 0;\n            port = sock.sport || 0;\n          }\n          return { addr: addr, port: port };\n        },sendmsg:function (sock, buffer, offset, length, addr, port) {\n          if (sock.type === 2) {\n            // connection-less sockets will honor the message address,\n            // and otherwise fall back to the bound destination address\n            if (addr === undefined || port === undefined) {\n              addr = sock.daddr;\n              port = sock.dport;\n            }\n            // if there was no address to fall back to, error out\n            if (addr === undefined || port === undefined) {\n              throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ);\n            }\n          } else {\n            // connection-based sockets will only use the bound\n            addr = sock.daddr;\n            port = sock.dport;\n          }\n  \n          // find the peer for the destination address\n          var dest = SOCKFS.websocket_sock_ops.getPeer(sock, addr, port);\n  \n          // early out if not connected with a connection-based socket\n          if (sock.type === 1) {\n            if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n              throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n            } else if (dest.socket.readyState === dest.socket.CONNECTING) {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // create a copy of the incoming data to send, as the WebSocket API\n          // doesn't work entirely with an ArrayBufferView, it'll just send\n          // the entire underlying buffer\n          var data;\n          if (buffer instanceof Array || buffer instanceof ArrayBuffer) {\n            data = buffer.slice(offset, offset + length);\n          } else {  // ArrayBufferView\n            data = buffer.buffer.slice(buffer.byteOffset + offset, buffer.byteOffset + offset + length);\n          }\n  \n          // if we're emulating a connection-less dgram socket and don't have\n          // a cached connection, queue the buffer to send upon connect and\n          // lie, saying the data was sent now.\n          if (sock.type === 2) {\n            if (!dest || dest.socket.readyState !== dest.socket.OPEN) {\n              // if we're not connected, open a new connection\n              if (!dest || dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                dest = SOCKFS.websocket_sock_ops.createPeer(sock, addr, port);\n              }\n              dest.dgram_send_queue.push(data);\n              return length;\n            }\n          }\n  \n          try {\n            // send the actual data\n            dest.socket.send(data);\n            return length;\n          } catch (e) {\n            throw new FS.ErrnoError(ERRNO_CODES.EINVAL);\n          }\n        },recvmsg:function (sock, length) {\n          // http://pubs.opengroup.org/onlinepubs/7908799/xns/recvmsg.html\n          if (sock.type === 1 && sock.server) {\n            // tcp servers should not be recv()'ing on the listen socket\n            throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n          }\n  \n          var queued = sock.recv_queue.shift();\n          if (!queued) {\n            if (sock.type === 1) {\n              var dest = SOCKFS.websocket_sock_ops.getPeer(sock, sock.daddr, sock.dport);\n  \n              if (!dest) {\n                // if we have a destination address but are not connected, error out\n                throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN);\n              }\n              else if (dest.socket.readyState === dest.socket.CLOSING || dest.socket.readyState === dest.socket.CLOSED) {\n                // return null if the socket has closed\n                return null;\n              }\n              else {\n                // else, our socket is in a valid state but truly has nothing available\n                throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n              }\n            } else {\n              throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);\n            }\n          }\n  \n          // queued.data will be an ArrayBuffer if it's unadulterated, but if it's\n          // requeued TCP data it'll be an ArrayBufferView\n          var queuedLength = queued.data.byteLength || queued.data.length;\n          var queuedOffset = queued.data.byteOffset || 0;\n          var queuedBuffer = queued.data.buffer || queued.data;\n          var bytesRead = Math.min(length, queuedLength);\n          var res = {\n            buffer: new Uint8Array(queuedBuffer, queuedOffset, bytesRead),\n            addr: queued.addr,\n            port: queued.port\n          };\n  \n  \n          // push back any unread data for TCP connections\n          if (sock.type === 1 && bytesRead < queuedLength) {\n            var bytesRemaining = queuedLength - bytesRead;\n            queued.data = new Uint8Array(queuedBuffer, queuedOffset + bytesRead, bytesRemaining);\n            sock.recv_queue.unshift(queued);\n          }\n  \n          return res;\n        }}};function _send(fd, buf, len, flags) {\n      var sock = SOCKFS.getSocket(fd);\n      if (!sock) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      // TODO honor flags\n      return _write(fd, buf, len);\n    }\n  \n  function _pwrite(fildes, buf, nbyte, offset) {\n      // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte, offset);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }function _write(fildes, buf, nbyte) {\n      // ssize_t write(int fildes, const void *buf, size_t nbyte);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html\n      var stream = FS.getStream(fildes);\n      if (!stream) {\n        ___setErrNo(ERRNO_CODES.EBADF);\n        return -1;\n      }\n  \n  \n      try {\n        var slab = HEAP8;\n        return FS.write(stream, slab, buf, nbyte);\n      } catch (e) {\n        FS.handleFSError(e);\n        return -1;\n      }\n    }\n  \n   \n  Module[\"_strlen\"] = _strlen;\n  \n  function _fileno(stream) {\n      // int fileno(FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html\n      stream = FS.getStreamFromPtr(stream);\n      if (!stream) return -1;\n      return stream.fd;\n    }function _fputs(s, stream) {\n      // int fputs(const char *restrict s, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html\n      var fd = _fileno(stream);\n      return _write(fd, s, _strlen(s));\n    }\n  \n  function _fputc(c, stream) {\n      // int fputc(int c, FILE *stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html\n      var chr = unSign(c & 0xFF);\n      HEAP8[((_fputc.ret)|0)]=chr;\n      var fd = _fileno(stream);\n      var ret = _write(fd, _fputc.ret, 1);\n      if (ret == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return -1;\n      } else {\n        return chr;\n      }\n    }function _puts(s) {\n      // int puts(const char *s);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html\n      // NOTE: puts() always writes an extra newline.\n      var stdout = HEAP32[((_stdout)>>2)];\n      var ret = _fputs(s, stdout);\n      if (ret < 0) {\n        return ret;\n      } else {\n        var newlineRet = _fputc(10, stdout);\n        return (newlineRet < 0) ? -1 : ret + 1;\n      }\n    }\n\n   \n  Module[\"_memset\"] = _memset;\n\n  function _free() {\n  }\n  Module[\"_free\"] = _free;\n\n  function _llvm_lifetime_start() {}\n\n  var Browser={mainLoop:{scheduler:null,method:\"\",shouldPause:false,paused:false,queue:[],pause:function () {\n          Browser.mainLoop.shouldPause = true;\n        },resume:function () {\n          if (Browser.mainLoop.paused) {\n            Browser.mainLoop.paused = false;\n            Browser.mainLoop.scheduler();\n          }\n          Browser.mainLoop.shouldPause = false;\n        },updateStatus:function () {\n          if (Module['setStatus']) {\n            var message = Module['statusMessage'] || 'Please wait...';\n            var remaining = Browser.mainLoop.remainingBlockers;\n            var expected = Browser.mainLoop.expectedBlockers;\n            if (remaining) {\n              if (remaining < expected) {\n                Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')');\n              } else {\n                Module['setStatus'](message);\n              }\n            } else {\n              Module['setStatus']('');\n            }\n          }\n        }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () {\n        if (!Module[\"preloadPlugins\"]) Module[\"preloadPlugins\"] = []; // needs to exist even in workers\n  \n        if (Browser.initted || ENVIRONMENT_IS_WORKER) return;\n        Browser.initted = true;\n  \n        try {\n          new Blob();\n          Browser.hasBlobConstructor = true;\n        } catch(e) {\n          Browser.hasBlobConstructor = false;\n          console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\");\n        }\n        Browser.BlobBuilder = typeof MozBlobBuilder != \"undefined\" ? MozBlobBuilder : (typeof WebKitBlobBuilder != \"undefined\" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log(\"warning: no BlobBuilder\") : null));\n        Browser.URLObject = typeof window != \"undefined\" ? (window.URL ? window.URL : window.webkitURL) : undefined;\n        if (!Module.noImageDecoding && typeof Browser.URLObject === 'undefined') {\n          console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\");\n          Module.noImageDecoding = true;\n        }\n  \n        // Support for plugins that can process preloaded files. You can add more of these to\n        // your app by creating and appending to Module.preloadPlugins.\n        //\n        // Each plugin is asked if it can handle a file based on the file's name. If it can,\n        // it is given the file's raw data. When it is done, it calls a callback with the file's\n        // (possibly modified) data. For example, a plugin might decompress a file, or it\n        // might create some side data structure for use later (like an Image element, etc.).\n  \n        var imagePlugin = {};\n        imagePlugin['canHandle'] = function imagePlugin_canHandle(name) {\n          return !Module.noImageDecoding && /\\.(jpg|jpeg|png|bmp)$/i.test(name);\n        };\n        imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {\n          var b = null;\n          if (Browser.hasBlobConstructor) {\n            try {\n              b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n              if (b.size !== byteArray.length) { // Safari bug #118630\n                // Safari's Blob can only take an ArrayBuffer\n                b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });\n              }\n            } catch(e) {\n              Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');\n            }\n          }\n          if (!b) {\n            var bb = new Browser.BlobBuilder();\n            bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range\n            b = bb.getBlob();\n          }\n          var url = Browser.URLObject.createObjectURL(b);\n          var img = new Image();\n          img.onload = function img_onload() {\n            assert(img.complete, 'Image ' + name + ' could not be decoded');\n            var canvas = document.createElement('canvas');\n            canvas.width = img.width;\n            canvas.height = img.height;\n            var ctx = canvas.getContext('2d');\n            ctx.drawImage(img, 0, 0);\n            Module[\"preloadedImages\"][name] = canvas;\n            Browser.URLObject.revokeObjectURL(url);\n            if (onload) onload(byteArray);\n          };\n          img.onerror = function img_onerror(event) {\n            console.log('Image ' + url + ' could not be decoded');\n            if (onerror) onerror();\n          };\n          img.src = url;\n        };\n        Module['preloadPlugins'].push(imagePlugin);\n  \n        var audioPlugin = {};\n        audioPlugin['canHandle'] = function audioPlugin_canHandle(name) {\n          return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };\n        };\n        audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) {\n          var done = false;\n          function finish(audio) {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = audio;\n            if (onload) onload(byteArray);\n          }\n          function fail() {\n            if (done) return;\n            done = true;\n            Module[\"preloadedAudios\"][name] = new Audio(); // empty shim\n            if (onerror) onerror();\n          }\n          if (Browser.hasBlobConstructor) {\n            try {\n              var b = new Blob([byteArray], { type: Browser.getMimetype(name) });\n            } catch(e) {\n              return fail();\n            }\n            var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!\n            var audio = new Audio();\n            audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926\n            audio.onerror = function audio_onerror(event) {\n              if (done) return;\n              console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');\n              function encode64(data) {\n                var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n                var PAD = '=';\n                var ret = '';\n                var leftchar = 0;\n                var leftbits = 0;\n                for (var i = 0; i < data.length; i++) {\n                  leftchar = (leftchar << 8) | data[i];\n                  leftbits += 8;\n                  while (leftbits >= 6) {\n                    var curr = (leftchar >> (leftbits-6)) & 0x3f;\n                    leftbits -= 6;\n                    ret += BASE[curr];\n                  }\n                }\n                if (leftbits == 2) {\n                  ret += BASE[(leftchar&3) << 4];\n                  ret += PAD + PAD;\n                } else if (leftbits == 4) {\n                  ret += BASE[(leftchar&0xf) << 2];\n                  ret += PAD;\n                }\n                return ret;\n              }\n              audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);\n              finish(audio); // we don't wait for confirmation this worked - but it's worth trying\n            };\n            audio.src = url;\n            // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror\n            Browser.safeSetTimeout(function() {\n              finish(audio); // try to use it even though it is not necessarily ready to play\n            }, 10000);\n          } else {\n            return fail();\n          }\n        };\n        Module['preloadPlugins'].push(audioPlugin);\n  \n        // Canvas event setup\n  \n        var canvas = Module['canvas'];\n        \n        // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module\n        // Module['forcedAspectRatio'] = 4 / 3;\n        \n        canvas.requestPointerLock = canvas['requestPointerLock'] ||\n                                    canvas['mozRequestPointerLock'] ||\n                                    canvas['webkitRequestPointerLock'] ||\n                                    canvas['msRequestPointerLock'] ||\n                                    function(){};\n        canvas.exitPointerLock = document['exitPointerLock'] ||\n                                 document['mozExitPointerLock'] ||\n                                 document['webkitExitPointerLock'] ||\n                                 document['msExitPointerLock'] ||\n                                 function(){}; // no-op if function does not exist\n        canvas.exitPointerLock = canvas.exitPointerLock.bind(document);\n  \n        function pointerLockChange() {\n          Browser.pointerLock = document['pointerLockElement'] === canvas ||\n                                document['mozPointerLockElement'] === canvas ||\n                                document['webkitPointerLockElement'] === canvas ||\n                                document['msPointerLockElement'] === canvas;\n        }\n  \n        document.addEventListener('pointerlockchange', pointerLockChange, false);\n        document.addEventListener('mozpointerlockchange', pointerLockChange, false);\n        document.addEventListener('webkitpointerlockchange', pointerLockChange, false);\n        document.addEventListener('mspointerlockchange', pointerLockChange, false);\n  \n        if (Module['elementPointerLock']) {\n          canvas.addEventListener(\"click\", function(ev) {\n            if (!Browser.pointerLock && canvas.requestPointerLock) {\n              canvas.requestPointerLock();\n              ev.preventDefault();\n            }\n          }, false);\n        }\n      },createContext:function (canvas, useWebGL, setInModule, webGLContextAttributes) {\n        var ctx;\n        var errorInfo = '?';\n        function onContextCreationError(event) {\n          errorInfo = event.statusMessage || errorInfo;\n        }\n        try {\n          if (useWebGL) {\n            var contextAttributes = {\n              antialias: false,\n              alpha: false\n            };\n  \n            if (webGLContextAttributes) {\n              for (var attribute in webGLContextAttributes) {\n                contextAttributes[attribute] = webGLContextAttributes[attribute];\n              }\n            }\n  \n  \n            canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n            try {\n              ['experimental-webgl', 'webgl'].some(function(webglId) {\n                return ctx = canvas.getContext(webglId, contextAttributes);\n              });\n            } finally {\n              canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n            }\n          } else {\n            ctx = canvas.getContext('2d');\n          }\n          if (!ctx) throw ':(';\n        } catch (e) {\n          Module.print('Could not create canvas: ' + [errorInfo, e]);\n          return null;\n        }\n        if (useWebGL) {\n          // Set the background of the WebGL canvas to black\n          canvas.style.backgroundColor = \"black\";\n  \n          // Warn on context loss\n          canvas.addEventListener('webglcontextlost', function(event) {\n            alert('WebGL context lost. You will need to reload the page.');\n          }, false);\n        }\n        if (setInModule) {\n          GLctx = Module.ctx = ctx;\n          Module.useWebGL = useWebGL;\n          Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() });\n          Browser.init();\n        }\n        return ctx;\n      },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) {\n        Browser.lockPointer = lockPointer;\n        Browser.resizeCanvas = resizeCanvas;\n        if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true;\n        if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false;\n  \n        var canvas = Module['canvas'];\n        var canvasContainer = canvas.parentNode;\n        function fullScreenChange() {\n          Browser.isFullScreen = false;\n          if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n               document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n               document['fullScreenElement'] || document['fullscreenElement'] ||\n               document['msFullScreenElement'] || document['msFullscreenElement'] ||\n               document['webkitCurrentFullScreenElement']) === canvasContainer) {\n            canvas.cancelFullScreen = document['cancelFullScreen'] ||\n                                      document['mozCancelFullScreen'] ||\n                                      document['webkitCancelFullScreen'] ||\n                                      document['msExitFullscreen'] ||\n                                      document['exitFullscreen'] ||\n                                      function() {};\n            canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document);\n            if (Browser.lockPointer) canvas.requestPointerLock();\n            Browser.isFullScreen = true;\n            if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize();\n          } else {\n            \n            // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen\n            var canvasContainer = canvas.parentNode;\n            canvasContainer.parentNode.insertBefore(canvas, canvasContainer);\n            canvasContainer.parentNode.removeChild(canvasContainer);\n            \n            if (Browser.resizeCanvas) Browser.setWindowedCanvasSize();\n          }\n          if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen);\n          Browser.updateCanvasDimensions(canvas);\n        }\n  \n        if (!Browser.fullScreenHandlersInstalled) {\n          Browser.fullScreenHandlersInstalled = true;\n          document.addEventListener('fullscreenchange', fullScreenChange, false);\n          document.addEventListener('mozfullscreenchange', fullScreenChange, false);\n          document.addEventListener('webkitfullscreenchange', fullScreenChange, false);\n          document.addEventListener('MSFullscreenChange', fullScreenChange, false);\n        }\n  \n        // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root\n        var canvasContainer = document.createElement(\"div\");\n        canvas.parentNode.insertBefore(canvasContainer, canvas);\n        canvasContainer.appendChild(canvas);\n        \n        // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size)\n        canvasContainer.requestFullScreen = canvasContainer['requestFullScreen'] ||\n                                            canvasContainer['mozRequestFullScreen'] ||\n                                            canvasContainer['msRequestFullscreen'] ||\n                                           (canvasContainer['webkitRequestFullScreen'] ? function() { canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null);\n        canvasContainer.requestFullScreen();\n      },requestAnimationFrame:function requestAnimationFrame(func) {\n        if (typeof window === 'undefined') { // Provide fallback to setTimeout if window is undefined (e.g. in Node.js)\n          setTimeout(func, 1000/60);\n        } else {\n          if (!window.requestAnimationFrame) {\n            window.requestAnimationFrame = window['requestAnimationFrame'] ||\n                                           window['mozRequestAnimationFrame'] ||\n                                           window['webkitRequestAnimationFrame'] ||\n                                           window['msRequestAnimationFrame'] ||\n                                           window['oRequestAnimationFrame'] ||\n                                           window['setTimeout'];\n          }\n          window.requestAnimationFrame(func);\n        }\n      },safeCallback:function (func) {\n        return function() {\n          if (!ABORT) return func.apply(null, arguments);\n        };\n      },safeRequestAnimationFrame:function (func) {\n        return Browser.requestAnimationFrame(function() {\n          if (!ABORT) func();\n        });\n      },safeSetTimeout:function (func, timeout) {\n        return setTimeout(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },safeSetInterval:function (func, timeout) {\n        return setInterval(function() {\n          if (!ABORT) func();\n        }, timeout);\n      },getMimetype:function (name) {\n        return {\n          'jpg': 'image/jpeg',\n          'jpeg': 'image/jpeg',\n          'png': 'image/png',\n          'bmp': 'image/bmp',\n          'ogg': 'audio/ogg',\n          'wav': 'audio/wav',\n          'mp3': 'audio/mpeg'\n        }[name.substr(name.lastIndexOf('.')+1)];\n      },getUserMedia:function (func) {\n        if(!window.getUserMedia) {\n          window.getUserMedia = navigator['getUserMedia'] ||\n                                navigator['mozGetUserMedia'];\n        }\n        window.getUserMedia(func);\n      },getMovementX:function (event) {\n        return event['movementX'] ||\n               event['mozMovementX'] ||\n               event['webkitMovementX'] ||\n               0;\n      },getMovementY:function (event) {\n        return event['movementY'] ||\n               event['mozMovementY'] ||\n               event['webkitMovementY'] ||\n               0;\n      },getMouseWheelDelta:function (event) {\n        return Math.max(-1, Math.min(1, event.type === 'DOMMouseScroll' ? event.detail : -event.wheelDelta));\n      },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup\n        if (Browser.pointerLock) {\n          // When the pointer is locked, calculate the coordinates\n          // based on the movement of the mouse.\n          // Workaround for Firefox bug 764498\n          if (event.type != 'mousemove' &&\n              ('mozMovementX' in event)) {\n            Browser.mouseMovementX = Browser.mouseMovementY = 0;\n          } else {\n            Browser.mouseMovementX = Browser.getMovementX(event);\n            Browser.mouseMovementY = Browser.getMovementY(event);\n          }\n          \n          // check if SDL is available\n          if (typeof SDL != \"undefined\") {\n          \tBrowser.mouseX = SDL.mouseX + Browser.mouseMovementX;\n          \tBrowser.mouseY = SDL.mouseY + Browser.mouseMovementY;\n          } else {\n          \t// just add the mouse delta to the current absolut mouse position\n          \t// FIXME: ideally this should be clamped against the canvas size and zero\n          \tBrowser.mouseX += Browser.mouseMovementX;\n          \tBrowser.mouseY += Browser.mouseMovementY;\n          }        \n        } else {\n          // Otherwise, calculate the movement based on the changes\n          // in the coordinates.\n          var rect = Module[\"canvas\"].getBoundingClientRect();\n          var x, y;\n          \n          // Neither .scrollX or .pageXOffset are defined in a spec, but\n          // we prefer .scrollX because it is currently in a spec draft.\n          // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/)\n          var scrollX = ((typeof window.scrollX !== 'undefined') ? window.scrollX : window.pageXOffset);\n          var scrollY = ((typeof window.scrollY !== 'undefined') ? window.scrollY : window.pageYOffset);\n          if (event.type == 'touchstart' ||\n              event.type == 'touchend' ||\n              event.type == 'touchmove') {\n            var t = event.touches.item(0);\n            if (t) {\n              x = t.pageX - (scrollX + rect.left);\n              y = t.pageY - (scrollY + rect.top);\n            } else {\n              return;\n            }\n          } else {\n            x = event.pageX - (scrollX + rect.left);\n            y = event.pageY - (scrollY + rect.top);\n          }\n  \n          // the canvas might be CSS-scaled compared to its backbuffer;\n          // SDL-using content will want mouse coordinates in terms\n          // of backbuffer units.\n          var cw = Module[\"canvas\"].width;\n          var ch = Module[\"canvas\"].height;\n          x = x * (cw / rect.width);\n          y = y * (ch / rect.height);\n  \n          Browser.mouseMovementX = x - Browser.mouseX;\n          Browser.mouseMovementY = y - Browser.mouseY;\n          Browser.mouseX = x;\n          Browser.mouseY = y;\n        }\n      },xhrLoad:function (url, onload, onerror) {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.onload = function xhr_onload() {\n          if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0\n            onload(xhr.response);\n          } else {\n            onerror();\n          }\n        };\n        xhr.onerror = onerror;\n        xhr.send(null);\n      },asyncLoad:function (url, onload, onerror, noRunDep) {\n        Browser.xhrLoad(url, function(arrayBuffer) {\n          assert(arrayBuffer, 'Loading data file \"' + url + '\" failed (no arrayBuffer).');\n          onload(new Uint8Array(arrayBuffer));\n          if (!noRunDep) removeRunDependency('al ' + url);\n        }, function(event) {\n          if (onerror) {\n            onerror();\n          } else {\n            throw 'Loading data file \"' + url + '\" failed.';\n          }\n        });\n        if (!noRunDep) addRunDependency('al ' + url);\n      },resizeListeners:[],updateResizeListeners:function () {\n        var canvas = Module['canvas'];\n        Browser.resizeListeners.forEach(function(listener) {\n          listener(canvas.width, canvas.height);\n        });\n      },setCanvasSize:function (width, height, noUpdates) {\n        var canvas = Module['canvas'];\n        Browser.updateCanvasDimensions(canvas, width, height);\n        if (!noUpdates) Browser.updateResizeListeners();\n      },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () {\n        // check if SDL is available   \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags | 0x00800000; // set SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },setWindowedCanvasSize:function () {\n        // check if SDL is available       \n        if (typeof SDL != \"undefined\") {\n        \tvar flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)];\n        \tflags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag\n        \tHEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags\n        }\n        Browser.updateResizeListeners();\n      },updateCanvasDimensions:function (canvas, wNative, hNative) {\n        if (wNative && hNative) {\n          canvas.widthNative = wNative;\n          canvas.heightNative = hNative;\n        } else {\n          wNative = canvas.widthNative;\n          hNative = canvas.heightNative;\n        }\n        var w = wNative;\n        var h = hNative;\n        if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) {\n          if (w/h < Module['forcedAspectRatio']) {\n            w = Math.round(h * Module['forcedAspectRatio']);\n          } else {\n            h = Math.round(w / Module['forcedAspectRatio']);\n          }\n        }\n        if (((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] ||\n             document['mozFullScreenElement'] || document['mozFullscreenElement'] ||\n             document['fullScreenElement'] || document['fullscreenElement'] ||\n             document['msFullScreenElement'] || document['msFullscreenElement'] ||\n             document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) {\n           var factor = Math.min(screen.width / w, screen.height / h);\n           w = Math.round(w * factor);\n           h = Math.round(h * factor);\n        }\n        if (Browser.resizeCanvas) {\n          if (canvas.width  != w) canvas.width  = w;\n          if (canvas.height != h) canvas.height = h;\n          if (typeof canvas.style != 'undefined') {\n            canvas.style.removeProperty( \"width\");\n            canvas.style.removeProperty(\"height\");\n          }\n        } else {\n          if (canvas.width  != wNative) canvas.width  = wNative;\n          if (canvas.height != hNative) canvas.height = hNative;\n          if (typeof canvas.style != 'undefined') {\n            if (w != wNative || h != hNative) {\n              canvas.style.setProperty( \"width\", w + \"px\", \"important\");\n              canvas.style.setProperty(\"height\", h + \"px\", \"important\");\n            } else {\n              canvas.style.removeProperty( \"width\");\n              canvas.style.removeProperty(\"height\");\n            }\n          }\n        }\n      }};\n\n  \n  \n  function _fwrite(ptr, size, nitems, stream) {\n      // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html\n      var bytesToWrite = nitems * size;\n      if (bytesToWrite == 0) return 0;\n      var fd = _fileno(stream);\n      var bytesWritten = _write(fd, ptr, bytesToWrite);\n      if (bytesWritten == -1) {\n        var streamObj = FS.getStreamFromPtr(stream);\n        if (streamObj) streamObj.error = true;\n        return 0;\n      } else {\n        return Math.floor(bytesWritten / size);\n      }\n    }\n  \n  \n  function __reallyNegative(x) {\n      return x < 0 || (x === 0 && (1/x) === -Infinity);\n    }function __formatString(format, varargs) {\n      var textIndex = format;\n      var argIndex = 0;\n      function getNextArg(type) {\n        // NOTE: Explicitly ignoring type safety. Otherwise this fails:\n        //       int x = 4; printf(\"%c\\n\", (char)x);\n        var ret;\n        if (type === 'double') {\n          ret = (HEAP32[((tempDoublePtr)>>2)]=HEAP32[(((varargs)+(argIndex))>>2)],HEAP32[(((tempDoublePtr)+(4))>>2)]=HEAP32[(((varargs)+((argIndex)+(4)))>>2)],(+(HEAPF64[(tempDoublePtr)>>3])));\n        } else if (type == 'i64') {\n          ret = [HEAP32[(((varargs)+(argIndex))>>2)],\n                 HEAP32[(((varargs)+(argIndex+4))>>2)]];\n  \n        } else {\n          type = 'i32'; // varargs are always i32, i64, or double\n          ret = HEAP32[(((varargs)+(argIndex))>>2)];\n        }\n        argIndex += Runtime.getNativeFieldSize(type);\n        return ret;\n      }\n  \n      var ret = [];\n      var curr, next, currArg;\n      while(1) {\n        var startTextIndex = textIndex;\n        curr = HEAP8[(textIndex)];\n        if (curr === 0) break;\n        next = HEAP8[((textIndex+1)|0)];\n        if (curr == 37) {\n          // Handle flags.\n          var flagAlwaysSigned = false;\n          var flagLeftAlign = false;\n          var flagAlternative = false;\n          var flagZeroPad = false;\n          var flagPadSign = false;\n          flagsLoop: while (1) {\n            switch (next) {\n              case 43:\n                flagAlwaysSigned = true;\n                break;\n              case 45:\n                flagLeftAlign = true;\n                break;\n              case 35:\n                flagAlternative = true;\n                break;\n              case 48:\n                if (flagZeroPad) {\n                  break flagsLoop;\n                } else {\n                  flagZeroPad = true;\n                  break;\n                }\n              case 32:\n                flagPadSign = true;\n                break;\n              default:\n                break flagsLoop;\n            }\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          }\n  \n          // Handle width.\n          var width = 0;\n          if (next == 42) {\n            width = getNextArg('i32');\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n          } else {\n            while (next >= 48 && next <= 57) {\n              width = width * 10 + (next - 48);\n              textIndex++;\n              next = HEAP8[((textIndex+1)|0)];\n            }\n          }\n  \n          // Handle precision.\n          var precisionSet = false, precision = -1;\n          if (next == 46) {\n            precision = 0;\n            precisionSet = true;\n            textIndex++;\n            next = HEAP8[((textIndex+1)|0)];\n            if (next == 42) {\n              precision = getNextArg('i32');\n              textIndex++;\n            } else {\n              while(1) {\n                var precisionChr = HEAP8[((textIndex+1)|0)];\n                if (precisionChr < 48 ||\n                    precisionChr > 57) break;\n                precision = precision * 10 + (precisionChr - 48);\n                textIndex++;\n              }\n            }\n            next = HEAP8[((textIndex+1)|0)];\n          }\n          if (precision < 0) {\n            precision = 6; // Standard default.\n            precisionSet = false;\n          }\n  \n          // Handle integer sizes. WARNING: These assume a 32-bit architecture!\n          var argSize;\n          switch (String.fromCharCode(next)) {\n            case 'h':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 104) {\n                textIndex++;\n                argSize = 1; // char (actually i32 in varargs)\n              } else {\n                argSize = 2; // short (actually i32 in varargs)\n              }\n              break;\n            case 'l':\n              var nextNext = HEAP8[((textIndex+2)|0)];\n              if (nextNext == 108) {\n                textIndex++;\n                argSize = 8; // long long\n              } else {\n                argSize = 4; // long\n              }\n              break;\n            case 'L': // long long\n            case 'q': // int64_t\n            case 'j': // intmax_t\n              argSize = 8;\n              break;\n            case 'z': // size_t\n            case 't': // ptrdiff_t\n            case 'I': // signed ptrdiff_t or unsigned size_t\n              argSize = 4;\n              break;\n            default:\n              argSize = null;\n          }\n          if (argSize) textIndex++;\n          next = HEAP8[((textIndex+1)|0)];\n  \n          // Handle type specifier.\n          switch (String.fromCharCode(next)) {\n            case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': {\n              // Integer.\n              var signed = next == 100 || next == 105;\n              argSize = argSize || 4;\n              var currArg = getNextArg('i' + (argSize * 8));\n              var origArg = currArg;\n              var argText;\n              // Flatten i64-1 [low, high] into a (slightly rounded) double\n              if (argSize == 8) {\n                currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117);\n              }\n              // Truncate to requested size.\n              if (argSize <= 4) {\n                var limit = Math.pow(256, argSize) - 1;\n                currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);\n              }\n              // Format the number.\n              var currAbsArg = Math.abs(currArg);\n              var prefix = '';\n              if (next == 100 || next == 105) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else\n                argText = reSign(currArg, 8 * argSize, 1).toString(10);\n              } else if (next == 117) {\n                if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else\n                argText = unSign(currArg, 8 * argSize, 1).toString(10);\n                currArg = Math.abs(currArg);\n              } else if (next == 111) {\n                argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);\n              } else if (next == 120 || next == 88) {\n                prefix = (flagAlternative && currArg != 0) ? '0x' : '';\n                if (argSize == 8 && i64Math) {\n                  if (origArg[1]) {\n                    argText = (origArg[1]>>>0).toString(16);\n                    var lower = (origArg[0]>>>0).toString(16);\n                    while (lower.length < 8) lower = '0' + lower;\n                    argText += lower;\n                  } else {\n                    argText = (origArg[0]>>>0).toString(16);\n                  }\n                } else\n                if (currArg < 0) {\n                  // Represent negative numbers in hex as 2's complement.\n                  currArg = -currArg;\n                  argText = (currAbsArg - 1).toString(16);\n                  var buffer = [];\n                  for (var i = 0; i < argText.length; i++) {\n                    buffer.push((0xF - parseInt(argText[i], 16)).toString(16));\n                  }\n                  argText = buffer.join('');\n                  while (argText.length < argSize * 2) argText = 'f' + argText;\n                } else {\n                  argText = currAbsArg.toString(16);\n                }\n                if (next == 88) {\n                  prefix = prefix.toUpperCase();\n                  argText = argText.toUpperCase();\n                }\n              } else if (next == 112) {\n                if (currAbsArg === 0) {\n                  argText = '(nil)';\n                } else {\n                  prefix = '0x';\n                  argText = currAbsArg.toString(16);\n                }\n              }\n              if (precisionSet) {\n                while (argText.length < precision) {\n                  argText = '0' + argText;\n                }\n              }\n  \n              // Add sign if needed\n              if (currArg >= 0) {\n                if (flagAlwaysSigned) {\n                  prefix = '+' + prefix;\n                } else if (flagPadSign) {\n                  prefix = ' ' + prefix;\n                }\n              }\n  \n              // Move sign to prefix so we zero-pad after the sign\n              if (argText.charAt(0) == '-') {\n                prefix = '-' + prefix;\n                argText = argText.substr(1);\n              }\n  \n              // Add padding.\n              while (prefix.length + argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad) {\n                    argText = '0' + argText;\n                  } else {\n                    prefix = ' ' + prefix;\n                  }\n                }\n              }\n  \n              // Insert the result into the buffer.\n              argText = prefix + argText;\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': {\n              // Float.\n              var currArg = getNextArg('double');\n              var argText;\n              if (isNaN(currArg)) {\n                argText = 'nan';\n                flagZeroPad = false;\n              } else if (!isFinite(currArg)) {\n                argText = (currArg < 0 ? '-' : '') + 'inf';\n                flagZeroPad = false;\n              } else {\n                var isGeneral = false;\n                var effectivePrecision = Math.min(precision, 20);\n  \n                // Convert g/G to f/F or e/E, as per:\n                // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html\n                if (next == 103 || next == 71) {\n                  isGeneral = true;\n                  precision = precision || 1;\n                  var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);\n                  if (precision > exponent && exponent >= -4) {\n                    next = ((next == 103) ? 'f' : 'F').charCodeAt(0);\n                    precision -= exponent + 1;\n                  } else {\n                    next = ((next == 103) ? 'e' : 'E').charCodeAt(0);\n                    precision--;\n                  }\n                  effectivePrecision = Math.min(precision, 20);\n                }\n  \n                if (next == 101 || next == 69) {\n                  argText = currArg.toExponential(effectivePrecision);\n                  // Make sure the exponent has at least 2 digits.\n                  if (/[eE][-+]\\d$/.test(argText)) {\n                    argText = argText.slice(0, -1) + '0' + argText.slice(-1);\n                  }\n                } else if (next == 102 || next == 70) {\n                  argText = currArg.toFixed(effectivePrecision);\n                  if (currArg === 0 && __reallyNegative(currArg)) {\n                    argText = '-' + argText;\n                  }\n                }\n  \n                var parts = argText.split('e');\n                if (isGeneral && !flagAlternative) {\n                  // Discard trailing zeros and periods.\n                  while (parts[0].length > 1 && parts[0].indexOf('.') != -1 &&\n                         (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {\n                    parts[0] = parts[0].slice(0, -1);\n                  }\n                } else {\n                  // Make sure we have a period in alternative mode.\n                  if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';\n                  // Zero pad until required precision.\n                  while (precision > effectivePrecision++) parts[0] += '0';\n                }\n                argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');\n  \n                // Capitalize 'E' if needed.\n                if (next == 69) argText = argText.toUpperCase();\n  \n                // Add sign.\n                if (currArg >= 0) {\n                  if (flagAlwaysSigned) {\n                    argText = '+' + argText;\n                  } else if (flagPadSign) {\n                    argText = ' ' + argText;\n                  }\n                }\n              }\n  \n              // Add padding.\n              while (argText.length < width) {\n                if (flagLeftAlign) {\n                  argText += ' ';\n                } else {\n                  if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {\n                    argText = argText[0] + '0' + argText.slice(1);\n                  } else {\n                    argText = (flagZeroPad ? '0' : ' ') + argText;\n                  }\n                }\n              }\n  \n              // Adjust case.\n              if (next < 97) argText = argText.toUpperCase();\n  \n              // Insert the result into the buffer.\n              argText.split('').forEach(function(chr) {\n                ret.push(chr.charCodeAt(0));\n              });\n              break;\n            }\n            case 's': {\n              // String.\n              var arg = getNextArg('i8*');\n              var argLength = arg ? _strlen(arg) : '(null)'.length;\n              if (precisionSet) argLength = Math.min(argLength, precision);\n              if (!flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              if (arg) {\n                for (var i = 0; i < argLength; i++) {\n                  ret.push(HEAPU8[((arg++)|0)]);\n                }\n              } else {\n                ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true));\n              }\n              if (flagLeftAlign) {\n                while (argLength < width--) {\n                  ret.push(32);\n                }\n              }\n              break;\n            }\n            case 'c': {\n              // Character.\n              if (flagLeftAlign) ret.push(getNextArg('i8'));\n              while (--width > 0) {\n                ret.push(32);\n              }\n              if (!flagLeftAlign) ret.push(getNextArg('i8'));\n              break;\n            }\n            case 'n': {\n              // Write the length written so far to the next parameter.\n              var ptr = getNextArg('i32*');\n              HEAP32[((ptr)>>2)]=ret.length;\n              break;\n            }\n            case '%': {\n              // Literal percent sign.\n              ret.push(curr);\n              break;\n            }\n            default: {\n              // Unknown specifiers remain untouched.\n              for (var i = startTextIndex; i < textIndex + 2; i++) {\n                ret.push(HEAP8[(i)]);\n              }\n            }\n          }\n          textIndex += 2;\n          // TODO: Support a/A (hex float) and m (last error) specifiers.\n          // TODO: Support %1${specifier} for arg selection.\n        } else {\n          ret.push(curr);\n          textIndex += 1;\n        }\n      }\n      return ret;\n    }function _fprintf(stream, format, varargs) {\n      // int fprintf(FILE *restrict stream, const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var result = __formatString(format, varargs);\n      var stack = Runtime.stackSave();\n      var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream);\n      Runtime.stackRestore(stack);\n      return ret;\n    }function _printf(format, varargs) {\n      // int printf(const char *restrict format, ...);\n      // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html\n      var stdout = HEAP32[((_stdout)>>2)];\n      return _fprintf(stdout, format, varargs);\n    }\n\n\n  \n  function _emscripten_memcpy_big(dest, src, num) {\n      HEAPU8.set(HEAPU8.subarray(src, src+num), dest);\n      return dest;\n    } \n  Module[\"_memcpy\"] = _memcpy;\nFS.staticInit();__ATINIT__.unshift({ func: function() { if (!Module[\"noFSInit\"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module[\"FS_createFolder\"] = FS.createFolder;Module[\"FS_createPath\"] = FS.createPath;Module[\"FS_createDataFile\"] = FS.createDataFile;Module[\"FS_createPreloadedFile\"] = FS.createPreloadedFile;Module[\"FS_createLazyFile\"] = FS.createLazyFile;Module[\"FS_createLink\"] = FS.createLink;Module[\"FS_createDevice\"] = FS.createDevice;\n___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0;\n__ATINIT__.unshift({ func: function() { TTY.init() } });__ATEXIT__.push({ func: function() { TTY.shutdown() } });TTY.utf8 = new Runtime.UTF8Processor();\nif (ENVIRONMENT_IS_NODE) { var fs = require(\"fs\"); NODEFS.staticInit(); }\n__ATINIT__.push({ func: function() { SOCKFS.root = FS.mount(SOCKFS, {}, null); } });\n_fputc.ret = allocate([0], \"i8\", ALLOC_STATIC);\nModule[\"requestFullScreen\"] = function Module_requestFullScreen(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) };\n  Module[\"requestAnimationFrame\"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };\n  Module[\"setCanvasSize\"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };\n  Module[\"pauseMainLoop\"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };\n  Module[\"resumeMainLoop\"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };\n  Module[\"getUserMedia\"] = function Module_getUserMedia() { Browser.getUserMedia() }\nSTACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP);\n\nstaticSealed = true; // seal the static portion of memory\n\nSTACK_MAX = STACK_BASE + 5242880;\n\nDYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX);\n\nassert(DYNAMIC_BASE < TOTAL_MEMORY, \"TOTAL_MEMORY not big enough for stack\");\n\n\nvar Math_min = Math.min;\nfunction asmPrintInt(x, y) {\n  Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack);\n}\nfunction asmPrintFloat(x, y) {\n  Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack);\n}\n// EMSCRIPTEN_START_ASM\nvar asm=(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.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=0;var n=0;var o=0;var p=0;var q=+env.NaN,r=+env.Infinity;var s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0.0;var B=0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=global.Math.floor;var M=global.Math.abs;var N=global.Math.sqrt;var O=global.Math.pow;var P=global.Math.cos;var Q=global.Math.sin;var R=global.Math.tan;var S=global.Math.acos;var T=global.Math.asin;var U=global.Math.atan;var V=global.Math.atan2;var W=global.Math.exp;var X=global.Math.log;var Y=global.Math.ceil;var Z=global.Math.imul;var _=env.abort;var $=env.assert;var aa=env.asmPrintInt;var ba=env.asmPrintFloat;var ca=env.min;var da=env._puts;var ea=env._llvm_lifetime_start;var fa=env._fflush;var ga=env.__formatString;var ha=env._fputc;var ia=env._send;var ja=env._pwrite;var ka=env._fileno;var la=env.__reallyNegative;var ma=env._fwrite;var na=env._malloc;var oa=env._printf;var pa=env._fprintf;var qa=env.___setErrNo;var ra=env._llvm_lifetime_end;var sa=env._fputs;var ta=env._free;var ua=env._write;var va=env._emscripten_memcpy_big;var wa=env._mkport;var xa=0.0;\n// EMSCRIPTEN_START_FUNCS\nfunction ya(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function za(){return i|0}function Aa(a){a=a|0;i=a}function Ba(a,b){a=a|0;b=b|0;if((m|0)==0){m=a;n=b}}function Ca(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function Da(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function Ea(a){a=a|0;B=a}function Fa(a){a=a|0;C=a}function Ga(a){a=a|0;D=a}function Ha(a){a=a|0;E=a}function Ia(a){a=a|0;F=a}function Ja(a){a=a|0;G=a}function Ka(a){a=a|0;H=a}function La(a){a=a|0;I=a}function Ma(a){a=a|0;J=a}function Na(a){a=a|0;K=a}function Oa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+8|0;e=d;f=i;i=i+8|0;g=i;i=i+8|0;h=32+(a<<2)|0;a=c[h>>2]|0;if((a|0)>0){j=c[56+(a<<3)>>2]|0;k=60+(a<<3)|0;l=c[k>>2]|0;c[k>>2]=c[12];c[12]=a;c[h>>2]=l;m=j}else{c[g>>2]=240;oa(8,g|0)|0;m=0}g=32+(b<<2)|0;b=c[g>>2]|0;do{if((b|0)>0){if((c[56+(b<<3)>>2]|0)>(m|0)){break}c[f>>2]=224;oa(8,f|0)|0;n=c[64]|0;o=n+1|0;c[64]=o;i=d;return}}while(0);f=c[12]|0;if((f|0)>0){c[12]=c[60+(f<<3)>>2];p=b;q=f}else{c[e>>2]=208;oa(8,e|0)|0;p=c[g>>2]|0;q=0}c[60+(q<<3)>>2]=p;c[g>>2]=q;c[56+(q<<3)>>2]=m;n=c[64]|0;o=n+1|0;c[64]=o;i=d;return}function Pa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;if((c|0)==1){e=a}else{f=a;a=c;while(1){c=6-f-b|0;g=a+ -1|0;Pa(f,c,g);Oa(f,b);if((g|0)==1){e=c;break}else{a=g;f=c}}}Oa(e,b);i=d;return}function Qa(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;a=i;i=i+8|0;b=a;d=i;i=i+8|0;c[68>>2]=0;c[76>>2]=1;c[84>>2]=2;c[92>>2]=3;c[100>>2]=4;c[108>>2]=5;c[116>>2]=6;c[124>>2]=7;c[132>>2]=8;c[140>>2]=9;c[148>>2]=10;c[156>>2]=11;c[164>>2]=12;c[172>>2]=13;c[180>>2]=14;c[188>>2]=15;c[196>>2]=16;c[204>>2]=17;c[12]=18;c[36>>2]=0;e=0;f=14;while(1){do{if((e|0)>0){if((c[56+(e<<3)>>2]|0)>(f|0)){g=5;break}c[d>>2]=224;oa(8,d|0)|0}else{g=5}}while(0);if((g|0)==5){g=0;h=c[12]|0;if((h|0)>0){c[12]=c[60+(h<<3)>>2];j=e;k=h}else{c[b>>2]=208;oa(8,b|0)|0;j=c[36>>2]|0;k=0}c[60+(k<<3)>>2]=j;c[36>>2]=k;c[56+(k<<3)>>2]=f}h=f+ -1|0;if((h|0)<=0){break}e=c[36>>2]|0;f=h}c[40>>2]=0;c[44>>2]=0;c[64]=0;Pa(1,2,14);if((c[64]|0)==16383){i=a;return}da(264)|0;i=a;return}function Ra(){var a=0,b=0;a=i;b=0;do{Qa();b=b+1|0;}while((b|0)!=1e3);i=a;return 0}function Sa(){}function Ta(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function Ua(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function Va(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return va(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}\n\n\n\n\n// EMSCRIPTEN_END_FUNCS\nreturn{_strlen:Ta,_memcpy:Va,_main:Ra,_memset:Ua,runPostSets:Sa,stackAlloc:ya,stackSave:za,stackRestore:Aa,setThrew:Ba,setTempRet0:Ea,setTempRet1:Fa,setTempRet2:Ga,setTempRet3:Ha,setTempRet4:Ia,setTempRet5:Ja,setTempRet6:Ka,setTempRet7:La,setTempRet8:Ma,setTempRet9:Na}})\n\n\n// EMSCRIPTEN_END_ASM\n({ \"Math\": Math, \"Int8Array\": Int8Array, \"Int16Array\": Int16Array, \"Int32Array\": Int32Array, \"Uint8Array\": Uint8Array, \"Uint16Array\": Uint16Array, \"Uint32Array\": Uint32Array, \"Float32Array\": Float32Array, \"Float64Array\": Float64Array }, { \"abort\": abort, \"assert\": assert, \"asmPrintInt\": asmPrintInt, \"asmPrintFloat\": asmPrintFloat, \"min\": Math_min, \"_puts\": _puts, \"_llvm_lifetime_start\": _llvm_lifetime_start, \"_fflush\": _fflush, \"__formatString\": __formatString, \"_fputc\": _fputc, \"_send\": _send, \"_pwrite\": _pwrite, \"_fileno\": _fileno, \"__reallyNegative\": __reallyNegative, \"_fwrite\": _fwrite, \"_malloc\": _malloc, \"_printf\": _printf, \"_fprintf\": _fprintf, \"___setErrNo\": ___setErrNo, \"_llvm_lifetime_end\": _llvm_lifetime_end, \"_fputs\": _fputs, \"_free\": _free, \"_write\": _write, \"_emscripten_memcpy_big\": _emscripten_memcpy_big, \"_mkport\": _mkport, \"STACKTOP\": STACKTOP, \"STACK_MAX\": STACK_MAX, \"tempDoublePtr\": tempDoublePtr, \"ABORT\": ABORT, \"NaN\": NaN, \"Infinity\": Infinity }, buffer);\nvar _strlen = Module[\"_strlen\"] = asm[\"_strlen\"];\nvar _memcpy = Module[\"_memcpy\"] = asm[\"_memcpy\"];\nvar _main = Module[\"_main\"] = asm[\"_main\"];\nvar _memset = Module[\"_memset\"] = asm[\"_memset\"];\nvar runPostSets = Module[\"runPostSets\"] = asm[\"runPostSets\"];\n\nRuntime.stackAlloc = function(size) { return asm['stackAlloc'](size) };\nRuntime.stackSave = function() { return asm['stackSave']() };\nRuntime.stackRestore = function(top) { asm['stackRestore'](top) };\n\n\n// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included\nvar i64Math = null;\n\n// === Auto-generated postamble setup entry stuff ===\n\nif (memoryInitializer) {\n  if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {\n    var data = Module['readBinary'](memoryInitializer);\n    HEAPU8.set(data, STATIC_BASE);\n  } else {\n    addRunDependency('memory initializer');\n    Browser.asyncLoad(memoryInitializer, function(data) {\n      HEAPU8.set(data, STATIC_BASE);\n      removeRunDependency('memory initializer');\n    }, function(data) {\n      throw 'could not load memory initializer ' + memoryInitializer;\n    });\n  }\n}\n\nfunction ExitStatus(status) {\n  this.name = \"ExitStatus\";\n  this.message = \"Program terminated with exit(\" + status + \")\";\n  this.status = status;\n};\nExitStatus.prototype = new Error();\nExitStatus.prototype.constructor = ExitStatus;\n\nvar initialStackTop;\nvar preloadStartTime = null;\nvar calledMain = false;\n\ndependenciesFulfilled = function runCaller() {\n  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)\n  if (!Module['calledRun'] && shouldRunNow) run();\n  if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled\n}\n\nModule['callMain'] = Module.callMain = function callMain(args) {\n  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)');\n  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');\n\n  args = args || [];\n\n  if (ENVIRONMENT_IS_WEB && preloadStartTime !== null) {\n    Module.printErr('preload time: ' + (Date.now() - preloadStartTime) + ' ms');\n  }\n\n  ensureInitRuntime();\n\n  var argc = args.length+1;\n  function pad() {\n    for (var i = 0; i < 4-1; i++) {\n      argv.push(0);\n    }\n  }\n  var argv = [allocate(intArrayFromString(\"/bin/this.program\"), 'i8', ALLOC_NORMAL) ];\n  pad();\n  for (var i = 0; i < argc-1; i = i + 1) {\n    argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL));\n    pad();\n  }\n  argv.push(0);\n  argv = allocate(argv, 'i32', ALLOC_NORMAL);\n\n  initialStackTop = STACKTOP;\n\n  try {\n\n    var ret = Module['_main'](argc, argv, 0);\n\n\n    // if we're not running an evented main loop, it's time to exit\n    if (!Module['noExitRuntime']) {\n      exit(ret);\n    }\n  }\n  catch(e) {\n    if (e instanceof ExitStatus) {\n      // exit() throws this once it's done to make sure execution\n      // has been stopped completely\n      return;\n    } else if (e == 'SimulateInfiniteLoop') {\n      // running an evented main loop, don't immediately exit\n      Module['noExitRuntime'] = true;\n      return;\n    } else {\n      if (e && typeof e === 'object' && e.stack) Module.printErr('exception thrown: ' + [e, e.stack]);\n      throw e;\n    }\n  } finally {\n    calledMain = true;\n  }\n}\n\n\n\n\nfunction run(args) {\n  args = args || Module['arguments'];\n\n  if (preloadStartTime === null) preloadStartTime = Date.now();\n\n  if (runDependencies > 0) {\n    Module.printErr('run() called, but dependencies remain, so not running');\n    return;\n  }\n\n  preRun();\n\n  if (runDependencies > 0) return; // a preRun added a dependency, run will be called later\n  if (Module['calledRun']) return; // run may have just been called through dependencies being fulfilled just in this very frame\n\n  function doRun() {\n    if (Module['calledRun']) return; // run may have just been called while the async setStatus time below was happening\n    Module['calledRun'] = true;\n\n    ensureInitRuntime();\n\n    preMain();\n\n    if (Module['_main'] && shouldRunNow) {\n      Module['callMain'](args);\n    }\n\n    postRun();\n  }\n\n  if (Module['setStatus']) {\n    Module['setStatus']('Running...');\n    setTimeout(function() {\n      setTimeout(function() {\n        Module['setStatus']('');\n      }, 1);\n      if (!ABORT) doRun();\n    }, 1);\n  } else {\n    doRun();\n  }\n}\nModule['run'] = Module.run = run;\n\nfunction exit(status) {\n  ABORT = true;\n  EXITSTATUS = status;\n  STACKTOP = initialStackTop;\n\n  // exit the runtime\n  exitRuntime();\n\n  // TODO We should handle this differently based on environment.\n  // In the browser, the best we can do is throw an exception\n  // to halt execution, but in node we could process.exit and\n  // I'd imagine SM shell would have something equivalent.\n  // This would let us set a proper exit status (which\n  // would be great for checking test exit statuses).\n  // https://github.com/kripken/emscripten/issues/1371\n\n  // throw an exception to halt the current execution\n  throw new ExitStatus(status);\n}\nModule['exit'] = Module.exit = exit;\n\nfunction abort(text) {\n  if (text) {\n    Module.print(text);\n    Module.printErr(text);\n  }\n\n  ABORT = true;\n  EXITSTATUS = 1;\n\n  var extra = '\\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.';\n\n  throw 'abort() at ' + stackTrace() + extra;\n}\nModule['abort'] = Module.abort = abort;\n\n// {{PRE_RUN_ADDITIONS}}\n\nif (Module['preInit']) {\n  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];\n  while (Module['preInit'].length > 0) {\n    Module['preInit'].pop()();\n  }\n}\n\n// shouldRunNow refers to calling main(), not run().\nvar shouldRunNow = true;\nif (Module['noInitialRun']) {\n  shouldRunNow = false;\n}\n\n\nrun();\n\n// {{POST_RUN_ADDITIONS}}\n\n\n\n\n\n\n// {{MODULE_ADDITIONS}}\n\n\n\n\n\n\n"},
];
