From c93138b59e8f28b3d412cd7ec0c6631fd27e3e1b Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 13 Feb 2010 04:51:56 +0100 Subject: [PATCH] Major redesign of function call handling. Drop call gates. Use function headers, dispatched like bytecodes. Emit BC_FUNCF/BC_FUNCV bytecode at PC 0 for all Lua functions. C functions and ASM fast functions get extra bytecodes. Modify internal calling convention: new base in BASE (formerly in RA). Can now use better C function wrapper semantics (dynamic on/off). Prerequisite for call hooks with zero-overhead if disabled. Prerequisite for compiling recursive calls. Prerequisite for efficient 32/64 bit prototype guards. --- doc/api.html | 38 +- src/Makefile | 4 +- src/Makefile.dep | 51 +- src/buildvm.c | 12 +- src/buildvm_lib.c | 31 +- src/buildvm_peobj.c | 7 +- src/buildvm_x64.h | 2225 +++++++++++++++++++------------------- src/buildvm_x64win.h | 2445 +++++++++++++++++++++--------------------- src/buildvm_x86.dasc | 1179 ++++++++++---------- src/buildvm_x86.h | 2379 ++++++++++++++++++++-------------------- src/lib_base.c | 18 +- src/lib_io.c | 3 +- src/lib_jit.c | 8 +- src/lib_package.c | 4 +- src/lib_string.c | 3 +- src/lj_api.c | 5 +- src/lj_asm.c | 4 +- src/lj_bc.c | 7 +- src/lj_bc.h | 21 +- src/lj_def.h | 12 +- src/lj_dispatch.c | 62 +- src/lj_dispatch.h | 22 +- src/lj_err.c | 17 +- src/lj_func.c | 3 +- src/lj_gdbjit.c | 5 +- src/lj_lib.c | 11 +- src/lj_lib.h | 13 + src/lj_obj.h | 9 +- src/lj_parse.c | 38 +- src/lj_record.c | 8 +- src/lj_state.c | 14 +- src/lj_trace.c | 8 +- src/lj_vm.h | 6 - src/msvcbuild.bat | 2 +- 34 files changed, 4410 insertions(+), 4264 deletions(-) diff --git a/doc/api.html b/doc/api.html index af438ad2..f20e5e21 100644 --- a/doc/api.html +++ b/doc/api.html @@ -258,13 +258,12 @@ side traces from the cache.

luaJIT_setmode(L, idx, LUAJIT_MODE_WRAPCFUNC|flag)

-This mode defines a wrapper function for calls to C functions. The -first time this is called with LUAJIT_MODE_ON, the stack -index at idx must be a lightuserdata object holding -a pointer to the wrapper function. All subsequently created C -functions are called through the wrapper functions. After the initial -definition idx can be left at 0 when turning the mode -on or off. +This mode defines a wrapper function for calls to C functions. If +called with LUAJIT_MODE_ON, the stack index at idx +must be a lightuserdata object holding a pointer to the wrapper +function. From now on all C functions are called through the wrapper +function. If called with LUAJIT_MODE_OFF this mode is turned +off and all C functions are directly called.

The wrapper function can be used for debugging purposes or to catch @@ -291,38 +290,27 @@ static int wrap_exceptions(lua_State *L, lua_CFunction f) return lua_error(L); // Rethrow as a Lua error. } -static int myregister(lua_State *L) +static int myinit(lua_State *L) { ... // Define wrapper function and enable it. lua_pushlightuserdata(L, (void *)wrap_exceptions); luaJIT_setmode(L, -1, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON); lua_pop(L, 1); - luaL_register(L, "mymodule", myfuncs); // Pass luaL_Reg list. - luaJIT_setmode(L, 0, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_OFF); - ... - // Wrap some more C++ functions which might throw an exception. - luaJIT_setmode(L, 0, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_ON); - lua_pushcfunction(L, mythrowingfunc1); - lua_pushcclosure(L, mythrowingfunc2, 1); - luaJIT_setmode(L, 0, LUAJIT_MODE_WRAPCFUNC|LUAJIT_MODE_OFF); ... }

Note that you can only define a single global wrapper function, so be careful when using this mechanism from multiple C++ modules. -Also note that this mechanism is not without overhead. It should only -be enabled for definitions of C++ functions that can actually throw -exceptions. If you're embedding LuaJIT into an application, only -enable it after running luaL_openlibs. +Also note that this mechanism is not without overhead.

-LuaJIT already intercepts exception handling for all x64 systems and -for x86 systems using DWARF2 stack unwinding (e.g. Linux, OSX). This -is a zero-cost mechanism and always enabled. You don't need to use any -wrapper functions, except when you want to get a more specific error -message than "C++ exception". +LuaJIT already intercepts exception handling for systems using DWARF2 +stack unwinding (e.g. Linux or OSX) and for Windows/x64 (but not +for Windows/x86). This is a zero-cost mechanism and always enabled. +You don't need to use any wrapper functions, except when you want to get +a more specific error message than "C++ exception".


diff --git a/src/Makefile b/src/Makefile index e3a3fbc2..5fef367a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -412,9 +412,9 @@ $(LJVM_BOUT): $(BUILDVM_T) $(E) "BUILDVM $@" $(Q)$(BUILDVM_X) -m $(LJVM_MODE) -o $@ -lj_bcdef.h: $(BUILDVM_T) +lj_bcdef.h: $(BUILDVM_T) $(LJLIB_C) $(E) "BUILDVM $@" - $(Q)$(BUILDVM_X) -m bcdef -o $@ + $(Q)$(BUILDVM_X) -m bcdef -o $@ $(LJLIB_C) lj_ffdef.h: $(BUILDVM_T) $(LJLIB_C) $(E) "BUILDVM $@" diff --git a/src/Makefile.dep b/src/Makefile.dep index ef64bd9a..68b4f532 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -14,7 +14,8 @@ lib_aux.o: lib_aux.c lua.h luaconf.h lauxlib.h lj_obj.h lj_def.h \ lj_arch.h lj_err.h lj_errmsg.h lj_state.h lj_lib.h lj_alloc.h lib_base.o: lib_base.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ lj_def.h lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h \ - lj_meta.h lj_state.h lj_ff.h lj_ffdef.h lj_ctype.h lj_lib.h lj_libdef.h + lj_meta.h lj_state.h lj_bc.h lj_ff.h lj_ffdef.h lj_dispatch.h lj_jit.h \ + lj_ir.h lj_ctype.h lj_lib.h lj_libdef.h lib_bit.o: lib_bit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ lj_arch.h lj_err.h lj_errmsg.h lj_str.h lj_lib.h lj_libdef.h lib_debug.o: lib_debug.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ @@ -22,8 +23,8 @@ lib_debug.o: lib_debug.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_ff.h lj_ffdef.h \ - lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_lib.h \ - lj_libdef.h + lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h lj_traceerr.h \ + lj_lib.h lj_libdef.h lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h \ lj_obj.h lj_def.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_bc.h \ lj_ir.h lj_jit.h lj_iropt.h lj_dispatch.h lj_vm.h lj_vmevent.h lj_lib.h \ @@ -43,7 +44,7 @@ lib_table.o: lib_table.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h \ lj_alloc.o: lj_alloc.c lj_def.h lua.h luaconf.h lj_arch.h lj_alloc.h lj_api.o: lj_api.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_udata.h lj_meta.h \ - lj_state.h lj_frame.h lj_bc.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h \ + lj_state.h lj_bc.h lj_frame.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h \ lj_traceerr.h lj_vm.h lj_lex.h lj_parse.h lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ir.h lj_jit.h lj_iropt.h \ @@ -53,14 +54,15 @@ lj_bc.o: lj_bc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_bc.h \ lj_bcdef.h lj_ctype.o: lj_ctype.c lj_ctype.h lj_def.h lua.h luaconf.h lj_dispatch.o: lj_dispatch.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_err.h lj_errmsg.h lj_state.h lj_frame.h lj_bc.h lj_jit.h lj_ir.h \ - lj_trace.h lj_dispatch.h lj_traceerr.h lj_vm.h luajit.h + lj_err.h lj_errmsg.h lj_state.h lj_frame.h lj_bc.h lj_ff.h lj_ffdef.h \ + lj_jit.h lj_ir.h lj_trace.h lj_dispatch.h lj_traceerr.h lj_vm.h \ + luajit.h lj_err.o: lj_err.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_err.h \ lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_state.h lj_frame.h lj_bc.h \ lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_func.o: lj_func.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ - lj_func.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_traceerr.h \ - lj_vm.h + lj_func.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h lj_bc.h \ + lj_traceerr.h lj_vm.h lj_gc.o: lj_gc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_udata.h lj_meta.h \ lj_state.h lj_frame.h lj_bc.h lj_trace.h lj_jit.h lj_ir.h lj_dispatch.h \ @@ -70,14 +72,14 @@ lj_gdbjit.o: lj_gdbjit.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ lj_ir.h lj_dispatch.h lj_ir.o: lj_ir.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_str.h lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ - lj_traceerr.h lj_lib.h + lj_bc.h lj_traceerr.h lj_lib.h lj_lex.o: lj_lex.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_err.h lj_errmsg.h lj_str.h lj_lex.h lj_parse.h lj_ctype.h lj_lib.o: lj_lib.c lauxlib.h lua.h luaconf.h lj_obj.h lj_def.h lj_arch.h \ - lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_vm.h \ - lj_lib.h + lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h lj_bc.h \ + lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h lj_lib.h lj_mcode.o: lj_mcode.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_gc.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h lj_dispatch.h \ + lj_gc.h lj_jit.h lj_ir.h lj_mcode.h lj_trace.h lj_dispatch.h lj_bc.h \ lj_traceerr.h lj_meta.o: lj_meta.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \ lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_meta.h lj_bc.h lj_vm.h @@ -85,11 +87,11 @@ lj_obj.o: lj_obj.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_opt_dce.o: lj_opt_dce.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ lj_ir.h lj_jit.h lj_iropt.h lj_opt_fold.o: lj_opt_fold.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_str.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h \ + lj_str.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h lj_dispatch.h lj_bc.h \ lj_traceerr.h lj_vm.h lj_folddef.h lj_opt_loop.o: lj_opt_loop.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ lj_err.h lj_errmsg.h lj_str.h lj_ir.h lj_jit.h lj_iropt.h lj_trace.h \ - lj_dispatch.h lj_traceerr.h lj_snap.h lj_vm.h + lj_dispatch.h lj_bc.h lj_traceerr.h lj_snap.h lj_vm.h lj_opt_mem.o: lj_opt_mem.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ lj_tab.h lj_ir.h lj_jit.h lj_iropt.h lj_opt_narrow.o: lj_opt_narrow.c lj_obj.h lua.h luaconf.h lj_def.h \ @@ -122,21 +124,20 @@ lj_trace.o: lj_trace.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ lj_udata.o: lj_udata.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ lj_gc.h lj_udata.h lj_vmevent.o: lj_vmevent.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \ - lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_jit.h lj_ir.h lj_vm.h \ - lj_vmevent.h + lj_str.h lj_tab.h lj_state.h lj_dispatch.h lj_bc.h lj_jit.h lj_ir.h \ + lj_vm.h lj_vmevent.h ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \ lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_str.h lj_tab.h lj_func.h \ lj_udata.h lj_meta.h lj_state.h lj_frame.h lj_bc.h lj_trace.h lj_jit.h \ lj_ir.h lj_dispatch.h lj_traceerr.h lj_vm.h lj_err.c lj_ctype.c \ lj_ctype.h lj_bc.c lj_bcdef.h lj_obj.c lj_str.c lj_tab.c lj_func.c \ lj_udata.c lj_meta.c lj_state.c lj_lex.h lj_alloc.h lj_dispatch.c \ - luajit.h lj_vmevent.c lj_vmevent.h lj_api.c lj_parse.h lj_lex.c \ - lj_parse.c lj_lib.c lj_lib.h lj_ir.c lj_iropt.h lj_opt_mem.c \ - lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c lj_opt_loop.c \ - lj_snap.h lj_mcode.c lj_mcode.h lj_snap.c lj_target.h lj_target_x86.h \ - lj_record.c lj_ff.h lj_ffdef.h lj_record.h lj_asm.h lj_recdef.h \ - lj_asm.c lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c \ - lib_base.c lualib.h lj_libdef.h lib_math.c lib_string.c lib_table.c \ - lib_io.c lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c \ - lib_init.c + lj_ff.h lj_ffdef.h luajit.h lj_vmevent.c lj_vmevent.h lj_api.c \ + lj_parse.h lj_lex.c lj_parse.c lj_lib.c lj_lib.h lj_ir.c lj_iropt.h \ + lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c \ + lj_opt_loop.c lj_snap.h lj_mcode.c lj_mcode.h lj_snap.c lj_target.h \ + lj_target_x86.h lj_record.c lj_record.h lj_asm.h lj_recdef.h lj_asm.c \ + lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c \ + lualib.h lj_libdef.h lib_math.c lib_string.c lib_table.c lib_io.c \ + lib_os.c lib_package.c lib_debug.c lib_bit.c lib_jit.c lib_init.c luajit.o: luajit.c lua.h luaconf.h lauxlib.h lualib.h luajit.h diff --git a/src/buildvm.c b/src/buildvm.c index 44fd2c71..dd0cbcc6 100644 --- a/src/buildvm.c +++ b/src/buildvm.c @@ -256,12 +256,12 @@ static void emit_bcdef(BuildCtx *ctx) { int i; fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n"); - fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_ofs[BC__MAX+1] = {\n "); + fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_ofs[] = {\n"); for (i = 0; i < ctx->npc; i++) { - fprintf(ctx->fp, " %4d,", ctx->sym_ofs[i]); - if ((i & 7) == 7) fprintf(ctx->fp, "\n "); + if (i != 0) + fprintf(ctx->fp, ",\n"); + fprintf(ctx->fp, "%d", ctx->sym_ofs[i]); } - fprintf(ctx->fp, " 0\n};\n\n"); } /* Emit VM definitions as Lua code for debug modules. */ @@ -433,10 +433,12 @@ int main(int argc, char **argv) break; case BUILD_bcdef: emit_bcdef(ctx); + emit_lib(ctx); break; case BUILD_vmdef: emit_vmdef(ctx); - /* fallthrough */ + emit_lib(ctx); + break; case BUILD_ffdef: case BUILD_libdef: case BUILD_recdef: diff --git a/src/buildvm_lib.c b/src/buildvm_lib.c index 3cf8f522..e77240c5 100644 --- a/src/buildvm_lib.c +++ b/src/buildvm_lib.c @@ -15,7 +15,7 @@ static char modname[80]; static size_t modnamelen; static char funcname[80]; static int modstate, regfunc; -static int ffid, recffid; +static int ffid, recffid, ffasmfunc; enum { REGFUNC_OK, @@ -77,7 +77,8 @@ static void libdef_module(BuildCtx *ctx, char *p, int arg) libdef_endmodule(ctx); optr = obuf; *optr++ = (uint8_t)ffid; - *optr++ = 0; + *optr++ = (uint8_t)ffasmfunc; + *optr++ = 0; /* Hash table size. */ modstate = 1; fprintf(ctx->fp, "#ifdef %sMODULE_%s\n", LIBDEF_PREFIX, p); fprintf(ctx->fp, "#undef %sMODULE_%s\n", LIBDEF_PREFIX, p); @@ -108,8 +109,9 @@ static int find_ffofs(BuildCtx *ctx, const char *name) static void libdef_func(BuildCtx *ctx, char *p, int arg) { + if (arg != LIBINIT_CF) + ffasmfunc++; if (ctx->mode == BUILD_libdef) { - int ofs = arg != LIBINIT_CF ? find_ffofs(ctx, p) : 0; if (modstate == 0) { fprintf(stderr, "Error: no module for function definition %s\n", p); exit(1); @@ -126,12 +128,8 @@ static void libdef_func(BuildCtx *ctx, char *p, int arg) modstate = 2; fprintf(ctx->fp, " %s%s", arg ? LABEL_PREFIX_FFH : LABEL_PREFIX_CF, p); } - if (regfunc != REGFUNC_NOREGUV) obuf[1]++; /* Bump hash table size. */ + if (regfunc != REGFUNC_NOREGUV) obuf[2]++; /* Bump hash table size. */ libdef_name(regfunc == REGFUNC_NOREGUV ? "" : p, arg); - if (arg) { - *optr++ = (uint8_t)ofs; - *optr++ = (uint8_t)(ofs >> 8); - } } } else if (ctx->mode == BUILD_ffdef) { fprintf(ctx->fp, "FFDEF(%s)\n", p); @@ -146,6 +144,9 @@ static void libdef_func(BuildCtx *ctx, char *p, int arg) for (i = 1; p[i] && modname[i-1]; i++) if (p[i] == '_') p[i] = '.'; fprintf(ctx->fp, "\"%s\",\n", p); + } else if (ctx->mode == BUILD_bcdef) { + if (arg != LIBINIT_CF) + fprintf(ctx->fp, ",\n%d", find_ffofs(ctx, p)); } ffid++; regfunc = REGFUNC_OK; @@ -253,7 +254,7 @@ static void libdef_set(BuildCtx *ctx, char *p, int arg) if (p[0] == '!' && p[1] == '\0') p[0] = '\0'; /* Set env. */ libdef_name(p, LIBINIT_STRING); *optr++ = LIBINIT_SET; - obuf[1]++; /* Bump hash table size. */ + obuf[2]++; /* Bump hash table size. */ } } @@ -298,6 +299,7 @@ void emit_lib(BuildCtx *ctx) if (ctx->mode == BUILD_recdef) fprintf(ctx->fp, "static const uint16_t recff_idmap[] = {\n0,\n0x0100"); recffid = ffid = FF_C+1; + ffasmfunc = 0; while ((fname = *ctx->args++)) { char buf[256]; /* We don't care about analyzing lines longer than that. */ @@ -347,8 +349,19 @@ void emit_lib(BuildCtx *ctx) if (ctx->mode == BUILD_ffdef) { fprintf(ctx->fp, "\n#undef FFDEF\n\n"); + fprintf(ctx->fp, + "#ifndef FF_NUM_ASMFUNC\n#define FF_NUM_ASMFUNC %d\n#endif\n\n", + ffasmfunc); } else if (ctx->mode == BUILD_vmdef) { fprintf(ctx->fp, "}\n\n"); + } else if (ctx->mode == BUILD_bcdef) { + int i; + fprintf(ctx->fp, "\n};\n\n"); + fprintf(ctx->fp, "LJ_DATADEF const uint16_t lj_bc_mode[] = {\n"); + fprintf(ctx->fp, "BCDEF(BCMODE)\n"); + for (i = ffasmfunc-1; i > 0; i--) + fprintf(ctx->fp, "BCMODE_FF,\n"); + fprintf(ctx->fp, "BCMODE_FF\n};\n\n"); } else if (ctx->mode == BUILD_recdef) { char *p = (char *)obuf; fprintf(ctx->fp, "\n};\n\n"); diff --git a/src/buildvm_peobj.c b/src/buildvm_peobj.c index 5f4075af..2ff274f9 100644 --- a/src/buildvm_peobj.c +++ b/src/buildvm_peobj.c @@ -238,7 +238,7 @@ void emit_peobj(BuildCtx *ctx) for (relocsyms = 0; ctx->extnames[relocsyms]; relocsyms++) ; pehdr.nsyms = 1+PEOBJ_NSECTIONS*2 + 1+(ctx->nsym-nzsym) + relocsyms; #if !LJ_HASJIT - pehdr.nsyms -= 7; + pehdr.nsyms -= 11; /* See below, removes [IJ]* opcode symbols. */ #endif #if LJ_TARGET_X64 pehdr.nsyms += 1; /* Symbol for lj_err_unwind_win64. */ @@ -353,8 +353,9 @@ void emit_peobj(BuildCtx *ctx) } else { #else } else if (!(pi == BC_JFORI || pi == BC_JFORL || pi == BC_JITERL || - pi == BC_JLOOP || pi == BC_IFORL || pi == BC_IITERL || - pi == BC_ILOOP)) { + pi == BC_JLOOP || pi == BC_JFUNCF || pi == BC_JFUNCV || + pi == BC_IFORL || pi == BC_IITERL || pi == BC_ILOOP || + pi == BC_IFUNCF || pi == BC_IFUNCV)) { #endif sprintf(name, PEOBJ_SYM_PREFIX LABEL_PREFIX_BC "%s", bc_names[pi]); diff --git a/src/buildvm_x64.h b/src/buildvm_x64.h index 95af6a6c..a9e093bf 100644 --- a/src/buildvm_x64.h +++ b/src/buildvm_x64.h @@ -12,416 +12,396 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned char build_actionlist[13650] = { - 254,1,248,10,137,202,137,90,252,252,139,157,233,15,182,139,233,68,139,187, - 233,139,108,36,16,141,12,202,59,141,233,15,135,244,11,15,182,139,233,57,200, - 15,134,244,249,248,2,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16, - 65,252,255,36,252,238,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134, - 244,3,252,233,244,2,248,12,137,89,252,252,141,28,197,237,141,148,253,25,233, - 137,106,252,248,137,90,252,252,139,157,233,15,182,171,233,68,141,60,252,234, - 139,108,36,16,68,59,189,233,15,135,244,13,137,208,15,182,171,233,133,252, - 237,15,132,244,248,248,1,131,193,8,57,209,15,131,244,249,255,68,139,121,252, - 248,68,137,56,68,139,121,252,252,68,137,120,4,131,192,8,199,65,252,252,237, - 131,252,237,1,15,133,244,1,248,2,68,139,187,233,255,139,3,15,182,204,15,182, - 232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,199,64,4,237,131,192, - 8,131,252,237,1,15,133,244,3,252,233,244,2,248,14,137,89,252,252,76,139,189, - 233,139,108,36,16,141,68,193,252,248,137,141,233,141,136,233,137,133,233, - 59,141,233,76,137,252,254,137,252,239,15,135,244,15,65,199,134,233,237,65, - 252,255,150,233,65,199,134,233,237,139,149,233,255,141,12,194,252,247,217, - 3,141,233,248,16,131,192,1,137,68,36,4,252,247,195,237,15,132,244,17,252, - 233,244,18,248,19,137,89,252,252,76,139,189,233,139,108,36,16,141,68,193, - 252,248,137,141,233,141,136,233,137,133,233,59,141,233,137,252,239,15,135, - 244,15,65,199,134,233,237,65,252,255,215,65,199,134,233,237,139,149,233,255, - 141,12,194,252,247,217,3,141,233,248,16,131,192,1,137,68,36,4,252,247,195, - 237,15,132,244,17,248,18,252,247,195,237,15,132,244,20,65,199,134,233,237, - 131,227,252,248,41,211,252,247,219,131,232,1,15,132,244,248,248,1,139,44, - 10,137,106,252,248,139,108,10,4,137,106,252,252,131,194,8,131,232,1,15,133, - 244,1,248,2,139,108,36,16,137,157,233,248,3,139,68,36,4,139,76,36,8,248,4, - 255,57,193,15,133,244,252,248,5,131,252,234,8,137,149,233,248,21,72,139,76, - 36,32,72,137,141,233,49,192,248,22,72,131,196,40,65,94,65,95,91,93,195,248, - 6,15,130,244,253,59,149,233,15,135,244,254,199,66,252,252,237,131,194,8,131, - 192,1,252,233,244,4,248,7,133,201,15,132,244,5,41,193,141,20,202,252,233, - 244,5,248,8,255,137,149,233,137,68,36,4,137,206,137,252,239,232,251,1,0,139, - 149,233,252,233,244,3,248,23,137,252,240,72,137,252,252,248,24,139,108,36, - 16,139,173,233,199,133,233,237,252,233,244,22,248,25,72,129,231,239,72,137, - 252,252,248,26,139,108,36,16,72,199,193,252,248,252,255,252,255,252,255,184, - 237,139,149,233,68,139,181,233,65,129,198,239,139,90,252,252,199,66,252,252, - 237,65,199,134,233,237,255,252,233,244,16,248,20,252,247,195,237,15,132,244, - 27,131,227,252,248,41,218,72,141,76,25,252,248,139,90,252,252,199,68,10,4, - 237,252,233,244,16,248,15,190,237,252,233,244,247,248,13,137,202,248,11,141, - 68,194,252,248,15,182,139,233,131,195,4,137,149,233,137,133,233,137,92,36, - 20,137,206,248,1,137,252,239,232,251,1,0,139,141,233,255,139,133,233,139, - 105,252,248,139,89,252,252,41,200,193,232,3,131,192,1,252,255,165,233,248, - 28,85,83,65,87,65,86,72,131,252,236,40,137,252,253,137,124,36,16,137,252, - 241,187,237,49,192,76,141,188,253,36,233,68,139,181,233,65,129,198,239,76, - 137,189,233,137,68,36,20,72,137,68,36,32,137,68,36,8,137,68,36,12,56,133, - 233,15,132,244,249,65,199,134,233,237,136,133,233,139,149,233,139,133,233, - 41,200,193,232,3,131,192,1,41,209,139,90,252,252,137,68,36,4,252,247,195, - 237,15,132,244,17,252,233,244,18,248,29,255,85,83,65,87,65,86,72,131,252, - 236,40,187,237,137,76,36,12,252,233,244,247,248,30,85,83,65,87,65,86,72,131, - 252,236,40,187,237,248,1,137,84,36,8,137,252,253,137,124,36,16,137,252,241, - 248,2,76,139,189,233,76,137,124,36,32,137,108,36,20,72,137,165,233,68,139, - 181,233,65,129,198,239,248,3,65,199,134,233,237,139,149,233,1,203,41,211, - 139,133,233,41,200,193,232,3,131,192,1,139,105,252,248,129,121,253,252,252, - 239,15,133,244,31,252,255,165,233,248,32,255,85,83,65,87,65,86,72,131,252, - 236,40,137,252,253,137,124,36,16,137,108,36,20,68,139,189,233,68,43,189,233, - 199,68,36,12,0,0,0,0,68,137,124,36,8,76,139,189,233,76,137,124,36,32,72,137, - 165,233,252,255,209,133,192,15,132,244,21,137,193,187,237,252,233,244,2,248, - 27,1,209,131,227,252,248,137,213,41,218,199,68,193,252,252,237,137,200,139, - 93,252,244,72,99,77,252,240,76,141,61,245,76,1,252,249,68,139,122,252,248, - 69,139,191,233,69,139,191,233,252,255,225,248,33,15,182,75,252,255,131,252, - 237,16,141,12,202,41,252,233,15,132,244,34,252,247,217,193,252,233,3,139, - 124,36,16,137,151,233,137,202,139,72,4,139,0,137,77,4,137,69,0,137,252,238, - 252,233,244,35,248,36,255,137,4,36,199,68,36,4,237,72,141,4,36,128,123,252, - 252,235,15,133,244,247,65,141,142,233,137,41,199,65,4,237,137,205,252,233, - 244,248,248,37,15,182,67,252,254,255,252,242,15,42,192,252,242,15,17,4,36, - 255,72,141,4,36,252,233,244,247,248,38,15,182,67,252,254,141,4,194,248,1, - 15,182,107,252,255,141,44,252,234,248,2,139,124,36,16,137,151,233,137,252, - 238,72,137,194,137,252,253,137,92,36,20,232,251,1,1,139,149,233,133,192,15, - 132,244,249,248,34,15,182,75,252,253,139,104,4,139,0,137,108,202,4,137,4, - 202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238, - 248,3,139,141,233,137,89,252,244,141,153,233,41,211,139,105,252,248,184,3, - 0,0,0,252,255,165,233,248,39,137,4,36,199,68,36,4,237,72,141,4,36,128,123, - 252,252,235,15,133,244,247,65,141,142,233,255,137,41,199,65,4,237,137,205, - 252,233,244,248,248,40,15,182,67,252,254,255,72,141,4,36,252,233,244,247, - 248,41,15,182,67,252,254,141,4,194,248,1,15,182,107,252,255,141,44,252,234, - 248,2,139,124,36,16,137,151,233,137,252,238,72,137,194,137,252,253,137,92, - 36,20,232,251,1,2,139,149,233,133,192,15,132,244,249,15,182,75,252,253,139, - 108,202,4,139,12,202,137,104,4,137,8,248,42,139,3,15,182,204,15,182,232,131, - 195,4,193,232,16,65,252,255,36,252,238,248,3,139,141,233,137,89,252,244,15, - 182,67,252,253,139,108,194,4,139,4,194,137,105,20,137,65,16,141,153,233,41, - 211,139,105,252,248,184,4,0,0,0,252,255,165,233,248,43,139,108,36,16,137, - 149,233,141,52,202,141,20,194,137,252,239,15,182,75,252,252,137,92,36,20, - 232,251,1,3,248,3,139,149,233,131,252,248,1,15,135,244,44,248,4,255,141,91, - 4,15,130,244,252,248,5,15,183,67,252,254,141,156,253,131,233,248,6,139,3, - 15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,45,131, - 195,4,129,120,253,4,239,15,130,244,5,252,233,244,6,248,46,129,120,253,4,239, - 252,233,244,4,248,47,131,252,235,4,137,206,137,252,233,139,108,36,16,137, - 149,233,137,194,137,252,239,137,92,36,20,232,251,1,4,252,233,244,3,248,48, - 255,65,141,4,199,252,233,244,247,248,49,65,141,4,199,141,44,252,234,149,252, - 233,244,248,248,50,141,4,194,137,197,252,233,244,248,248,51,141,4,194,248, - 1,141,44,252,234,248,2,141,12,202,68,15,182,67,252,252,137,206,137,193,139, - 124,36,16,137,151,233,137,252,234,137,252,253,137,92,36,20,232,251,1,5,139, - 149,233,133,192,15,132,244,42,248,44,137,193,41,208,137,89,252,244,141,152, - 233,139,105,252,248,184,3,0,0,0,129,121,253,252,252,239,15,133,244,31,255, - 252,255,165,233,248,52,139,108,36,16,137,149,233,141,52,194,137,252,239,137, - 92,36,20,232,251,1,6,139,149,233,252,233,244,44,248,31,137,76,36,4,137,4, - 36,131,252,233,8,139,108,36,16,137,149,233,137,206,141,20,193,137,252,239, - 137,92,36,20,232,251,1,7,139,149,233,139,76,36,4,139,4,36,139,105,252,248, - 131,192,1,65,57,215,15,132,244,53,252,255,165,233,248,54,139,108,36,16,137, - 149,233,137,206,137,252,239,137,92,36,20,232,251,1,8,139,149,233,139,67,252, - 252,15,182,204,15,182,232,193,232,16,65,252,255,164,253,252,238,233,248,55, - 129,252,248,239,15,130,244,56,255,139,105,4,129,252,253,239,15,131,244,56, - 137,68,36,4,137,105,252,252,139,41,137,105,252,248,131,232,2,15,132,244,248, - 137,12,36,248,1,131,193,8,139,105,4,137,105,252,252,139,41,137,105,252,248, - 131,232,1,15,133,244,1,139,12,36,248,2,139,68,36,4,252,233,244,57,248,58, - 129,252,248,239,15,130,244,56,139,105,4,184,237,252,247,213,57,232,255,15, - 71,197,255,15,134,244,247,137,232,248,1,255,139,105,252,248,139,132,253,197, - 233,199,65,252,252,237,137,65,252,248,252,233,244,59,248,60,129,252,248,239, - 15,130,244,56,139,105,4,129,252,253,239,15,133,244,252,248,1,139,41,139,173, - 233,248,2,133,252,237,199,65,252,252,237,15,132,244,59,139,65,252,248,65, - 139,134,233,199,65,252,252,237,137,105,252,248,137,12,36,139,141,233,255, - 35,136,233,105,201,239,3,141,233,248,3,129,185,233,239,15,133,244,250,57, - 129,233,15,132,244,251,248,4,139,137,233,133,201,15,133,244,3,252,233,244, - 59,248,5,139,105,4,129,252,253,239,15,132,244,59,255,139,1,139,12,36,137, - 105,252,252,137,65,252,248,252,233,244,59,248,6,129,252,253,239,15,132,244, - 1,129,252,253,239,15,135,244,253,189,237,248,7,252,247,213,65,139,172,253, - 174,233,252,233,244,2,248,61,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,133,244,56,255,139,41,131,189,233,0,15,133,244,56,129,121,253,12,239, - 15,133,244,56,139,65,8,137,133,233,199,65,252,252,237,137,105,252,248,252, - 246,133,233,235,15,132,244,247,128,165,233,235,65,139,134,233,65,137,174, - 233,137,133,233,248,1,252,233,244,59,248,62,255,129,252,248,239,15,130,244, - 56,129,121,253,4,239,15,133,244,56,137,20,36,137,205,139,49,141,81,8,139, - 124,36,16,232,251,1,9,137,252,233,139,20,36,139,40,139,64,4,137,105,252,248, - 137,65,252,252,252,233,244,59,248,63,129,252,248,239,15,133,244,56,129,121, - 253,4,239,15,135,244,56,255,252,242,15,16,1,252,233,244,64,255,221,1,252, - 233,244,65,255,248,66,129,252,248,239,15,130,244,56,129,121,253,4,239,15, - 133,244,249,139,1,248,2,199,65,252,252,237,137,65,252,248,252,233,244,59, - 248,3,129,121,253,4,239,15,135,244,56,65,131,190,233,0,15,133,244,56,65,139, - 174,233,65,59,174,233,255,15,130,244,247,232,244,67,248,1,139,108,36,16,137, - 141,233,137,89,252,252,137,92,36,20,137,20,36,137,206,137,252,239,232,251, - 1,10,139,141,233,139,20,36,252,233,244,2,248,68,129,252,248,239,15,130,244, - 56,15,132,244,248,248,1,129,121,253,4,239,15,133,244,56,137,20,36,139,49, - 139,108,36,16,137,141,233,255,137,89,252,252,141,81,8,137,252,239,137,92, - 36,20,232,251,1,11,139,141,233,139,20,36,133,192,15,132,244,249,139,105,8, - 139,65,12,137,105,252,248,137,65,252,252,139,105,16,139,65,20,137,41,137, - 65,4,248,69,184,237,252,233,244,70,248,2,199,65,12,237,252,233,244,1,248, - 3,199,65,252,252,237,252,233,244,59,248,71,129,252,248,239,15,130,244,56, - 129,121,253,4,239,255,15,133,244,56,139,133,233,199,65,252,252,237,137,65, - 252,248,199,65,12,237,184,237,252,233,244,70,248,72,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,133,244,56,129,121,253,12,239,15,135,244,56,255, - 252,242,15,16,65,8,72,189,237,237,102,72,15,110,205,252,242,15,88,193,252, - 242,15,45,192,252,242,15,17,65,252,248,255,139,41,59,133,233,15,131,244,248, - 193,224,3,3,133,233,248,1,129,120,253,4,239,15,132,244,73,139,40,139,64,4, - 137,41,137,65,4,252,233,244,69,248,2,131,189,233,0,15,132,244,73,137,20,36, - 137,252,239,137,205,137,198,232,251,1,12,137,252,233,139,20,36,133,192,15, - 133,244,1,248,73,184,237,252,233,244,70,248,74,255,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,133,244,56,139,133,233,199,65,252,252,237,137, - 65,252,248,255,15,87,192,252,242,15,17,65,8,255,217,252,238,221,89,8,255, - 184,237,252,233,244,70,248,75,129,252,248,239,15,130,244,56,137,89,252,252, - 187,237,137,202,131,193,8,131,232,1,139,105,252,248,248,1,65,252,246,134, - 233,235,15,133,244,249,248,2,129,121,253,252,252,239,15,133,244,31,252,255, - 165,233,248,3,131,195,1,252,233,244,2,248,76,255,129,252,248,239,15,130,244, - 56,129,121,253,12,239,15,133,244,56,137,89,252,252,139,105,4,137,105,12,199, - 65,4,237,139,41,139,89,8,137,105,8,137,25,187,237,137,202,129,193,239,131, - 232,2,252,233,244,1,248,9,139,92,36,20,252,233,244,56,248,77,129,252,248, - 239,15,130,244,56,139,41,137,89,252,252,137,92,36,20,137,44,36,129,121,253, - 4,239,15,133,244,9,255,72,131,189,233,0,15,133,244,9,128,189,233,235,15,135, - 244,9,139,157,233,137,92,36,4,15,132,244,247,59,157,233,15,132,244,9,248, - 1,141,92,195,252,240,59,157,233,15,135,244,9,137,157,233,139,108,36,16,137, - 141,233,131,193,8,137,141,233,255,139,108,36,4,141,76,193,232,72,41,217,57, - 252,235,15,132,244,249,248,2,139,68,11,4,137,67,252,252,139,4,11,137,67,252, - 248,131,252,235,8,57,252,235,15,133,244,2,248,3,139,60,36,139,116,36,4,232, - 244,28,65,199,134,233,237,139,108,36,16,139,28,36,139,149,233,129,252,248, - 239,15,135,244,254,248,4,139,139,233,68,139,187,233,137,139,233,68,137,252, - 251,41,203,15,132,244,252,255,141,4,26,193,252,235,3,59,133,233,15,135,244, - 255,137,213,72,41,205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131,193,8, - 68,57,252,249,15,133,244,5,248,6,141,67,2,199,66,252,252,237,248,7,139,92, - 36,20,137,68,36,4,72,199,193,252,248,252,255,252,255,252,255,252,247,195, - 237,15,132,244,17,252,233,244,18,248,8,199,66,252,252,237,139,139,233,131, - 252,233,8,137,139,233,139,1,137,2,139,65,4,137,66,4,184,237,252,233,244,7, - 248,9,255,139,12,36,68,137,185,233,137,222,137,252,239,232,251,1,0,139,149, - 233,252,233,244,4,248,9,139,92,36,20,252,233,244,56,248,78,139,173,233,137, - 89,252,252,137,92,36,20,137,44,36,72,131,189,233,0,15,133,244,9,128,189,233, - 235,15,135,244,9,139,157,233,137,92,36,4,15,132,244,247,59,157,233,255,15, - 132,244,9,248,1,141,92,195,252,248,59,157,233,15,135,244,9,137,157,233,139, - 108,36,16,137,141,233,137,141,233,139,108,36,4,141,76,193,252,240,72,41,217, - 57,252,235,15,132,244,249,248,2,139,68,11,4,137,67,252,252,139,4,11,137,67, - 252,248,131,252,235,8,57,252,235,15,133,244,2,248,3,139,60,36,139,116,36, - 4,232,244,28,65,199,134,233,237,139,108,36,16,139,28,36,139,149,233,255,129, - 252,248,239,15,135,244,254,248,4,139,139,233,68,139,187,233,137,139,233,68, - 137,252,251,41,203,15,132,244,252,141,4,26,193,252,235,3,59,133,233,15,135, - 244,255,137,213,72,41,205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131,193, - 8,68,57,252,249,15,133,244,5,248,6,141,67,1,248,7,139,92,36,20,137,68,36, - 4,49,201,252,247,195,237,15,132,244,17,255,252,233,244,18,248,8,137,222,137, - 252,239,232,251,1,13,248,9,139,12,36,68,137,185,233,137,222,137,252,239,232, - 251,1,0,139,149,233,252,233,244,4,248,79,139,108,36,16,137,89,252,252,72, - 252,247,133,233,237,15,132,244,56,137,141,233,141,68,193,252,248,137,133, - 233,49,192,72,137,133,233,176,235,136,133,233,252,233,244,22,255,248,65,221, - 89,252,248,252,233,244,59,248,80,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,72,184,237,237,102,72,15,110,200,15,84, - 193,248,64,252,242,15,17,65,252,248,255,248,80,129,252,248,239,15,130,244, - 56,129,121,253,4,239,15,135,244,56,221,1,217,225,248,64,248,65,221,89,252, - 248,255,248,59,184,237,248,70,137,68,36,4,248,57,252,247,195,237,15,133,244, - 253,248,5,56,67,252,255,15,135,244,252,139,3,15,182,204,15,182,232,131,195, - 4,193,232,16,65,252,255,36,252,238,248,6,199,68,193,252,244,237,131,192,1, - 252,233,244,5,248,7,137,202,72,199,193,252,248,252,255,252,255,252,255,252, - 233,244,18,255,248,81,129,252,248,239,15,130,244,56,129,121,253,4,239,15, - 135,244,56,252,242,15,81,1,252,233,244,64,248,82,129,252,248,239,15,130,244, - 56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,232,244,83,252,233,244, - 64,248,84,255,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,252,242,15,16,1,232,244,85,252,233,244,64,255,248,81,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,252,250,252,233,244, - 65,248,82,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,221, - 1,232,244,83,252,233,244,65,248,84,255,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,135,244,56,221,1,232,244,85,252,233,244,65,255,248,86,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,217,252,237,221, - 1,217,252,241,252,233,244,65,248,87,129,252,248,239,15,130,244,56,129,121, - 253,4,239,15,135,244,56,217,252,236,221,1,217,252,241,252,233,244,65,248, - 88,129,252,248,239,255,15,130,244,56,129,121,253,4,239,15,135,244,56,221, - 1,232,244,89,252,233,244,65,248,90,129,252,248,239,15,130,244,56,129,121, - 253,4,239,15,135,244,56,221,1,217,252,254,252,233,244,65,248,91,129,252,248, - 239,255,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,252,255,252, - 233,244,65,248,92,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135, - 244,56,221,1,217,252,242,221,216,252,233,244,65,248,93,129,252,248,239,15, - 130,244,56,255,129,121,253,4,239,15,135,244,56,221,1,217,192,216,200,217, - 232,222,225,217,252,250,217,252,243,252,233,244,65,248,94,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,192,216,200,217,232, - 222,225,217,252,250,217,201,217,252,243,252,233,244,65,248,95,129,252,248, - 239,15,130,244,56,129,121,253,4,239,15,135,244,56,255,221,1,217,232,217,252, - 243,252,233,244,65,255,248,96,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,135,244,56,252,242,15,16,1,255,137,12,36,137,213,232,251,1,14,139, - 12,36,137,252,234,252,233,244,64,255,248,97,129,252,248,239,15,130,244,56, - 129,121,253,4,239,15,135,244,56,252,242,15,16,1,255,137,12,36,137,213,232, - 251,1,15,139,12,36,137,252,234,252,233,244,64,255,248,98,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,255,137,12, - 36,137,213,232,251,1,16,139,12,36,137,252,234,252,233,244,64,248,99,255,248, - 100,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242, - 15,16,1,252,242,15,89,133,233,252,233,244,64,255,248,100,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,220,141,233,252,233,244, - 65,255,248,101,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,221,1,221,65,8,217,252,243,252,233,244, - 65,248,102,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56, - 129,121,253,12,239,255,15,135,244,56,221,65,8,221,1,217,252,253,221,217,252, - 233,244,65,248,103,129,252,248,239,15,130,244,56,139,105,4,129,252,253,239, - 15,135,244,56,139,1,137,105,252,252,137,65,252,248,209,229,129,252,253,0, - 0,224,252,255,15,131,244,249,9,232,15,132,244,249,184,252,254,3,0,0,129,252, - 253,0,0,32,0,15,130,244,250,248,1,193,252,237,21,41,197,255,252,242,15,42, - 197,255,137,44,36,219,4,36,255,139,105,252,252,129,229,252,255,252,255,15, - 128,129,205,0,0,224,63,137,105,252,252,248,2,255,252,242,15,17,1,255,221, - 25,255,184,237,252,233,244,70,248,3,255,15,87,192,252,233,244,2,255,217,252, - 238,252,233,244,2,255,252,242,15,16,1,72,189,237,237,102,72,15,110,205,252, - 242,15,89,193,252,242,15,17,65,252,248,255,221,1,199,4,36,0,0,128,90,216, - 12,36,221,89,252,248,255,139,105,252,252,184,52,4,0,0,209,229,252,233,244, - 1,255,248,104,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,252,242,15,16,1,255,248,104,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,221,1,255,139,105,4,209,229,129,252,253,0,0,224,252,255, - 15,132,244,250,255,15,40,224,232,244,105,252,242,15,92,224,248,1,252,242, - 15,17,65,252,248,252,242,15,17,33,255,217,192,232,244,105,220,252,233,248, - 1,221,89,252,248,221,25,255,139,65,252,252,139,105,4,49,232,15,136,244,249, - 248,2,184,237,252,233,244,70,248,3,129,252,245,0,0,0,128,137,105,4,252,233, - 244,2,248,4,255,15,87,228,252,233,244,1,255,217,252,238,217,201,252,233,244, - 1,255,248,106,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,221,65,8,221,1,248,1,217,252,248,223, - 224,158,15,138,244,1,221,217,252,233,244,65,255,248,107,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244, - 56,252,242,15,16,1,252,242,15,16,73,8,232,244,108,252,233,244,64,255,248, - 107,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121, - 253,12,239,15,135,244,56,221,1,221,65,8,232,244,108,252,233,244,65,255,248, - 109,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242, - 15,16,1,189,2,0,0,0,248,1,57,197,15,131,244,64,129,124,253,252,233,252,252, - 239,15,135,244,56,252,242,15,16,76,252,233,252,248,252,242,15,93,193,131, - 197,1,252,233,244,1,255,248,110,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,189,2,0,0,0,248,1,57,197,15,131,244,64, - 129,124,253,252,233,252,252,239,15,135,244,56,252,242,15,16,76,252,233,252, - 248,252,242,15,95,193,131,197,1,252,233,244,1,255,248,5,221,216,252,233,244, - 56,255,248,111,129,252,248,239,15,130,244,56,129,121,253,4,239,15,133,244, - 56,139,41,255,252,242,15,42,133,233,252,233,244,64,255,219,133,233,252,233, - 244,65,255,248,112,129,252,248,239,15,133,244,56,129,121,253,4,239,15,133, - 244,56,139,41,131,189,233,1,15,130,244,73,15,182,173,233,255,252,242,15,42, - 197,252,233,244,64,255,137,44,36,219,4,36,252,233,244,65,255,248,113,65,139, - 174,233,65,59,174,233,15,130,244,247,232,244,67,248,1,129,252,248,239,15, - 133,244,56,129,121,253,4,239,15,135,244,56,255,252,242,15,45,1,61,252,255, - 0,0,0,15,135,244,56,137,68,36,4,255,221,1,219,92,36,4,129,124,36,4,252,255, - 0,0,0,15,135,244,56,255,199,68,36,24,1,0,0,0,72,141,68,36,4,137,12,36,248, - 114,139,108,36,16,137,149,233,139,84,36,24,72,137,198,137,252,239,137,92, - 36,20,232,251,1,17,139,12,36,139,149,233,199,65,252,252,237,137,65,252,248, - 252,233,244,59,248,115,65,139,174,233,65,59,174,233,15,130,244,247,232,244, - 67,248,1,137,12,36,199,68,36,4,252,255,252,255,252,255,252,255,129,252,248, - 239,15,130,244,56,15,134,244,247,129,121,253,20,239,255,252,242,15,45,105, - 16,137,108,36,4,255,221,65,16,219,92,36,4,255,248,1,129,121,253,4,239,15, - 133,244,56,129,121,253,12,239,15,135,244,56,139,41,137,108,36,24,139,173, - 233,255,252,242,15,45,73,8,255,139,68,36,4,57,197,15,130,244,251,248,2,133, - 201,15,142,244,253,248,3,139,108,36,24,41,200,15,140,244,116,141,172,253, - 13,233,131,192,1,248,4,137,68,36,24,137,232,252,233,244,114,248,5,15,140, - 244,252,141,68,40,1,252,233,244,2,248,6,137,232,252,233,244,2,248,7,255,15, - 132,244,254,1,252,233,131,193,1,15,143,244,3,248,8,185,1,0,0,0,252,233,244, - 3,248,116,49,192,252,233,244,4,248,117,129,252,248,239,15,130,244,56,65,139, - 174,233,65,59,174,233,15,130,244,247,232,244,67,248,1,255,137,12,36,129,121, - 253,4,239,15,133,244,56,129,121,253,12,239,15,135,244,56,139,41,255,252,242, - 15,45,65,8,255,221,65,8,219,92,36,4,139,68,36,4,255,133,192,15,142,244,116, - 131,189,233,1,15,130,244,116,15,133,244,118,65,57,134,233,15,130,244,118, - 15,182,141,233,65,139,174,233,137,68,36,24,248,1,136,77,0,131,197,1,131,232, - 1,15,133,244,1,65,139,134,233,252,233,244,114,248,119,129,252,248,239,255, - 15,130,244,56,65,139,174,233,65,59,174,233,15,130,244,247,232,244,67,248, - 1,137,12,36,129,121,253,4,239,15,133,244,56,139,41,139,133,233,133,192,15, - 132,244,116,65,57,134,233,15,130,244,120,129,197,239,137,92,36,4,137,68,36, - 24,65,139,158,233,248,1,255,15,182,77,0,131,197,1,131,232,1,136,12,3,15,133, - 244,1,137,216,139,92,36,4,252,233,244,114,248,121,129,252,248,239,15,130, - 244,56,65,139,174,233,65,59,174,233,15,130,244,247,232,244,67,248,1,137,12, - 36,129,121,253,4,239,15,133,244,56,139,41,139,133,233,65,57,134,233,255,15, - 130,244,120,129,197,239,137,92,36,4,137,68,36,24,65,139,158,233,252,233,244, - 249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248,131,252,249,90,15,135, - 244,248,131,252,241,32,248,2,136,12,3,248,3,131,232,1,15,137,244,1,137,216, - 139,92,36,4,252,233,244,114,248,122,129,252,248,239,15,130,244,56,255,65, - 139,174,233,65,59,174,233,15,130,244,247,232,244,67,248,1,137,12,36,129,121, - 253,4,239,15,133,244,56,139,41,139,133,233,65,57,134,233,15,130,244,120,129, - 197,239,137,92,36,4,137,68,36,24,65,139,158,233,252,233,244,249,248,1,15, - 182,76,5,0,131,252,249,97,15,130,244,248,255,131,252,249,122,15,135,244,248, - 131,252,241,32,248,2,136,12,3,248,3,131,232,1,15,137,244,1,137,216,139,92, - 36,4,252,233,244,114,248,123,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,133,244,56,137,20,36,137,205,139,57,232,251,1,18,137,252,233,139,20, - 36,255,252,242,15,42,192,252,233,244,64,255,248,124,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,72,189,237,237,102, - 72,15,110,205,252,242,15,88,193,102,15,126,197,252,242,15,42,197,252,233, - 244,64,255,248,125,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135, - 244,56,252,242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15,88,193, - 102,15,126,197,255,137,68,36,4,141,68,193,252,240,255,137,20,36,255,248,1, - 57,200,15,134,244,126,129,120,253,4,239,15,135,244,127,255,252,242,15,16, - 0,252,242,15,88,193,102,15,126,194,33,213,255,131,232,8,252,233,244,1,255, - 248,128,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252, - 242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126, - 197,255,252,242,15,16,0,252,242,15,88,193,102,15,126,194,9,213,255,248,129, - 129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15, - 16,1,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126,197,255, - 252,242,15,16,0,252,242,15,88,193,102,15,126,194,49,213,255,248,130,129,252, - 248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,72, - 189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126,197,255,15,205, - 252,233,244,131,255,248,132,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,135,244,56,252,242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15, - 88,193,102,15,126,197,255,252,247,213,255,248,131,252,242,15,42,197,252,233, - 244,64,248,126,252,242,15,42,197,139,20,36,252,233,244,64,255,248,127,255, - 139,68,36,4,252,233,244,56,255,248,133,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252,242,15,16, - 1,252,242,15,16,73,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252, +static const unsigned char build_actionlist[13578] = { + 254,1,248,10,252,247,195,237,15,132,244,11,131,227,252,248,41,218,72,141, + 76,25,252,248,139,90,252,252,199,68,10,4,237,248,12,131,192,1,137,68,36,4, + 252,247,195,237,15,132,244,13,248,14,252,247,195,237,15,132,244,10,65,199, + 134,233,237,131,227,252,248,41,211,252,247,219,131,232,1,15,132,244,248,248, + 1,139,44,10,137,106,252,248,139,108,10,4,137,106,252,252,131,194,8,131,232, + 1,15,133,244,1,248,2,255,139,108,36,16,137,157,233,248,3,139,68,36,4,139, + 76,36,8,248,4,57,193,15,133,244,252,248,5,131,252,234,8,137,149,233,248,15, + 72,139,76,36,32,72,137,141,233,49,192,248,16,72,131,196,40,65,94,65,95,91, + 93,195,248,6,15,130,244,253,59,149,233,15,135,244,254,199,66,252,252,237, + 131,194,8,131,192,1,252,233,244,4,248,7,255,133,201,15,132,244,5,41,193,141, + 20,202,252,233,244,5,248,8,137,149,233,137,68,36,4,137,206,137,252,239,232, + 251,1,0,139,149,233,252,233,244,3,248,17,137,252,240,72,137,252,252,248,18, + 139,108,36,16,139,173,233,199,133,233,237,252,233,244,16,248,19,72,129,231, + 239,72,137,252,252,248,20,139,108,36,16,72,199,193,252,248,252,255,252,255, + 252,255,184,237,255,139,149,233,68,139,181,233,65,129,198,239,139,90,252, + 252,199,66,252,252,237,65,199,134,233,237,252,233,244,12,248,21,190,237,252, + 233,244,248,248,22,131,232,8,252,233,244,247,248,23,141,68,194,252,248,248, + 1,15,182,139,233,131,195,4,137,149,233,137,133,233,255,137,92,36,20,137,206, + 248,2,137,252,239,232,251,1,0,139,149,233,139,133,233,139,106,252,248,139, + 90,252,252,41,208,193,232,3,131,192,1,139,157,233,139,11,15,182,252,233,15, + 182,205,131,195,4,65,252,255,36,252,238,248,24,85,83,65,87,65,86,72,131,252, + 236,40,137,252,253,137,124,36,16,137,252,241,187,237,49,192,76,141,188,253, + 36,233,68,139,181,233,65,129,198,239,76,137,189,233,137,68,36,20,72,137,68, + 36,32,137,68,36,8,137,68,36,12,56,133,233,15,132,244,249,65,199,134,233,237, + 136,133,233,139,149,233,139,133,233,41,200,193,232,3,131,192,1,41,209,139, + 90,252,252,137,68,36,4,252,247,195,237,15,132,244,13,255,252,233,244,14,248, + 25,85,83,65,87,65,86,72,131,252,236,40,187,237,137,76,36,12,252,233,244,247, + 248,26,85,83,65,87,65,86,72,131,252,236,40,187,237,248,1,137,84,36,8,137, + 252,253,137,124,36,16,137,252,241,248,2,76,139,189,233,76,137,124,36,32,137, + 108,36,20,72,137,165,233,68,139,181,233,65,129,198,239,248,3,65,199,134,233, + 237,139,149,233,1,203,41,211,139,133,233,41,200,193,232,3,131,192,1,248,27, + 255,139,105,252,248,129,121,253,252,252,239,15,133,244,28,248,29,137,202, + 137,90,252,252,139,157,233,139,11,15,182,252,233,15,182,205,131,195,4,65, + 252,255,36,252,238,248,30,85,83,65,87,65,86,72,131,252,236,40,137,252,253, + 137,124,36,16,137,108,36,20,68,139,189,233,68,43,189,233,199,68,36,12,0,0, + 0,0,68,137,124,36,8,76,139,189,233,76,137,124,36,32,72,137,165,233,252,255, + 209,133,192,15,132,244,15,137,193,187,237,252,233,244,2,248,11,1,209,131, + 227,252,248,137,213,41,218,199,68,193,252,252,237,137,200,139,93,252,244, + 72,99,77,252,240,76,141,61,245,76,1,252,249,68,139,122,252,248,69,139,191, + 233,255,69,139,191,233,252,255,225,248,31,15,182,75,252,255,131,252,237,16, + 141,12,202,41,252,233,15,132,244,32,252,247,217,193,252,233,3,139,124,36, + 16,137,151,233,137,202,139,72,4,139,0,137,77,4,137,69,0,137,252,238,252,233, + 244,33,248,34,137,4,36,199,68,36,4,237,72,141,4,36,128,123,252,252,235,15, + 133,244,247,65,141,142,233,137,41,199,65,4,237,137,205,252,233,244,248,248, + 35,15,182,67,252,254,255,252,242,15,42,192,252,242,15,17,4,36,255,72,141, + 4,36,252,233,244,247,248,36,15,182,67,252,254,141,4,194,248,1,15,182,107, + 252,255,141,44,252,234,248,2,139,124,36,16,137,151,233,137,252,238,72,137, + 194,137,252,253,137,92,36,20,232,251,1,1,139,149,233,133,192,15,132,244,249, + 248,32,15,182,75,252,253,139,104,4,139,0,137,108,202,4,137,4,202,139,3,15, + 182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,139,141, + 233,137,89,252,244,141,153,233,41,211,139,105,252,248,184,237,252,233,244, + 29,248,37,137,4,36,199,68,36,4,237,72,141,4,36,128,123,252,252,235,15,133, + 244,247,255,65,141,142,233,137,41,199,65,4,237,137,205,252,233,244,248,248, + 38,15,182,67,252,254,255,72,141,4,36,252,233,244,247,248,39,15,182,67,252, + 254,141,4,194,248,1,15,182,107,252,255,141,44,252,234,248,2,139,124,36,16, + 137,151,233,137,252,238,72,137,194,137,252,253,137,92,36,20,232,251,1,2,139, + 149,233,133,192,15,132,244,249,15,182,75,252,253,139,108,202,4,139,12,202, + 137,104,4,137,8,248,40,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65, + 252,255,36,252,238,248,3,139,141,233,137,89,252,244,15,182,67,252,253,139, + 108,194,4,139,4,194,137,105,20,137,65,16,141,153,233,41,211,139,105,252,248, + 184,237,252,233,244,29,248,41,139,108,36,16,137,149,233,141,52,202,141,20, + 194,137,252,239,15,182,75,252,252,137,92,36,20,232,251,1,3,248,3,139,149, + 233,255,131,252,248,1,15,135,244,42,248,4,141,91,4,15,130,244,252,248,5,15, + 183,67,252,254,141,156,253,131,233,248,6,139,3,15,182,204,15,182,232,131, + 195,4,193,232,16,65,252,255,36,252,238,248,43,131,195,4,129,120,253,4,239, + 15,130,244,5,252,233,244,6,248,44,129,120,253,4,239,252,233,244,4,248,45, + 131,252,235,4,137,206,137,252,233,139,108,36,16,137,149,233,255,137,194,137, + 252,239,137,92,36,20,232,251,1,4,252,233,244,3,248,46,65,141,4,199,252,233, + 244,247,248,47,65,141,4,199,141,44,252,234,149,252,233,244,248,248,48,141, + 4,194,137,197,252,233,244,248,248,49,141,4,194,248,1,141,44,252,234,248,2, + 141,12,202,68,15,182,67,252,252,137,206,137,193,139,124,36,16,137,151,233, + 137,252,234,137,252,253,137,92,36,20,232,251,1,5,139,149,233,133,192,15,132, + 244,40,248,42,137,193,41,208,137,89,252,244,141,152,233,255,184,237,252,233, + 244,27,248,50,139,108,36,16,137,149,233,141,52,194,137,252,239,137,92,36, + 20,232,251,1,6,139,149,233,252,233,244,42,248,51,141,76,202,8,248,28,137, + 76,36,4,137,4,36,131,252,233,8,139,108,36,16,137,149,233,137,206,141,20,193, + 137,252,239,137,92,36,20,232,251,1,7,139,149,233,139,76,36,4,139,4,36,139, + 105,252,248,131,192,1,65,57,215,15,132,244,52,137,202,137,90,252,252,139, + 157,233,139,11,15,182,252,233,15,182,205,131,195,4,65,252,255,36,252,238, + 248,53,139,108,36,16,137,149,233,137,206,137,252,239,137,92,36,20,232,251, + 1,8,139,149,233,139,67,252,252,15,182,204,15,182,232,193,232,16,65,252,255, + 164,253,252,238,233,248,54,255,129,252,248,239,15,130,244,55,139,106,4,129, + 252,253,239,15,131,244,55,139,90,252,252,137,68,36,4,137,106,252,252,139, + 42,137,106,252,248,131,232,2,15,132,244,248,137,209,248,1,131,193,8,139,105, + 4,137,105,252,252,139,41,137,105,252,248,131,232,1,15,133,244,1,248,2,139, + 68,36,4,252,233,244,56,248,57,129,252,248,239,15,130,244,55,139,106,4,184, + 237,252,247,213,57,232,255,15,71,197,255,15,134,244,247,137,232,248,1,255, + 139,106,252,248,139,132,253,197,233,139,90,252,252,199,66,252,252,237,137, + 66,252,248,252,233,244,58,248,59,129,252,248,239,15,130,244,55,139,106,4, + 139,90,252,252,129,252,253,239,15,133,244,252,248,1,139,42,139,173,233,248, + 2,133,252,237,199,66,252,252,237,15,132,244,58,65,139,134,233,199,66,252, + 252,237,137,106,252,248,139,141,233,255,35,136,233,105,201,239,3,141,233, + 248,3,129,185,233,239,15,133,244,250,57,129,233,15,132,244,251,248,4,139, + 137,233,133,201,15,133,244,3,252,233,244,58,248,5,139,105,4,129,252,253,239, + 15,132,244,58,255,139,1,137,106,252,252,137,66,252,248,252,233,244,58,248, + 6,129,252,253,239,15,132,244,1,129,252,253,239,15,135,244,253,189,237,248, + 7,252,247,213,65,139,172,253,174,233,252,233,244,2,248,60,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,133,244,55,255,139,42,131,189,233,0,15, + 133,244,55,129,122,253,12,239,15,133,244,55,139,66,8,137,133,233,139,90,252, + 252,199,66,252,252,237,137,106,252,248,252,246,133,233,235,15,132,244,247, + 128,165,233,235,65,139,134,233,65,137,174,233,137,133,233,248,1,252,233,244, + 58,248,61,255,129,252,248,239,15,130,244,55,129,122,253,4,239,15,133,244, + 55,137,213,139,50,141,82,8,139,124,36,16,232,251,1,9,137,252,234,139,40,139, + 64,4,139,90,252,252,137,106,252,248,137,66,252,252,252,233,244,58,248,62, + 129,252,248,239,15,133,244,55,129,122,253,4,239,15,135,244,55,255,252,242, + 15,16,2,252,233,244,63,255,221,2,252,233,244,64,255,248,65,129,252,248,239, + 15,130,244,55,139,90,252,252,129,122,253,4,239,15,133,244,249,139,2,248,2, + 199,66,252,252,237,137,66,252,248,252,233,244,58,248,3,129,122,253,4,239, + 15,135,244,55,65,131,190,233,0,15,133,244,55,65,139,174,233,65,59,174,233, + 255,15,130,244,247,232,244,66,248,1,139,108,36,16,137,149,233,137,92,36,20, + 137,214,137,252,239,232,251,1,10,139,149,233,252,233,244,2,248,67,129,252, + 248,239,15,130,244,55,15,132,244,248,248,1,129,122,253,4,239,15,133,244,55, + 139,108,36,16,137,149,233,255,139,90,252,252,139,50,141,82,8,137,252,239, + 137,92,36,20,232,251,1,11,139,149,233,133,192,15,132,244,249,139,106,8,139, + 66,12,137,106,252,248,137,66,252,252,139,106,16,139,66,20,137,42,137,66,4, + 248,68,184,237,252,233,244,69,248,2,199,66,12,237,252,233,244,1,248,3,199, + 66,252,252,237,252,233,244,58,248,70,129,252,248,239,15,130,244,55,139,106, + 252,248,129,122,253,4,239,255,15,133,244,55,139,133,233,139,90,252,252,199, + 66,252,252,237,137,66,252,248,199,66,12,237,184,237,252,233,244,69,248,71, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,133,244,55,129,122,253, + 12,239,15,135,244,55,139,90,252,252,255,252,242,15,16,66,8,72,189,237,237, + 102,72,15,110,205,252,242,15,88,193,252,242,15,45,192,252,242,15,17,66,252, + 248,255,139,42,59,133,233,15,131,244,248,193,224,3,3,133,233,248,1,129,120, + 253,4,239,15,132,244,72,139,40,139,64,4,137,42,137,66,4,252,233,244,68,248, + 2,131,189,233,0,15,132,244,72,137,252,239,137,213,137,198,232,251,1,12,137, + 252,234,133,192,15,133,244,1,248,72,184,237,252,233,244,69,248,73,255,129, + 252,248,239,15,130,244,55,139,106,252,248,129,122,253,4,239,15,133,244,55, + 139,133,233,139,90,252,252,199,66,252,252,237,137,66,252,248,255,15,87,192, + 252,242,15,17,66,8,255,217,252,238,221,90,8,255,184,237,252,233,244,69,248, + 74,129,252,248,239,15,130,244,55,141,74,8,131,232,1,187,237,248,1,65,15,182, + 174,233,193,252,237,235,131,229,1,1,252,235,252,233,244,27,248,75,129,252, + 248,239,15,130,244,55,129,122,253,12,239,15,133,244,55,255,139,106,4,137, + 106,12,199,66,4,237,139,42,139,90,8,137,106,8,137,26,141,74,16,131,232,2, + 187,237,252,233,244,1,248,76,129,252,248,239,15,130,244,55,139,42,139,90, + 252,252,137,92,36,20,137,44,36,129,122,253,4,239,15,133,244,55,72,131,189, + 233,0,15,133,244,55,128,189,233,235,15,135,244,55,139,141,233,15,132,244, + 247,255,59,141,233,15,132,244,55,248,1,141,92,193,252,240,59,157,233,15,135, + 244,55,137,157,233,139,108,36,16,137,149,233,131,194,8,137,149,233,141,108, + 194,232,72,41,221,57,203,15,132,244,249,248,2,139,68,43,4,137,67,252,252, + 139,4,43,137,67,252,248,131,252,235,8,57,203,15,133,244,2,248,3,137,206,139, + 60,36,232,244,24,65,199,134,233,237,255,139,108,36,16,139,28,36,139,149,233, + 129,252,248,239,15,135,244,254,248,4,139,139,233,68,139,187,233,137,139,233, + 68,137,252,251,41,203,15,132,244,252,141,4,26,193,252,235,3,59,133,233,15, + 135,244,255,137,213,72,41,205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131, + 193,8,68,57,252,249,15,133,244,5,248,6,141,67,2,199,66,252,252,237,248,7, + 139,92,36,20,137,68,36,4,72,199,193,252,248,252,255,252,255,252,255,252,247, + 195,237,255,15,132,244,13,252,233,244,14,248,8,199,66,252,252,237,139,139, + 233,131,252,233,8,137,139,233,139,1,137,2,139,65,4,137,66,4,184,237,252,233, + 244,7,248,9,139,12,36,68,137,185,233,137,222,137,252,239,232,251,1,0,139, + 149,233,252,233,244,4,248,77,139,106,252,248,139,173,233,139,90,252,252,137, + 92,36,20,137,44,36,72,131,189,233,0,15,133,244,55,255,128,189,233,235,15, + 135,244,55,139,141,233,15,132,244,247,59,141,233,15,132,244,55,248,1,141, + 92,193,252,248,59,157,233,15,135,244,55,137,157,233,139,108,36,16,137,149, + 233,137,149,233,141,108,194,252,240,72,41,221,57,203,15,132,244,249,248,2, + 255,139,68,43,4,137,67,252,252,139,4,43,137,67,252,248,131,252,235,8,57,203, + 15,133,244,2,248,3,137,206,139,60,36,232,244,24,65,199,134,233,237,139,108, + 36,16,139,28,36,139,149,233,129,252,248,239,15,135,244,254,248,4,139,139, + 233,68,139,187,233,137,139,233,68,137,252,251,41,203,15,132,244,252,141,4, + 26,193,252,235,3,59,133,233,15,135,244,255,255,137,213,72,41,205,248,5,139, + 1,137,4,41,139,65,4,137,68,41,4,131,193,8,68,57,252,249,15,133,244,5,248, + 6,141,67,1,248,7,139,92,36,20,137,68,36,4,49,201,252,247,195,237,15,132,244, + 13,252,233,244,14,248,8,137,222,137,252,239,232,251,1,13,248,9,139,12,36, + 68,137,185,233,137,222,137,252,239,232,251,1,0,139,149,233,252,233,244,4, + 248,78,139,108,36,16,72,252,247,133,233,237,15,132,244,55,255,137,149,233, + 141,68,194,252,248,137,133,233,49,192,72,137,133,233,176,235,136,133,233, + 252,233,244,16,255,248,64,139,90,252,252,221,90,252,248,252,233,244,58,248, + 79,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242, + 15,16,2,72,184,237,237,102,72,15,110,200,15,84,193,248,63,139,90,252,252, + 252,242,15,17,66,252,248,255,248,79,129,252,248,239,15,130,244,55,129,122, + 253,4,239,15,135,244,55,221,2,217,225,248,63,248,64,139,90,252,252,221,90, + 252,248,255,248,58,184,237,248,69,137,68,36,4,248,56,252,247,195,237,15,133, + 244,253,248,5,56,67,252,255,15,135,244,252,15,182,75,252,253,72,252,247,209, + 141,20,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, + 252,238,248,6,199,68,194,252,244,237,131,192,1,252,233,244,5,248,7,72,199, + 193,252,248,252,255,252,255,252,255,252,233,244,14,255,248,80,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,81,2,252,233, + 244,63,248,81,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,252,242,15,16,2,232,244,82,252,233,244,63,248,83,255,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,232,244,84,252, + 233,244,63,255,248,80,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,221,2,217,252,250,252,233,244,64,248,81,129,252,248,239,15,130, + 244,55,129,122,253,4,239,15,135,244,55,221,2,232,244,82,252,233,244,64,248, + 83,255,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,232,244,84,252,233,244,64,255,248,85,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,217,252,237,221,2,217,252,241,252,233,244,64, + 248,86,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,217, + 252,236,221,2,217,252,241,252,233,244,64,248,87,129,252,248,239,255,15,130, + 244,55,129,122,253,4,239,15,135,244,55,221,2,232,244,88,252,233,244,64,248, + 89,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,217, + 252,254,252,233,244,64,248,90,129,252,248,239,255,15,130,244,55,129,122,253, + 4,239,15,135,244,55,221,2,217,252,255,252,233,244,64,248,91,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,217,252,242,221,216,252, + 233,244,64,248,92,129,252,248,239,15,130,244,55,255,129,122,253,4,239,15, + 135,244,55,221,2,217,192,216,200,217,232,222,225,217,252,250,217,252,243, + 252,233,244,64,248,93,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,221,2,217,192,216,200,217,232,222,225,217,252,250,217,201,217, + 252,243,252,233,244,64,248,94,129,252,248,239,15,130,244,55,129,122,253,4, + 239,15,135,244,55,255,221,2,217,232,217,252,243,252,233,244,64,255,248,95, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15, + 16,2,255,137,213,232,251,1,14,137,252,234,252,233,244,63,255,248,96,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,255, + 137,213,232,251,1,15,137,252,234,252,233,244,63,255,248,97,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,255,137,213, + 232,251,1,16,137,252,234,252,233,244,63,248,98,255,248,99,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,139,106,252, + 248,252,242,15,89,133,233,252,233,244,63,255,248,99,129,252,248,239,15,130, + 244,55,129,122,253,4,239,15,135,244,55,221,2,139,106,252,248,220,141,233, + 252,233,244,64,255,248,100,129,252,248,239,15,130,244,55,129,122,253,4,239, + 15,135,244,55,129,122,253,12,239,15,135,244,55,221,2,221,66,8,217,252,243, + 252,233,244,64,248,101,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,129,122,253,12,239,255,15,135,244,55,221,66,8,221,2,217,252,253, + 221,217,252,233,244,64,248,102,129,252,248,239,15,130,244,55,139,106,4,129, + 252,253,239,15,135,244,55,139,90,252,252,139,2,137,106,252,252,137,66,252, + 248,209,229,129,252,253,0,0,224,252,255,15,131,244,249,9,232,15,132,244,249, + 184,252,254,3,0,0,129,252,253,0,0,32,0,15,130,244,250,248,1,193,252,237,21, + 41,197,255,252,242,15,42,197,255,137,44,36,219,4,36,255,139,106,252,252,129, + 229,252,255,252,255,15,128,129,205,0,0,224,63,137,106,252,252,248,2,255,252, + 242,15,17,2,255,221,26,255,184,237,252,233,244,69,248,3,255,15,87,192,252, + 233,244,2,255,217,252,238,252,233,244,2,255,248,4,255,252,242,15,16,2,72, + 189,237,237,102,72,15,110,205,252,242,15,89,193,252,242,15,17,66,252,248, + 255,221,2,199,4,36,0,0,128,90,216,12,36,221,90,252,248,255,139,106,252,252, + 184,52,4,0,0,209,229,252,233,244,1,255,248,103,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,255,248,103,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,255,139,106,4,139, + 90,252,252,209,229,129,252,253,0,0,224,252,255,15,132,244,250,255,15,40,224, + 232,244,104,252,242,15,92,224,248,1,252,242,15,17,66,252,248,252,242,15,17, + 34,255,217,192,232,244,104,220,252,233,248,1,221,90,252,248,221,26,255,139, + 66,252,252,139,106,4,49,232,15,136,244,249,248,2,184,237,252,233,244,69,248, + 3,129,252,245,0,0,0,128,137,106,4,252,233,244,2,248,4,255,15,87,228,252,233, + 244,1,255,217,252,238,217,201,252,233,244,1,255,248,105,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244, + 55,221,66,8,221,2,248,1,217,252,248,223,224,158,15,138,244,1,221,217,252, + 233,244,64,255,248,106,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16, + 74,8,232,244,107,252,233,244,63,255,248,106,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,221,2,221, + 66,8,232,244,107,252,233,244,64,255,248,108,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,252,242,15,16,2,189,2,0,0,0,248,1,57,197, + 15,131,244,63,129,124,253,252,234,252,252,239,15,135,244,55,252,242,15,16, + 76,252,234,252,248,252,242,15,93,193,131,197,1,252,233,244,1,255,248,109, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15, + 16,2,189,2,0,0,0,248,1,57,197,15,131,244,63,129,124,253,252,234,252,252,239, + 15,135,244,55,252,242,15,16,76,252,234,252,248,252,242,15,95,193,131,197, + 1,252,233,244,1,255,248,5,221,216,252,233,244,55,255,248,110,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,133,244,55,139,42,255,252,242,15,42, + 133,233,252,233,244,63,255,219,133,233,252,233,244,64,255,248,111,129,252, + 248,239,15,133,244,55,129,122,253,4,239,15,133,244,55,139,42,139,90,252,252, + 131,189,233,1,15,130,244,72,15,182,173,233,255,252,242,15,42,197,252,233, + 244,63,255,137,44,36,219,4,36,252,233,244,64,255,248,112,65,139,174,233,65, + 59,174,233,15,130,244,247,232,244,66,248,1,129,252,248,239,15,133,244,55, + 129,122,253,4,239,15,135,244,55,255,252,242,15,45,2,61,252,255,0,0,0,15,135, + 244,55,137,68,36,4,255,221,2,219,92,36,4,129,124,36,4,252,255,0,0,0,15,135, + 244,55,255,199,68,36,24,1,0,0,0,72,141,68,36,4,248,113,139,108,36,16,137, + 149,233,139,84,36,24,72,137,198,137,252,239,137,92,36,20,232,251,1,17,139, + 149,233,139,90,252,252,199,66,252,252,237,137,66,252,248,252,233,244,58,248, + 114,65,139,174,233,65,59,174,233,15,130,244,247,232,244,66,248,1,199,68,36, + 4,252,255,252,255,252,255,252,255,129,252,248,239,15,130,244,55,15,134,244, + 247,129,122,253,20,239,255,252,242,15,45,106,16,137,108,36,4,255,221,66,16, + 219,92,36,4,255,248,1,129,122,253,4,239,15,133,244,55,129,122,253,12,239, + 15,135,244,55,139,42,137,108,36,24,139,173,233,255,252,242,15,45,74,8,255, + 139,68,36,4,57,197,15,130,244,251,248,2,133,201,15,142,244,253,248,3,139, + 108,36,24,41,200,15,140,244,115,141,172,253,13,233,131,192,1,248,4,137,68, + 36,24,137,232,252,233,244,113,248,5,15,140,244,252,141,68,40,1,252,233,244, + 2,248,6,137,232,252,233,244,2,248,7,255,15,132,244,254,1,252,233,131,193, + 1,15,143,244,3,248,8,185,1,0,0,0,252,233,244,3,248,115,49,192,252,233,244, + 4,248,116,129,252,248,239,15,130,244,55,65,139,174,233,65,59,174,233,15,130, + 244,247,232,244,66,248,1,255,129,122,253,4,239,15,133,244,55,129,122,253, + 12,239,15,135,244,55,139,42,255,252,242,15,45,66,8,255,221,66,8,219,92,36, + 4,139,68,36,4,255,133,192,15,142,244,115,131,189,233,1,15,130,244,115,15, + 133,244,117,65,57,134,233,15,130,244,117,15,182,141,233,65,139,174,233,137, + 68,36,24,248,1,136,77,0,131,197,1,131,232,1,15,133,244,1,65,139,134,233,252, + 233,244,113,248,118,129,252,248,239,255,15,130,244,55,65,139,174,233,65,59, + 174,233,15,130,244,247,232,244,66,248,1,129,122,253,4,239,15,133,244,55,139, + 42,139,133,233,133,192,15,132,244,115,65,57,134,233,15,130,244,119,129,197, + 239,137,92,36,4,137,68,36,24,65,139,158,233,248,1,255,15,182,77,0,131,197, + 1,131,232,1,136,12,3,15,133,244,1,137,216,139,92,36,4,252,233,244,113,248, + 120,129,252,248,239,15,130,244,55,65,139,174,233,65,59,174,233,15,130,244, + 247,232,244,66,248,1,129,122,253,4,239,15,133,244,55,139,42,139,133,233,65, + 57,134,233,255,15,130,244,119,129,197,239,137,92,36,4,137,68,36,24,65,139, + 158,233,252,233,244,249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248, + 131,252,249,90,15,135,244,248,131,252,241,32,248,2,136,12,3,248,3,131,232, + 1,15,137,244,1,137,216,139,92,36,4,252,233,244,113,248,121,129,252,248,239, + 15,130,244,55,255,65,139,174,233,65,59,174,233,15,130,244,247,232,244,66, + 248,1,129,122,253,4,239,15,133,244,55,139,42,139,133,233,65,57,134,233,15, + 130,244,119,129,197,239,137,92,36,4,137,68,36,24,65,139,158,233,252,233,244, + 249,248,1,15,182,76,5,0,131,252,249,97,15,130,244,248,255,131,252,249,122, + 15,135,244,248,131,252,241,32,248,2,136,12,3,248,3,131,232,1,15,137,244,1, + 137,216,139,92,36,4,252,233,244,113,248,122,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,133,244,55,137,213,139,58,232,251,1,18,137,252,234,255, + 252,242,15,42,192,252,233,244,63,255,248,123,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72,15, + 110,205,252,242,15,88,193,102,15,126,197,252,242,15,42,197,252,233,244,63, + 255,248,124,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55, + 252,242,15,16,2,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15, + 126,197,255,137,68,36,4,141,68,194,252,240,248,1,57,208,15,134,244,125,129, + 120,253,4,239,15,135,244,126,255,252,242,15,16,0,252,242,15,88,193,102,15, + 126,193,33,205,255,131,232,8,252,233,244,1,255,248,127,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237, + 102,72,15,110,205,252,242,15,88,193,102,15,126,197,255,252,242,15,16,0,252, + 242,15,88,193,102,15,126,193,9,205,255,248,128,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72, + 15,110,205,252,242,15,88,193,102,15,126,197,255,252,242,15,16,0,252,242,15, + 88,193,102,15,126,193,49,205,255,248,129,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72,15,110, + 205,252,242,15,88,193,102,15,126,197,255,15,205,252,233,244,125,255,248,130, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15, + 16,2,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126,197,255, + 252,247,213,255,248,125,252,242,15,42,197,252,233,244,63,255,248,126,139, + 68,36,4,252,233,244,55,255,248,131,129,252,248,239,15,130,244,55,129,122, + 253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,252,242,15,16,2, + 252,242,15,16,74,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252, 242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,211,229,137,193,252, - 233,244,131,255,248,134,129,252,248,239,15,130,244,56,129,121,253,4,239,15, - 135,244,56,129,121,253,12,239,15,135,244,56,252,242,15,16,1,252,242,15,16, - 73,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202, + 233,244,125,255,248,132,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16, + 74,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202, 137,200,102,15,126,197,102,15,126,201,255,211,252,237,137,193,252,233,244, - 131,255,248,135,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,252,242,15,16,1,252,242,15,16,73,8,72, + 125,255,248,133,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,72, 189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202,137,200, - 102,15,126,197,102,15,126,201,255,211,252,253,137,193,252,233,244,131,255, - 248,136,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129, - 121,253,12,239,15,135,244,56,252,242,15,16,1,252,242,15,16,73,8,72,189,237, + 102,15,126,197,102,15,126,201,255,211,252,253,137,193,252,233,244,125,255, + 248,134,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129, + 122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,72,189,237, 237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202,137,200,102,15, - 126,197,102,15,126,201,255,211,197,137,193,252,233,244,131,255,248,137,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12, - 239,15,135,244,56,252,242,15,16,1,252,242,15,16,73,8,72,189,237,237,102,72, + 126,197,102,15,126,201,255,211,197,137,193,252,233,244,125,255,248,135,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122,253,12, + 239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,72,189,237,237,102,72, 15,110,213,252,242,15,88,194,252,242,15,88,202,137,200,102,15,126,197,102, - 15,126,201,255,211,205,137,193,252,233,244,131,248,118,184,237,252,233,244, - 56,248,120,184,237,248,56,139,108,36,16,41,202,137,89,252,252,137,92,36,20, - 137,20,36,137,141,233,141,68,193,252,248,141,144,233,137,133,233,139,65,252, - 248,59,149,233,15,135,244,251,137,252,239,252,255,144,233,133,192,15,133, - 244,249,248,1,139,141,233,255,139,133,233,41,200,193,232,3,131,192,1,139, - 105,252,248,139,20,36,1,202,57,89,252,252,15,133,244,248,252,255,165,233, - 248,2,129,121,253,252,252,239,15,133,244,31,252,255,165,233,248,3,139,141, - 233,139,20,36,1,202,252,233,244,70,248,5,190,237,137,252,239,232,251,1,0, - 252,233,244,1,248,67,93,72,137,108,36,24,139,108,36,16,41,202,137,84,36,4, - 137,89,252,252,137,92,36,20,137,141,233,141,68,193,252,248,137,252,239,137, - 133,233,255,232,251,1,19,139,141,233,139,133,233,41,200,193,232,3,131,192, - 1,139,89,252,252,139,84,36,4,1,202,72,139,108,36,24,85,139,105,252,248,195, - 248,138,255,65,15,182,134,233,168,235,15,133,244,251,168,235,15,133,244,247, - 168,235,15,132,244,247,65,252,255,142,233,252,233,244,247,255,248,139,65, - 15,182,134,233,168,235,15,133,244,251,168,235,15,132,244,251,65,252,255,142, - 233,15,132,244,247,168,235,15,132,244,251,248,1,139,108,36,16,137,149,233, - 137,222,137,252,239,232,251,1,20,248,3,139,149,233,248,4,15,182,75,252,253, - 248,5,255,15,182,107,252,252,15,183,67,252,254,65,252,255,164,253,252,238, - 233,248,140,131,195,4,139,77,232,137,76,36,4,252,233,244,4,248,141,255,204, - 255,248,142,255,248,143,255,248,144,255,68,139,122,252,248,69,139,191,233, - 69,139,191,233,65,199,134,233,0,0,0,0,65,199,134,233,237,139,3,15,182,204, - 15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,248,83,255,217, - 124,36,4,137,68,36,8,102,184,0,4,102,11,68,36,4,102,37,252,255,252,247,102, - 137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195,255,248, - 145,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15, - 40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,252,242,15, - 88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15,110,208,252, - 242,15,194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248, - 85,255,217,124,36,4,137,68,36,8,102,184,0,8,102,11,68,36,4,102,37,252,255, - 252,251,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8, - 195,255,248,146,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15, - 110,216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208, - 252,242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15, - 110,208,252,242,15,194,193,6,102,15,84,194,252,242,15,92,200,15,40,193,248, - 1,195,248,105,255,217,124,36,4,137,68,36,8,102,184,0,12,102,11,68,36,4,102, - 137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195,255,248, - 147,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15, - 40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,15,40,193, - 252,242,15,88,203,252,242,15,92,203,72,184,237,237,102,72,15,110,216,252, - 242,15,194,193,1,102,15,84,195,252,242,15,92,200,102,15,86,202,15,40,193, - 248,1,195,248,148,255,15,40,232,252,242,15,94,193,72,184,237,237,102,72,15, - 110,208,72,184,237,237,102,72,15,110,216,15,40,224,102,15,84,226,102,15,46, - 220,15,134,244,247,102,15,85,208,252,242,15,88,227,252,242,15,92,227,102, - 15,86,226,72,184,237,237,102,72,15,110,208,252,242,15,194,196,1,102,15,84, - 194,252,242,15,92,224,15,40,197,252,242,15,89,204,252,242,15,92,193,195,248, - 1,252,242,15,89,200,15,40,197,252,242,15,92,193,195,255,217,193,216,252,241, - 217,124,36,4,102,184,0,4,102,11,68,36,4,102,37,252,255,252,247,102,137,68, - 36,6,217,108,36,6,217,252,252,217,108,36,4,222,201,222,252,233,195,255,248, - 89,217,252,234,222,201,248,149,217,84,36,252,248,129,124,36,252,248,0,0,128, - 127,15,132,244,247,129,124,36,252,248,0,0,128,252,255,15,132,244,248,248, - 150,217,192,217,252,252,220,252,233,217,201,217,252,240,217,232,222,193,217, - 252,253,221,217,248,1,195,248,2,221,216,217,252,238,195,255,248,108,255,248, - 151,252,242,15,45,193,252,242,15,42,208,102,15,46,202,15,133,244,254,15,138, - 244,255,248,152,131,252,248,1,15,142,244,252,248,1,169,1,0,0,0,15,133,244, - 248,252,242,15,89,192,209,232,252,233,244,1,248,2,209,232,15,132,244,251, - 15,40,200,248,3,252,242,15,89,192,209,232,15,132,244,250,15,131,244,3,255, - 252,242,15,89,200,252,233,244,3,248,4,252,242,15,89,193,248,5,195,248,6,15, - 132,244,5,15,130,244,253,80,72,184,237,237,102,72,15,110,200,252,242,15,94, - 200,88,15,40,193,252,247,216,131,252,248,1,15,132,244,5,252,233,244,1,248, - 7,72,184,237,237,102,72,15,110,192,195,248,8,102,72,15,126,200,72,209,224, - 72,193,192,12,72,61,252,254,15,0,0,15,132,244,248,255,102,72,15,126,192,72, - 209,224,15,132,244,250,72,193,192,12,72,61,252,254,15,0,0,15,132,244,251, + 15,126,201,255,211,205,137,193,252,233,244,125,248,117,184,237,252,233,244, + 55,248,119,184,237,248,55,139,108,36,16,139,90,252,252,137,92,36,20,137,149, + 233,141,68,194,252,248,141,136,233,137,133,233,139,66,252,248,59,141,233, + 15,135,244,251,137,252,239,252,255,144,233,139,149,233,133,192,15,133,244, + 69,248,1,255,139,133,233,41,208,193,232,3,131,192,1,139,106,252,248,57,90, + 252,252,15,133,244,248,139,157,233,139,11,15,182,252,233,15,182,205,131,195, + 4,65,252,255,36,252,238,248,2,137,209,252,247,195,237,15,133,244,249,15,182, + 107,252,253,72,252,247,213,141,20,252,234,252,233,244,27,248,3,137,221,131, + 229,252,248,41,252,234,252,233,244,27,248,5,190,237,137,252,239,232,251,1, + 0,139,149,233,252,233,244,1,248,66,93,72,137,108,36,24,139,108,36,16,137, + 92,36,20,137,149,233,255,141,68,194,252,248,137,252,239,137,133,233,232,251, + 1,19,139,149,233,139,133,233,41,208,193,232,3,131,192,1,72,139,108,36,24, + 85,195,248,136,255,65,15,182,134,233,168,235,15,133,244,251,168,235,15,133, + 244,247,168,235,15,132,244,247,65,252,255,142,233,252,233,244,247,255,248, + 137,65,15,182,134,233,168,235,15,133,244,251,168,235,15,132,244,251,65,252, + 255,142,233,15,132,244,247,168,235,15,132,244,251,248,1,139,108,36,16,137, + 149,233,137,222,137,252,239,232,251,1,20,248,3,139,149,233,248,4,15,182,75, + 252,253,248,5,255,15,182,107,252,252,15,183,67,252,254,65,252,255,164,253, + 252,238,233,248,138,131,195,4,139,77,232,137,76,36,4,252,233,244,4,248,139, + 255,204,255,248,140,255,248,141,255,248,142,255,68,139,122,252,248,69,139, + 191,233,69,139,191,233,65,199,134,233,0,0,0,0,65,199,134,233,237,139,3,15, + 182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,248,82, + 255,217,124,36,4,137,68,36,8,102,184,0,4,102,11,68,36,4,102,37,252,255,252, + 247,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195, + 255,248,143,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110, + 216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,252, + 242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15,110, + 208,252,242,15,194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1, + 195,248,84,255,217,124,36,4,137,68,36,8,102,184,0,8,102,11,68,36,4,102,37, + 252,255,252,251,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139, + 68,36,8,195,255,248,144,72,184,237,237,102,72,15,110,208,72,184,237,237,102, + 72,15,110,216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15, + 85,208,252,242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102, + 72,15,110,208,252,242,15,194,193,6,102,15,84,194,252,242,15,92,200,15,40, + 193,248,1,195,248,104,255,217,124,36,4,137,68,36,8,102,184,0,12,102,11,68, + 36,4,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195, + 255,248,145,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110, + 216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,15, + 40,193,252,242,15,88,203,252,242,15,92,203,72,184,237,237,102,72,15,110,216, + 252,242,15,194,193,1,102,15,84,195,252,242,15,92,200,102,15,86,202,15,40, + 193,248,1,195,248,146,255,15,40,232,252,242,15,94,193,72,184,237,237,102, + 72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,224,102,15,84,226,102, + 15,46,220,15,134,244,247,102,15,85,208,252,242,15,88,227,252,242,15,92,227, + 102,15,86,226,72,184,237,237,102,72,15,110,208,252,242,15,194,196,1,102,15, + 84,194,252,242,15,92,224,15,40,197,252,242,15,89,204,252,242,15,92,193,195, + 248,1,252,242,15,89,200,15,40,197,252,242,15,92,193,195,255,217,193,216,252, + 241,217,124,36,4,102,184,0,4,102,11,68,36,4,102,37,252,255,252,247,102,137, + 68,36,6,217,108,36,6,217,252,252,217,108,36,4,222,201,222,252,233,195,255, + 248,88,217,252,234,222,201,248,147,217,84,36,252,248,129,124,36,252,248,0, + 0,128,127,15,132,244,247,129,124,36,252,248,0,0,128,252,255,15,132,244,248, + 248,148,217,192,217,252,252,220,252,233,217,201,217,252,240,217,232,222,193, + 217,252,253,221,217,248,1,195,248,2,221,216,217,252,238,195,255,248,107,255, + 248,149,252,242,15,45,193,252,242,15,42,208,102,15,46,202,15,133,244,254, + 15,138,244,255,248,150,131,252,248,1,15,142,244,252,248,1,169,1,0,0,0,15, + 133,244,248,252,242,15,89,192,209,232,252,233,244,1,248,2,209,232,15,132, + 244,251,15,40,200,248,3,252,242,15,89,192,209,232,15,132,244,250,15,131,244, + 3,255,252,242,15,89,200,252,233,244,3,248,4,252,242,15,89,193,248,5,195,248, + 6,15,132,244,5,15,130,244,253,80,72,184,237,237,102,72,15,110,200,252,242, + 15,94,200,88,15,40,193,252,247,216,131,252,248,1,15,132,244,5,252,233,244, + 1,248,7,72,184,237,237,102,72,15,110,192,195,248,8,102,72,15,126,200,72,209, + 224,72,193,192,12,72,61,252,254,15,0,0,15,132,244,248,255,102,72,15,126,192, + 72,209,224,15,132,244,250,72,193,192,12,72,61,252,254,15,0,0,15,132,244,251, 252,242,15,17,76,36,252,240,252,242,15,17,68,36,252,248,221,68,36,252,240, 221,68,36,252,248,217,252,241,217,192,217,252,252,220,252,233,217,201,217, 252,240,217,232,222,193,217,252,253,221,217,221,92,36,252,248,252,242,15, @@ -431,27 +411,27 @@ static const unsigned char build_actionlist[13650] = { 102,15,80,193,15,87,192,136,196,15,146,208,48,224,15,133,244,1,248,3,72,184, 237,237,255,102,72,15,110,192,195,248,4,102,15,80,193,133,192,15,133,244, 3,15,87,192,195,248,5,102,15,80,193,133,192,15,132,244,3,15,87,192,195,248, - 153,255,131,252,255,1,15,130,244,83,15,132,244,85,131,252,255,3,15,130,244, - 105,15,135,244,248,252,242,15,81,192,195,248,2,252,242,15,17,68,36,252,248, - 221,68,36,252,248,131,252,255,5,15,135,244,248,15,132,244,247,232,244,89, - 252,233,244,253,248,1,232,244,149,255,252,233,244,253,248,2,131,252,255,7, + 151,255,131,252,255,1,15,130,244,82,15,132,244,84,131,252,255,3,15,130,244, + 104,15,135,244,248,252,242,15,81,192,195,248,2,252,242,15,17,68,36,252,248, + 221,68,36,252,248,131,252,255,5,15,135,244,248,15,132,244,247,232,244,88, + 252,233,244,253,248,1,232,244,147,255,252,233,244,253,248,2,131,252,255,7, 15,132,244,247,15,135,244,248,217,252,237,217,201,217,252,241,252,233,244, 253,248,1,217,232,217,201,217,252,241,252,233,244,253,248,2,131,252,255,9, 15,132,244,247,15,135,244,248,217,252,236,217,201,217,252,241,252,233,244, 253,248,1,255,217,252,254,252,233,244,253,248,2,131,252,255,11,15,132,244, 247,15,135,244,255,217,252,255,252,233,244,253,248,1,217,252,242,221,216, 248,7,221,92,36,252,248,252,242,15,16,68,36,252,248,195,255,139,124,36,12, - 221,68,36,4,131,252,255,1,15,130,244,83,15,132,244,85,131,252,255,3,15,130, - 244,105,15,135,244,248,217,252,250,195,248,2,131,252,255,5,15,130,244,89, - 15,132,244,149,131,252,255,7,15,132,244,247,15,135,244,248,217,252,237,217, + 221,68,36,4,131,252,255,1,15,130,244,82,15,132,244,84,131,252,255,3,15,130, + 244,104,15,135,244,248,217,252,250,195,248,2,131,252,255,5,15,130,244,88, + 15,132,244,147,131,252,255,7,15,132,244,247,15,135,244,248,217,252,237,217, 201,217,252,241,195,248,1,217,232,217,201,217,252,241,195,248,2,131,252,255, 9,15,132,244,247,255,15,135,244,248,217,252,236,217,201,217,252,241,195,248, 1,217,252,254,195,248,2,131,252,255,11,15,132,244,247,15,135,244,255,217, - 252,255,195,248,1,217,252,242,221,216,195,255,248,9,204,248,154,255,131,252, + 252,255,195,248,1,217,252,242,221,216,195,255,248,9,204,248,152,255,131,252, 255,1,15,132,244,247,15,135,244,248,252,242,15,88,193,195,248,1,252,242,15, 92,193,195,248,2,131,252,255,3,15,132,244,247,15,135,244,248,252,242,15,89, - 193,195,248,1,252,242,15,94,193,195,248,2,131,252,255,5,15,130,244,148,15, - 132,244,108,131,252,255,7,15,132,244,247,15,135,244,248,72,184,237,237,255, + 193,195,248,1,252,242,15,94,193,195,248,2,131,252,255,5,15,130,244,146,15, + 132,244,107,131,252,255,7,15,132,244,247,15,135,244,248,72,184,237,237,255, 102,72,15,110,200,15,87,193,195,248,1,72,184,237,237,102,72,15,110,200,15, 84,193,195,248,2,131,252,255,9,15,135,244,248,252,242,15,17,68,36,252,248, 252,242,15,17,76,36,252,240,221,68,36,252,248,221,68,36,252,240,15,132,244, @@ -461,241 +441,258 @@ static const unsigned char build_actionlist[13650] = { 9,204,255,139,68,36,20,221,68,36,4,221,68,36,12,131,252,248,1,15,132,244, 247,15,135,244,248,222,193,195,248,1,222,252,233,195,248,2,131,252,248,3, 15,132,244,247,15,135,244,248,222,201,195,248,1,222,252,249,195,248,2,131, - 252,248,5,15,130,244,148,15,132,244,108,131,252,248,7,15,132,244,247,15,135, + 252,248,5,15,130,244,146,15,132,244,107,131,252,248,7,15,132,244,247,15,135, 244,248,255,221,216,217,224,195,248,1,221,216,217,225,195,248,2,131,252,248, 9,15,132,244,247,15,135,244,248,217,252,243,195,248,1,217,201,217,252,253, 221,217,195,248,2,131,252,248,11,15,132,244,247,15,135,244,255,255,219,252, 233,219,209,221,217,195,248,1,219,252,233,218,209,221,217,195,255,221,225, 223,224,252,246,196,1,15,132,244,248,217,201,248,2,221,216,195,248,1,221, 225,223,224,252,246,196,1,15,133,244,248,217,201,248,2,221,216,195,255,248, - 155,137,252,248,83,15,162,137,6,137,94,4,137,78,8,137,86,12,91,195,255,129, - 124,253,202,4,239,15,135,244,43,129,124,253,194,4,239,15,135,244,43,255,252, - 242,15,16,4,194,131,195,4,102,15,46,4,202,255,221,4,202,221,4,194,131,195, - 4,255,223,252,233,221,216,255,218,252,233,223,224,158,255,15,134,244,248, - 255,15,131,244,248,255,248,1,15,183,67,252,254,141,156,253,131,233,248,2, - 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255, - 139,108,194,4,131,195,4,129,252,253,239,15,135,244,251,129,124,253,202,4, - 239,15,135,244,251,255,252,242,15,16,4,194,102,15,46,4,202,255,221,4,202, - 221,4,194,255,15,138,244,248,15,133,244,248,255,15,138,244,248,15,132,244, - 247,255,248,1,15,183,67,252,254,141,156,253,131,233,248,2,255,248,2,15,183, - 67,252,254,141,156,253,131,233,248,1,255,248,5,57,108,202,4,15,133,244,2, - 129,252,253,239,15,131,244,1,139,12,202,139,4,194,57,193,15,132,244,1,129, - 252,253,239,15,135,244,2,139,169,233,133,252,237,15,132,244,2,252,246,133, - 233,235,15,133,244,2,255,49,252,237,255,189,1,0,0,0,255,252,233,244,47,255, - 72,252,247,208,131,195,4,129,124,253,202,4,239,15,133,244,248,139,12,202, - 65,59,12,135,255,131,195,4,129,124,253,202,4,239,15,135,244,248,255,252,242, - 65,15,16,4,199,102,15,46,4,202,255,221,4,202,65,221,4,199,255,72,252,247, - 208,131,195,4,57,68,202,4,255,139,108,194,4,131,195,4,129,252,253,239,255, - 15,131,244,247,255,15,130,244,247,255,137,108,202,4,139,44,194,137,44,202, - 255,15,183,67,252,254,141,156,253,131,233,248,1,139,3,15,182,204,15,182,232, - 131,195,4,193,232,16,65,252,255,36,252,238,255,139,108,194,4,139,4,194,137, - 108,202,4,137,4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252, - 255,36,252,238,255,49,252,237,129,124,253,194,4,239,129,213,239,137,108,202, - 4,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238, - 255,129,124,253,194,4,239,15,135,244,50,255,252,242,15,16,4,194,72,184,237, - 237,102,72,15,110,200,15,87,193,252,242,15,17,4,202,255,221,4,194,217,224, - 221,28,202,255,129,124,253,194,4,239,15,133,244,248,139,4,194,255,15,87,192, - 252,242,15,42,128,233,248,1,252,242,15,17,4,202,255,219,128,233,248,1,221, - 28,202,255,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, - 252,238,248,2,129,124,253,194,4,239,15,133,244,52,139,60,194,137,213,232, - 251,1,18,255,252,242,15,42,192,137,252,234,255,15,182,75,252,253,252,233, - 244,1,255,15,182,252,236,15,182,192,255,129,124,253,252,234,4,239,15,135, - 244,48,255,252,242,15,16,4,252,234,252,242,65,15,88,4,199,255,221,4,252,234, - 65,220,4,199,255,129,124,253,252,234,4,239,15,135,244,49,255,252,242,65,15, - 16,4,199,252,242,15,88,4,252,234,255,65,221,4,199,220,4,252,234,255,129,124, - 253,252,234,4,239,15,135,244,51,129,124,253,194,4,239,15,135,244,51,255,252, - 242,15,16,4,252,234,252,242,15,88,4,194,255,221,4,252,234,220,4,194,255,252, - 242,15,16,4,252,234,252,242,65,15,92,4,199,255,221,4,252,234,65,220,36,199, - 255,252,242,65,15,16,4,199,252,242,15,92,4,252,234,255,65,221,4,199,220,36, - 252,234,255,252,242,15,16,4,252,234,252,242,15,92,4,194,255,221,4,252,234, - 220,36,194,255,252,242,15,16,4,252,234,252,242,65,15,89,4,199,255,221,4,252, - 234,65,220,12,199,255,252,242,65,15,16,4,199,252,242,15,89,4,252,234,255, - 65,221,4,199,220,12,252,234,255,252,242,15,16,4,252,234,252,242,15,89,4,194, - 255,221,4,252,234,220,12,194,255,252,242,15,16,4,252,234,252,242,65,15,94, - 4,199,255,221,4,252,234,65,220,52,199,255,252,242,65,15,16,4,199,252,242, - 15,94,4,252,234,255,65,221,4,199,220,52,252,234,255,252,242,15,16,4,252,234, - 252,242,15,94,4,194,255,221,4,252,234,220,52,194,255,252,242,15,16,4,252, - 234,252,242,65,15,16,12,199,255,221,4,252,234,65,221,4,199,255,252,242,65, - 15,16,4,199,252,242,15,16,12,252,234,255,65,221,4,199,221,4,252,234,255,252, - 242,15,16,4,252,234,252,242,15,16,12,194,255,221,4,252,234,221,4,194,255, - 248,156,232,244,148,255,252,233,244,156,255,232,244,108,255,15,182,252,236, - 15,182,192,139,124,36,16,137,151,233,141,52,194,137,194,41,252,234,248,35, - 137,252,253,137,92,36,20,232,251,1,21,139,149,233,133,192,15,133,244,44,15, - 182,107,252,255,15,182,75,252,253,139,68,252,234,4,139,44,252,234,137,68, - 202,4,137,44,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252, - 255,36,252,238,255,72,252,247,208,65,139,4,135,199,68,202,4,237,137,4,202, - 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255, - 15,191,192,252,242,15,42,192,252,242,15,17,4,202,255,223,67,252,254,221,28, - 202,255,252,242,65,15,16,4,199,252,242,15,17,4,202,255,65,221,4,199,221,28, - 202,255,72,252,247,208,137,68,202,4,139,3,15,182,204,15,182,232,131,195,4, - 193,232,16,65,252,255,36,252,238,255,141,76,202,12,141,68,194,4,189,237,137, - 105,252,248,248,1,137,41,131,193,8,57,193,15,134,244,1,139,3,15,182,204,15, - 182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,139,106,252,248,139, - 172,253,133,233,139,173,233,139,69,4,139,109,0,137,68,202,4,137,44,202,139, - 3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,139, - 106,252,248,139,172,253,141,233,128,189,233,0,139,173,233,139,12,194,139, - 68,194,4,137,77,0,137,69,4,15,132,244,247,252,246,133,233,235,15,133,244, - 248,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, - 252,238,248,2,129,232,239,129,252,248,239,15,134,244,1,252,246,129,233,235, - 15,132,244,1,137,252,238,137,213,65,141,190,233,255,232,251,1,22,137,252, - 234,252,233,244,1,255,72,252,247,208,139,106,252,248,139,172,253,141,233, - 65,139,12,135,139,133,233,137,8,199,64,4,237,252,246,133,233,235,15,133,244, - 248,248,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, - 252,238,248,2,252,246,129,233,235,15,132,244,1,128,189,233,0,15,132,244,1, - 137,213,137,198,65,141,190,233,232,251,1,22,137,252,234,252,233,244,1,255, - 139,106,252,248,255,252,242,65,15,16,4,199,255,139,172,253,141,233,139,141, - 233,255,72,252,247,208,139,106,252,248,139,172,253,141,233,139,141,233,137, - 65,4,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238, - 255,141,156,253,131,233,139,108,36,16,131,189,233,0,15,132,244,247,137,149, - 233,141,52,202,137,252,239,232,251,1,23,139,149,233,248,1,139,3,15,182,204, - 15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,72,252,247,208, - 139,108,36,16,137,149,233,139,82,252,248,65,139,52,135,137,252,239,137,92, - 36,20,232,251,1,24,139,149,233,15,182,75,252,253,137,4,202,199,68,202,4,237, - 139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255, - 139,124,36,16,137,151,233,248,1,137,194,37,252,255,7,0,0,193,252,234,11,61, - 252,255,7,0,0,15,132,244,249,248,2,137,198,65,139,134,233,137,252,253,65, - 59,134,233,137,92,36,20,15,131,244,251,232,251,1,25,139,149,233,15,182,75, - 252,253,137,4,202,199,68,202,4,237,139,3,15,182,204,15,182,232,131,195,4, - 193,232,16,65,252,255,36,252,238,248,3,184,1,8,0,0,252,233,244,2,248,5,232, - 251,1,26,15,183,67,252,254,137,252,239,252,233,244,1,255,72,252,247,208,139, - 108,36,16,65,139,142,233,137,92,36,20,65,59,142,233,137,149,233,15,131,244, - 249,248,2,65,139,52,135,137,252,239,232,251,1,27,139,149,233,15,182,75,252, - 253,137,4,202,199,68,202,4,237,139,3,15,182,204,15,182,232,131,195,4,193, - 232,16,65,252,255,36,252,238,248,3,137,252,239,232,251,1,26,15,183,67,252, - 254,72,252,247,208,252,233,244,2,255,72,252,247,208,139,106,252,248,139,173, - 233,65,139,4,135,252,233,244,157,255,72,252,247,208,139,106,252,248,139,173, - 233,65,139,4,135,252,233,244,158,255,15,182,252,236,15,182,192,129,124,253, - 252,234,4,239,15,133,244,38,139,44,252,234,129,124,253,194,4,239,15,135,244, - 251,255,252,242,15,16,4,194,252,242,15,45,192,252,242,15,42,200,102,15,46, - 193,255,15,133,244,38,59,133,233,15,131,244,38,193,224,3,3,133,233,129,120, - 253,4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137,68,202,4,139, - 3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,2, - 131,189,233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,38, - 15,182,75,252,253,252,233,244,1,248,5,255,129,124,253,194,4,239,15,133,244, - 38,139,4,194,252,233,244,157,255,15,182,252,236,15,182,192,72,252,247,208, - 65,139,4,135,129,124,253,252,234,4,239,15,133,244,36,139,44,252,234,248,157, - 139,141,233,35,136,233,105,201,239,3,141,233,248,1,129,185,233,239,15,133, - 244,250,57,129,233,15,133,244,250,129,121,253,4,239,15,132,244,251,15,182, - 67,252,253,139,41,139,73,4,137,44,194,248,2,255,137,76,194,4,139,3,15,182, - 204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,15,182,67, - 252,253,185,237,252,233,244,2,248,4,139,137,233,133,201,15,133,244,1,248, - 5,139,141,233,133,201,15,132,244,3,252,246,129,233,235,15,133,244,3,252,233, - 244,36,255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244, - 37,139,44,252,234,59,133,233,15,131,244,37,193,224,3,3,133,233,129,120,253, - 4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137,68,202,4,139,3, - 15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,2,131, - 189,233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,37,255, - 15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,41,139,44, - 252,234,129,124,253,194,4,239,15,135,244,251,255,15,133,244,41,59,133,233, - 15,131,244,41,193,224,3,3,133,233,129,120,253,4,239,15,132,244,249,248,1, - 252,246,133,233,235,15,133,244,253,248,2,139,108,202,4,139,12,202,137,104, - 4,137,8,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252, - 238,248,3,131,189,233,0,15,132,244,1,139,141,233,255,252,246,129,233,235, - 15,132,244,41,15,182,75,252,253,252,233,244,1,248,5,129,124,253,194,4,239, - 15,133,244,41,139,4,194,252,233,244,158,248,7,128,165,233,235,65,139,142, - 233,65,137,174,233,137,141,233,15,182,75,252,253,252,233,244,2,255,15,182, - 252,236,15,182,192,72,252,247,208,65,139,4,135,129,124,253,252,234,4,239, - 15,133,244,39,139,44,252,234,248,158,139,141,233,35,136,233,105,201,239,198, - 133,233,0,3,141,233,248,1,129,185,233,239,15,133,244,251,57,129,233,15,133, - 244,251,129,121,253,4,239,15,132,244,250,248,2,255,252,246,133,233,235,15, - 133,244,253,248,3,15,182,67,252,253,139,108,194,4,139,4,194,137,105,4,137, - 1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238, - 248,4,131,189,233,0,15,132,244,2,137,12,36,139,141,233,252,246,129,233,235, - 15,132,244,39,139,12,36,252,233,244,2,248,5,139,137,233,133,201,15,133,244, - 1,255,139,141,233,133,201,15,132,244,252,252,246,129,233,235,15,132,244,39, - 248,6,137,4,36,199,68,36,4,237,137,108,36,24,139,124,36,16,137,151,233,72, - 141,20,36,137,252,238,137,252,253,137,92,36,20,232,251,1,28,139,149,233,139, - 108,36,24,137,193,252,233,244,2,248,7,128,165,233,235,65,139,134,233,65,137, - 174,233,137,133,233,252,233,244,3,255,15,182,252,236,15,182,192,129,124,253, - 252,234,4,239,15,133,244,40,139,44,252,234,59,133,233,15,131,244,40,193,224, - 3,3,133,233,129,120,253,4,239,15,132,244,249,248,1,252,246,133,233,235,15, - 133,244,253,248,2,139,108,202,4,139,12,202,137,104,4,137,8,139,3,15,182,204, - 15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,131,189,233,0, - 15,132,244,1,255,139,141,233,252,246,129,233,235,15,132,244,40,15,182,75, - 252,253,252,233,244,1,248,7,128,165,233,235,65,139,142,233,65,137,174,233, - 137,141,233,15,182,75,252,253,252,233,244,2,255,68,137,60,36,255,248,1,141, - 12,202,139,105,252,248,252,246,133,233,235,15,133,244,253,248,2,139,68,36, - 4,255,252,242,68,15,45,252,248,255,131,232,1,15,132,244,250,68,1,252,248, - 59,133,233,15,131,244,251,68,41,252,248,65,193,231,3,68,3,189,233,248,3,139, + 153,137,252,248,83,15,162,137,6,137,94,4,137,78,8,137,86,12,91,195,255,249, + 255,129,124,253,202,4,239,15,135,244,41,129,124,253,194,4,239,15,135,244, + 41,255,252,242,15,16,4,194,131,195,4,102,15,46,4,202,255,221,4,202,221,4, + 194,131,195,4,255,223,252,233,221,216,255,218,252,233,223,224,158,255,15, + 134,244,248,255,15,131,244,248,255,248,1,15,183,67,252,254,141,156,253,131, + 233,248,2,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, + 252,238,255,139,108,194,4,131,195,4,129,252,253,239,15,135,244,251,129,124, + 253,202,4,239,15,135,244,251,255,252,242,15,16,4,194,102,15,46,4,202,255, + 221,4,202,221,4,194,255,15,138,244,248,15,133,244,248,255,15,138,244,248, + 15,132,244,247,255,248,1,15,183,67,252,254,141,156,253,131,233,248,2,255, + 248,2,15,183,67,252,254,141,156,253,131,233,248,1,255,248,5,57,108,202,4, + 15,133,244,2,129,252,253,239,15,131,244,1,139,12,202,139,4,194,57,193,15, + 132,244,1,129,252,253,239,15,135,244,2,139,169,233,133,252,237,15,132,244, + 2,252,246,133,233,235,15,133,244,2,255,49,252,237,255,189,1,0,0,0,255,252, + 233,244,45,255,72,252,247,208,131,195,4,129,124,253,202,4,239,15,133,244, + 248,139,12,202,65,59,12,135,255,131,195,4,129,124,253,202,4,239,15,135,244, + 248,255,252,242,65,15,16,4,199,102,15,46,4,202,255,221,4,202,65,221,4,199, + 255,72,252,247,208,131,195,4,57,68,202,4,255,139,108,194,4,131,195,4,129, + 252,253,239,255,15,131,244,247,255,15,130,244,247,255,137,108,202,4,139,44, + 194,137,44,202,255,15,183,67,252,254,141,156,253,131,233,248,1,139,3,15,182, + 204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,139,108,194, + 4,139,4,194,137,108,202,4,137,4,202,139,3,15,182,204,15,182,232,131,195,4, + 193,232,16,65,252,255,36,252,238,255,49,252,237,129,124,253,194,4,239,129, + 213,239,137,108,202,4,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65, + 252,255,36,252,238,255,129,124,253,194,4,239,15,135,244,48,255,252,242,15, + 16,4,194,72,184,237,237,102,72,15,110,200,15,87,193,252,242,15,17,4,202,255, + 221,4,194,217,224,221,28,202,255,129,124,253,194,4,239,15,133,244,248,139, + 4,194,255,15,87,192,252,242,15,42,128,233,248,1,252,242,15,17,4,202,255,219, + 128,233,248,1,221,28,202,255,139,3,15,182,204,15,182,232,131,195,4,193,232, + 16,65,252,255,36,252,238,248,2,129,124,253,194,4,239,15,133,244,50,139,60, + 194,137,213,232,251,1,18,255,252,242,15,42,192,137,252,234,255,15,182,75, + 252,253,252,233,244,1,255,15,182,252,236,15,182,192,255,129,124,253,252,234, + 4,239,15,135,244,46,255,252,242,15,16,4,252,234,252,242,65,15,88,4,199,255, + 221,4,252,234,65,220,4,199,255,129,124,253,252,234,4,239,15,135,244,47,255, + 252,242,65,15,16,4,199,252,242,15,88,4,252,234,255,65,221,4,199,220,4,252, + 234,255,129,124,253,252,234,4,239,15,135,244,49,129,124,253,194,4,239,15, + 135,244,49,255,252,242,15,16,4,252,234,252,242,15,88,4,194,255,221,4,252, + 234,220,4,194,255,252,242,15,16,4,252,234,252,242,65,15,92,4,199,255,221, + 4,252,234,65,220,36,199,255,252,242,65,15,16,4,199,252,242,15,92,4,252,234, + 255,65,221,4,199,220,36,252,234,255,252,242,15,16,4,252,234,252,242,15,92, + 4,194,255,221,4,252,234,220,36,194,255,252,242,15,16,4,252,234,252,242,65, + 15,89,4,199,255,221,4,252,234,65,220,12,199,255,252,242,65,15,16,4,199,252, + 242,15,89,4,252,234,255,65,221,4,199,220,12,252,234,255,252,242,15,16,4,252, + 234,252,242,15,89,4,194,255,221,4,252,234,220,12,194,255,252,242,15,16,4, + 252,234,252,242,65,15,94,4,199,255,221,4,252,234,65,220,52,199,255,252,242, + 65,15,16,4,199,252,242,15,94,4,252,234,255,65,221,4,199,220,52,252,234,255, + 252,242,15,16,4,252,234,252,242,15,94,4,194,255,221,4,252,234,220,52,194, + 255,252,242,15,16,4,252,234,252,242,65,15,16,12,199,255,221,4,252,234,65, + 221,4,199,255,252,242,65,15,16,4,199,252,242,15,16,12,252,234,255,65,221, + 4,199,221,4,252,234,255,252,242,15,16,4,252,234,252,242,15,16,12,194,255, + 221,4,252,234,221,4,194,255,248,154,232,244,146,255,252,233,244,154,255,232, + 244,107,255,15,182,252,236,15,182,192,139,124,36,16,137,151,233,141,52,194, + 137,194,41,252,234,248,33,137,252,253,137,92,36,20,232,251,1,21,139,149,233, + 133,192,15,133,244,42,15,182,107,252,255,15,182,75,252,253,139,68,252,234, + 4,139,44,252,234,137,68,202,4,137,44,202,139,3,15,182,204,15,182,232,131, + 195,4,193,232,16,65,252,255,36,252,238,255,72,252,247,208,65,139,4,135,199, + 68,202,4,237,137,4,202,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65, + 252,255,36,252,238,255,15,191,192,252,242,15,42,192,252,242,15,17,4,202,255, + 223,67,252,254,221,28,202,255,252,242,65,15,16,4,199,252,242,15,17,4,202, + 255,65,221,4,199,221,28,202,255,72,252,247,208,137,68,202,4,139,3,15,182, + 204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,141,76,202, + 12,141,68,194,4,189,237,137,105,252,248,248,1,137,41,131,193,8,57,193,15, + 134,244,1,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, + 252,238,255,139,106,252,248,139,172,253,133,233,139,173,233,139,69,4,139, + 109,0,137,68,202,4,137,44,202,139,3,15,182,204,15,182,232,131,195,4,193,232, + 16,65,252,255,36,252,238,255,139,106,252,248,139,172,253,141,233,128,189, + 233,0,139,173,233,139,12,194,139,68,194,4,137,77,0,137,69,4,15,132,244,247, + 252,246,133,233,235,15,133,244,248,248,1,139,3,15,182,204,15,182,232,131, + 195,4,193,232,16,65,252,255,36,252,238,248,2,129,232,239,129,252,248,239, + 15,134,244,1,252,246,129,233,235,15,132,244,1,137,252,238,137,213,65,141, + 190,233,255,232,251,1,22,137,252,234,252,233,244,1,255,72,252,247,208,139, + 106,252,248,139,172,253,141,233,65,139,12,135,139,133,233,137,8,199,64,4, + 237,252,246,133,233,235,15,133,244,248,248,1,139,3,15,182,204,15,182,232, + 131,195,4,193,232,16,65,252,255,36,252,238,248,2,252,246,129,233,235,15,132, + 244,1,128,189,233,0,15,132,244,1,137,213,137,198,65,141,190,233,232,251,1, + 22,137,252,234,252,233,244,1,255,139,106,252,248,255,252,242,65,15,16,4,199, + 255,139,172,253,141,233,139,141,233,255,252,242,15,17,1,255,221,25,255,72, + 252,247,208,139,106,252,248,139,172,253,141,233,139,141,233,137,65,4,139, + 3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,141, + 156,253,131,233,139,108,36,16,131,189,233,0,15,132,244,247,137,149,233,141, + 52,202,137,252,239,232,251,1,23,139,149,233,248,1,139,3,15,182,204,15,182, + 232,131,195,4,193,232,16,65,252,255,36,252,238,255,72,252,247,208,139,108, + 36,16,137,149,233,139,82,252,248,65,139,52,135,137,252,239,137,92,36,20,232, + 251,1,24,139,149,233,15,182,75,252,253,137,4,202,199,68,202,4,237,139,3,15, + 182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,139,124, + 36,16,137,151,233,248,1,137,194,37,252,255,7,0,0,193,252,234,11,61,252,255, + 7,0,0,15,132,244,249,248,2,137,198,65,139,134,233,137,252,253,65,59,134,233, + 137,92,36,20,15,131,244,251,232,251,1,25,139,149,233,15,182,75,252,253,137, + 4,202,199,68,202,4,237,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65, + 252,255,36,252,238,248,3,184,1,8,0,0,252,233,244,2,248,5,232,251,1,26,15, + 183,67,252,254,137,252,239,252,233,244,1,255,72,252,247,208,139,108,36,16, + 65,139,142,233,137,92,36,20,65,59,142,233,137,149,233,15,131,244,249,248, + 2,65,139,52,135,137,252,239,232,251,1,27,139,149,233,15,182,75,252,253,137, + 4,202,199,68,202,4,237,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65, + 252,255,36,252,238,248,3,137,252,239,232,251,1,26,15,183,67,252,254,72,252, + 247,208,252,233,244,2,255,72,252,247,208,139,106,252,248,139,173,233,65,139, + 4,135,252,233,244,155,255,72,252,247,208,139,106,252,248,139,173,233,65,139, + 4,135,252,233,244,156,255,15,182,252,236,15,182,192,129,124,253,252,234,4, + 239,15,133,244,36,139,44,252,234,129,124,253,194,4,239,15,135,244,251,255, + 252,242,15,16,4,194,252,242,15,45,192,252,242,15,42,200,102,15,46,193,255, + 15,133,244,36,59,133,233,15,131,244,36,193,224,3,3,133,233,129,120,253,4, + 239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137,68,202,4,139,3,15, + 182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,2,131,189, + 233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,36,15,182,75, + 252,253,252,233,244,1,248,5,255,129,124,253,194,4,239,15,133,244,36,139,4, + 194,252,233,244,155,255,15,182,252,236,15,182,192,72,252,247,208,65,139,4, + 135,129,124,253,252,234,4,239,15,133,244,34,139,44,252,234,248,155,139,141, + 233,35,136,233,105,201,239,3,141,233,248,1,129,185,233,239,15,133,244,250, + 57,129,233,15,133,244,250,129,121,253,4,239,15,132,244,251,15,182,67,252, + 253,139,41,139,73,4,137,44,194,248,2,255,137,76,194,4,139,3,15,182,204,15, + 182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,15,182,67,252,253, + 185,237,252,233,244,2,248,4,139,137,233,133,201,15,133,244,1,248,5,139,141, + 233,133,201,15,132,244,3,252,246,129,233,235,15,133,244,3,252,233,244,34, + 255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,35,139, + 44,252,234,59,133,233,15,131,244,35,193,224,3,3,133,233,129,120,253,4,239, + 15,132,244,248,248,1,139,40,139,64,4,137,44,202,137,68,202,4,139,3,15,182, + 204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,2,131,189,233, + 0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,35,255,15,182,252, + 236,15,182,192,129,124,253,252,234,4,239,15,133,244,39,139,44,252,234,129, + 124,253,194,4,239,15,135,244,251,255,15,133,244,39,59,133,233,15,131,244, + 39,193,224,3,3,133,233,129,120,253,4,239,15,132,244,249,248,1,252,246,133, + 233,235,15,133,244,253,248,2,139,108,202,4,139,12,202,137,104,4,137,8,139, + 3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3, + 131,189,233,0,15,132,244,1,139,141,233,255,252,246,129,233,235,15,132,244, + 39,15,182,75,252,253,252,233,244,1,248,5,129,124,253,194,4,239,15,133,244, + 39,139,4,194,252,233,244,156,248,7,128,165,233,235,65,139,142,233,65,137, + 174,233,137,141,233,15,182,75,252,253,252,233,244,2,255,15,182,252,236,15, + 182,192,72,252,247,208,65,139,4,135,129,124,253,252,234,4,239,15,133,244, + 37,139,44,252,234,248,156,139,141,233,35,136,233,105,201,239,198,133,233, + 0,3,141,233,248,1,129,185,233,239,15,133,244,251,57,129,233,15,133,244,251, + 129,121,253,4,239,15,132,244,250,248,2,255,252,246,133,233,235,15,133,244, + 253,248,3,15,182,67,252,253,139,108,194,4,139,4,194,137,105,4,137,1,139,3, + 15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,4,131, + 189,233,0,15,132,244,2,137,12,36,139,141,233,252,246,129,233,235,15,132,244, + 37,139,12,36,252,233,244,2,248,5,139,137,233,133,201,15,133,244,1,255,139, + 141,233,133,201,15,132,244,252,252,246,129,233,235,15,132,244,37,248,6,137, + 4,36,199,68,36,4,237,137,108,36,24,139,124,36,16,137,151,233,72,141,20,36, + 137,252,238,137,252,253,137,92,36,20,232,251,1,28,139,149,233,139,108,36, + 24,137,193,252,233,244,2,248,7,128,165,233,235,65,139,134,233,65,137,174, + 233,137,133,233,252,233,244,3,255,15,182,252,236,15,182,192,129,124,253,252, + 234,4,239,15,133,244,38,139,44,252,234,59,133,233,15,131,244,38,193,224,3, + 3,133,233,129,120,253,4,239,15,132,244,249,248,1,252,246,133,233,235,15,133, + 244,253,248,2,139,108,202,4,139,12,202,137,104,4,137,8,139,3,15,182,204,15, + 182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,3,131,189,233,0,15, + 132,244,1,255,139,141,233,252,246,129,233,235,15,132,244,38,15,182,75,252, + 253,252,233,244,1,248,7,128,165,233,235,65,139,142,233,65,137,174,233,137, + 141,233,15,182,75,252,253,252,233,244,2,255,68,137,60,36,255,248,1,141,12, + 202,139,105,252,248,252,246,133,233,235,15,133,244,253,248,2,139,68,36,4, + 255,252,242,68,15,45,252,248,255,131,232,1,15,132,244,250,68,1,252,248,59, + 133,233,15,131,244,251,68,41,252,248,65,193,231,3,68,3,189,233,248,3,139, 41,65,137,47,139,105,4,131,193,8,65,137,111,4,65,131,199,8,131,232,1,15,133, 244,3,248,4,68,139,60,36,139,3,15,182,204,15,182,232,131,195,4,193,232,16, 65,252,255,36,252,238,248,5,139,124,36,16,137,151,233,137,252,238,137,194, 137,252,253,137,92,36,20,232,251,1,29,139,149,233,15,182,75,252,253,252,233, 244,1,248,7,128,165,233,235,65,139,134,233,65,137,174,233,255,137,133,233, - 252,233,244,2,255,3,68,36,4,255,141,76,202,8,139,105,252,248,129,121,253, - 252,252,239,15,133,244,31,252,255,165,233,255,141,76,202,8,65,137,215,139, - 105,252,248,129,121,253,252,252,239,15,133,244,31,248,53,139,90,252,252,252, - 247,195,237,15,133,244,253,248,1,137,106,252,248,137,68,36,4,131,232,1,15, - 132,244,249,248,2,139,41,65,137,47,139,105,4,65,137,111,4,65,131,199,8,131, - 193,8,131,232,1,15,133,244,2,139,106,252,248,248,3,137,209,128,189,233,1, - 15,135,244,251,248,4,139,68,36,4,252,255,165,233,248,5,255,252,247,195,237, - 15,133,244,4,15,182,67,252,253,72,252,247,208,141,20,194,68,139,122,252,248, - 69,139,191,233,69,139,191,233,252,233,244,4,248,7,15,139,244,1,131,227,252, - 248,41,218,65,137,215,139,90,252,252,252,233,244,1,255,141,76,202,8,139,105, - 232,139,65,252,236,137,41,137,65,4,139,105,252,240,139,65,252,244,137,105, - 8,137,65,12,139,105,224,139,65,228,137,105,252,248,137,65,252,252,129,252, - 248,239,184,3,0,0,0,15,133,244,31,252,255,165,233,255,15,182,252,236,139, - 66,252,248,141,12,202,139,128,233,15,182,128,233,68,137,60,36,68,141,188, - 253,194,233,68,43,122,252,252,133,252,237,15,132,244,251,141,108,252,233, - 252,248,65,57,215,15,131,244,248,248,1,65,139,71,252,248,137,1,65,139,71, - 252,252,65,131,199,8,137,65,4,131,193,8,57,252,233,15,131,244,249,65,57,215, - 15,130,244,1,248,2,199,65,4,237,131,193,8,57,252,233,15,130,244,2,248,3,68, - 139,60,36,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252,255,36, - 252,238,248,5,199,68,36,4,1,0,0,0,137,208,68,41,252,248,15,134,244,3,255, - 137,197,193,252,237,3,131,197,1,137,108,36,4,139,108,36,16,1,200,59,133,233, - 15,135,244,253,248,6,65,139,71,252,248,137,1,65,139,71,252,252,65,131,199, - 8,137,65,4,131,193,8,65,57,215,15,130,244,6,252,233,244,3,248,7,137,149,233, - 137,141,233,137,92,36,20,65,41,215,139,116,36,4,131,252,238,1,137,252,239, - 232,251,1,0,139,149,233,139,141,233,65,1,215,252,233,244,6,255,193,225,3, - 255,248,1,139,90,252,252,137,68,36,4,252,247,195,237,15,133,244,253,255,248, - 17,65,137,215,131,232,1,15,132,244,249,248,2,65,139,44,15,65,137,111,252, - 248,65,139,108,15,4,65,137,111,252,252,65,131,199,8,131,232,1,15,133,244, - 2,248,3,139,68,36,4,15,182,107,252,255,248,5,57,197,15,135,244,252,255,139, - 108,10,4,137,106,252,252,139,44,10,137,106,252,248,255,248,5,56,67,252,255, - 15,135,244,252,255,15,182,75,252,253,72,252,247,209,141,20,202,68,139,122, - 252,248,69,139,191,233,69,139,191,233,139,3,15,182,204,15,182,232,131,195, - 4,193,232,16,65,252,255,36,252,238,248,6,255,65,199,71,252,252,237,65,131, - 199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248,7,15,139, - 244,18,131,227,252,248,41,218,255,1,217,255,137,221,209,252,237,129,229,239, - 102,65,131,172,253,46,233,1,15,132,244,141,255,141,12,202,255,129,121,253, - 4,239,15,135,244,54,129,121,253,12,239,15,135,244,54,255,139,105,20,255,129, - 252,253,239,15,135,244,54,255,252,242,15,16,1,252,242,15,16,73,8,255,252, - 242,15,88,65,16,252,242,15,17,1,133,252,237,15,136,244,249,255,15,140,244, - 249,255,102,15,46,200,248,1,252,242,15,17,65,24,255,221,65,8,221,1,255,220, - 65,16,221,17,221,81,24,133,252,237,15,136,244,247,255,221,81,24,15,140,244, - 247,255,217,201,248,1,255,15,183,67,252,254,255,15,131,244,248,141,156,253, - 131,233,255,141,156,253,131,233,15,183,67,252,254,15,131,245,255,15,130,244, - 248,141,156,253,131,233,255,248,3,102,15,46,193,252,233,244,1,255,141,12, - 202,139,105,4,129,252,253,239,15,132,244,247,255,137,105,252,252,139,41,137, - 105,252,248,252,233,245,255,141,156,253,131,233,139,1,137,105,252,252,137, - 65,252,248,255,65,139,142,233,139,4,129,72,139,128,233,139,108,36,16,65,137, - 150,233,65,137,174,233,252,255,224,255,141,156,253,131,233,139,3,15,182,204, - 15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,255,254,0 + 252,233,244,2,255,3,68,36,4,255,129,124,253,202,4,239,139,44,202,15,133,244, + 51,141,84,202,8,137,90,252,252,139,157,233,139,11,15,182,252,233,15,182,205, + 131,195,4,65,252,255,36,252,238,255,141,76,202,8,65,137,215,139,105,252,248, + 129,121,253,252,252,239,15,133,244,28,248,52,139,90,252,252,252,247,195,237, + 15,133,244,253,248,1,137,106,252,248,137,68,36,4,131,232,1,15,132,244,249, + 248,2,139,41,65,137,47,139,105,4,65,137,111,4,65,131,199,8,131,193,8,131, + 232,1,15,133,244,2,139,106,252,248,248,3,139,68,36,4,128,189,233,1,15,135, + 244,251,248,4,139,157,233,139,11,15,182,252,233,15,182,205,131,195,4,65,252, + 255,36,252,238,248,5,255,252,247,195,237,15,133,244,4,15,182,75,252,253,72, + 252,247,209,141,12,202,68,139,121,252,248,69,139,191,233,69,139,191,233,252, + 233,244,4,248,7,15,139,244,1,131,227,252,248,41,218,65,137,215,139,90,252, + 252,252,233,244,1,255,141,76,202,8,139,105,232,139,65,252,236,137,41,137, + 65,4,139,105,252,240,139,65,252,244,137,105,8,137,65,12,139,105,224,139,65, + 228,137,105,252,248,137,65,252,252,129,252,248,239,184,237,15,133,244,28, + 137,202,137,90,252,252,139,157,233,139,11,15,182,252,233,15,182,205,131,195, + 4,65,252,255,36,252,238,255,15,182,252,236,139,66,252,248,141,12,202,139, + 128,233,15,182,128,233,68,137,60,36,68,141,188,253,194,233,68,43,122,252, + 252,133,252,237,15,132,244,251,141,108,252,233,252,248,65,57,215,15,131,244, + 248,248,1,65,139,71,252,248,137,1,65,139,71,252,252,65,131,199,8,137,65,4, + 131,193,8,57,252,233,15,131,244,249,65,57,215,15,130,244,1,248,2,199,65,4, + 237,131,193,8,57,252,233,15,130,244,2,248,3,68,139,60,36,139,3,15,182,204, + 15,182,232,131,195,4,193,232,16,65,252,255,36,252,238,248,5,199,68,36,4,1, + 0,0,0,137,208,68,41,252,248,15,134,244,3,255,137,197,193,252,237,3,131,197, + 1,137,108,36,4,139,108,36,16,1,200,59,133,233,15,135,244,253,248,6,65,139, + 71,252,248,137,1,65,139,71,252,252,65,131,199,8,137,65,4,131,193,8,65,57, + 215,15,130,244,6,252,233,244,3,248,7,137,149,233,137,141,233,137,92,36,20, + 65,41,215,139,116,36,4,131,252,238,1,137,252,239,232,251,1,0,139,149,233, + 139,141,233,65,1,215,252,233,244,6,255,193,225,3,255,248,1,139,90,252,252, + 137,68,36,4,252,247,195,237,15,133,244,253,255,248,13,65,137,215,131,232, + 1,15,132,244,249,248,2,65,139,44,15,65,137,111,252,248,65,139,108,15,4,65, + 137,111,252,252,65,131,199,8,131,232,1,15,133,244,2,248,3,139,68,36,4,15, + 182,107,252,255,248,5,57,197,15,135,244,252,255,139,108,10,4,137,106,252, + 252,139,44,10,137,106,252,248,255,248,5,56,67,252,255,15,135,244,252,255, + 15,182,75,252,253,72,252,247,209,141,20,202,68,139,122,252,248,69,139,191, + 233,69,139,191,233,139,3,15,182,204,15,182,232,131,195,4,193,232,16,65,252, + 255,36,252,238,248,6,255,65,199,71,252,252,237,65,131,199,8,255,199,68,194, + 252,244,237,255,131,192,1,252,233,244,5,248,7,15,139,244,14,131,227,252,248, + 41,218,255,1,217,255,137,221,209,252,237,129,229,239,102,65,131,172,253,46, + 233,1,15,132,244,139,255,141,12,202,255,129,121,253,4,239,15,135,244,53,129, + 121,253,12,239,15,135,244,53,255,139,105,20,255,129,252,253,239,15,135,244, + 53,255,252,242,15,16,1,252,242,15,16,73,8,255,252,242,15,88,65,16,252,242, + 15,17,1,133,252,237,15,136,244,249,255,15,140,244,249,255,102,15,46,200,248, + 1,252,242,15,17,65,24,255,221,65,8,221,1,255,220,65,16,221,17,221,81,24,133, + 252,237,15,136,244,247,255,221,81,24,15,140,244,247,255,217,201,248,1,255, + 15,183,67,252,254,255,15,131,244,248,141,156,253,131,233,255,141,156,253, + 131,233,15,183,67,252,254,15,131,245,255,15,130,244,248,141,156,253,131,233, + 255,248,3,102,15,46,193,252,233,244,1,255,141,12,202,139,105,4,129,252,253, + 239,15,132,244,247,255,137,105,252,252,139,41,137,105,252,248,252,233,245, + 255,141,156,253,131,233,139,1,137,105,252,252,137,65,252,248,255,65,139,142, + 233,139,4,129,72,139,128,233,139,108,36,16,65,137,150,233,65,137,174,233, + 252,255,224,255,141,156,253,131,233,139,3,15,182,204,15,182,232,131,195,4, + 193,232,16,65,252,255,36,252,238,255,68,139,187,233,139,108,36,16,141,12, + 202,59,141,233,15,135,244,23,15,182,139,233,57,200,15,134,244,249,248,2,255, + 15,183,67,252,254,252,233,245,255,248,3,199,68,194,252,252,237,131,192,1, + 57,200,15,134,244,3,252,233,244,2,255,141,44,197,237,141,4,194,68,139,122, + 252,248,137,104,252,252,68,137,120,252,248,139,108,36,16,141,12,200,59,141, + 233,15,135,244,22,137,209,137,194,15,182,171,233,133,252,237,15,132,244,248, + 248,1,131,193,8,57,209,15,131,244,249,68,139,121,252,248,68,137,56,68,139, + 121,252,252,68,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15,133, + 244,1,248,2,255,68,139,187,233,139,3,15,182,204,15,182,232,131,195,4,193, + 232,16,65,252,255,36,252,238,255,248,3,199,64,4,237,131,192,8,131,252,237, + 1,15,133,244,3,252,233,244,2,255,139,106,252,248,76,139,189,233,139,108,36, + 16,141,68,194,252,248,137,149,233,141,136,233,59,141,233,137,133,233,255, + 137,252,239,255,76,137,252,254,137,252,239,255,15,135,244,21,65,199,134,233, + 237,255,65,252,255,215,255,65,252,255,150,233,255,65,199,134,233,237,139, + 149,233,141,12,194,252,247,217,3,141,233,139,90,252,252,252,233,244,12,255, + 254,0 }; enum { - GLOB_gate_lf, - GLOB_gate_lf_growstack, - GLOB_gate_lv, - GLOB_gate_lv_growstack, - GLOB_gate_cwrap, - GLOB_gate_c_growstack, + GLOB_vm_returnp, + GLOB_cont_dispatch, GLOB_vm_returnc, GLOB_BC_RET_Z, GLOB_vm_return, - GLOB_gate_c, - GLOB_vm_returnp, GLOB_vm_leave_cp, GLOB_vm_leave_unw, GLOB_vm_unwind_c, GLOB_vm_unwind_c_eh, GLOB_vm_unwind_ff, GLOB_vm_unwind_ff_eh, - GLOB_cont_dispatch, + GLOB_vm_growstack_c, + GLOB_vm_growstack_v, + GLOB_vm_growstack_f, GLOB_vm_resume, GLOB_vm_pcall, GLOB_vm_call, + GLOB_vm_call_dispatch, GLOB_vmeta_call, + GLOB_vm_call_dispatch_f, GLOB_vm_cpcall, GLOB_cont_cat, GLOB_cont_ra, @@ -717,6 +714,7 @@ enum { GLOB_vmeta_unm, GLOB_vmeta_arith_vv, GLOB_vmeta_len, + GLOB_vmeta_call_ra, GLOB_BC_CALLT_Z, GLOB_vmeta_for, GLOB_ff_assert, @@ -790,12 +788,11 @@ enum { GLOB_ff_table_getn, GLOB_ff_bit_tobit, GLOB_ff_bit_band, - GLOB_fff_resbit_op, + GLOB_fff_resbit, GLOB_fff_fallback_bit_op, GLOB_ff_bit_bor, GLOB_ff_bit_bxor, GLOB_ff_bit_bswap, - GLOB_fff_resbit, GLOB_ff_bit_bnot, GLOB_ff_bit_lshift, GLOB_ff_bit_rshift, @@ -826,28 +823,26 @@ enum { GLOB__MAX }; static const char *const globnames[] = { - "gate_lf", - "gate_lf_growstack", - "gate_lv", - "gate_lv_growstack", - "gate_cwrap", - "gate_c_growstack", + "vm_returnp", + "cont_dispatch", "vm_returnc", "BC_RET_Z", "vm_return", - "gate_c", - "vm_returnp", "vm_leave_cp", "vm_leave_unw", "vm_unwind_c@8", "vm_unwind_c_eh", "vm_unwind_ff@4", "vm_unwind_ff_eh", - "cont_dispatch", + "vm_growstack_c", + "vm_growstack_v", + "vm_growstack_f", "vm_resume", "vm_pcall", "vm_call", + "vm_call_dispatch", "vmeta_call", + "vm_call_dispatch_f", "vm_cpcall", "cont_cat", "cont_ra", @@ -869,6 +864,7 @@ static const char *const globnames[] = { "vmeta_unm", "vmeta_arith_vv", "vmeta_len", + "vmeta_call_ra", "BC_CALLT_Z", "vmeta_for", "ff_assert", @@ -942,12 +938,11 @@ static const char *const globnames[] = { "ff_table_getn", "ff_bit_tobit", "ff_bit_band", - "fff_resbit_op", + "fff_resbit", "fff_fallback_bit_op", "ff_bit_bor", "ff_bit_bxor", "ff_bit_bswap", - "fff_resbit", "ff_bit_bnot", "ff_bit_lshift", "ff_bit_rshift", @@ -1033,392 +1028,367 @@ static const char *const extnames[] = { static void build_subroutines(BuildCtx *ctx, int cmov, int sse) { dasm_put(Dst, 0); - dasm_put(Dst, 2, Dt7(->pc), PC2PROTO(framesize), PC2PROTO(k), Dt1(->maxstack), PC2PROTO(numparams)); -#if LJ_HASJIT -#endif - dasm_put(Dst, 48, LJ_TNIL, FRAME_VARG, -FRAME_VARG, Dt7(->pc), PC2PROTO(framesize), Dt1(->maxstack), PC2PROTO(numparams)); - dasm_put(Dst, 161, LJ_TNIL, PC2PROTO(k)); -#if LJ_HASJIT -#endif - dasm_put(Dst, 201, LJ_TNIL, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), DISPATCH_GL(vmstate), ~LJ_VMST_C, DISPATCH_GL(wrapf), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 303, Dt1(->top), FRAME_TYPE, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), DISPATCH_GL(vmstate), ~LJ_VMST_C, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 389, Dt1(->top), FRAME_TYPE, FRAME_C, DISPATCH_GL(vmstate), ~LJ_VMST_C, Dt1(->base)); - dasm_put(Dst, 495, Dt1(->top), Dt1(->cframe), Dt1(->maxstack), LJ_TNIL); - dasm_put(Dst, 584, Dt1(->top), Dt1(->top), Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); - dasm_put(Dst, 688, FRAME_P, LJ_TTRUE, LUA_MINSTACK, PC2PROTO(framesize), Dt1(->base), Dt1(->top), Dt1(->base)); - dasm_put(Dst, 778, Dt1(->top), Dt7(->gate), FRAME_CP, CFRAME_RESUME, Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE); - dasm_put(Dst, 917, FRAME_CP, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), LJ_TFUNC, Dt7(->gate)); - dasm_put(Dst, 1042, Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), FRAME_CP, LJ_TNIL, 0, Dt7(->pc), PC2PROTO(k), Dt1(->base)); - dasm_put(Dst, 1226, LJ_TSTR, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB); + dasm_put(Dst, 2, FRAME_P, LJ_TTRUE, FRAME_TYPE, FRAME_C, DISPATCH_GL(vmstate), ~LJ_VMST_C); + dasm_put(Dst, 111, Dt1(->base), Dt1(->top), Dt1(->cframe), Dt1(->maxstack), LJ_TNIL); + dasm_put(Dst, 202, Dt1(->top), Dt1(->top), Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1); + dasm_put(Dst, 298, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, LUA_MINSTACK, -4+PC2PROTO(framesize), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 367, Dt1(->base), Dt1(->top), Dt7(->pc), FRAME_CP, CFRAME_RESUME, Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE); + dasm_put(Dst, 535, FRAME_CP, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 648, LJ_TFUNC, Dt7(->pc), Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), FRAME_CP, LJ_TNIL, 0, Dt7(->pc)); + dasm_put(Dst, 813, PC2PROTO(k), Dt1(->base), LJ_TSTR, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB); if (sse) { - dasm_put(Dst, 1271); + dasm_put(Dst, 922); } else { } - dasm_put(Dst, 1283, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, Dt7(->gate), LJ_TSTR, BC_GSET, DISPATCH_GL(tmptv)); - dasm_put(Dst, 1441, LJ_TTAB); + dasm_put(Dst, 934, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 2+1, LJ_TSTR, BC_GSET); + dasm_put(Dst, 1085, DISPATCH_GL(tmptv), LJ_TTAB); if (sse) { - dasm_put(Dst, 1271); + dasm_put(Dst, 922); } else { } - dasm_put(Dst, 1461, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, Dt7(->gate), Dt1(->base), Dt1(->base)); - dasm_put(Dst, 1656, -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND, Dt1(->base)); - dasm_put(Dst, 1764, Dt1(->base), Dt1(->base), FRAME_CONT, LJ_TFUNC); - dasm_put(Dst, 1887, Dt7(->gate), Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base), Dt7(->gate), Dt1(->base), Dt1(->base), BC__MAX*8, 1+1); - dasm_put(Dst, 2042, LJ_TISTRUECOND, 1+1, ~LJ_TNUMX); + dasm_put(Dst, 1109, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 3+1, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 1291, -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND, Dt1(->base)); + dasm_put(Dst, 1390, Dt1(->base), Dt1(->base), FRAME_CONT); + dasm_put(Dst, 1513, 2+1, Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base), GG_DISP2STATIC); + dasm_put(Dst, 1691, 1+1, LJ_TISTRUECOND, 1+1, ~LJ_TNUMX); if (cmov) { - dasm_put(Dst, 2136); + dasm_put(Dst, 1793); } else { - dasm_put(Dst, 2140); + dasm_put(Dst, 1797); } - dasm_put(Dst, 2149, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(mmname)+4*MM_metatable, LJ_TTAB, Dt6(->hmask)); - dasm_put(Dst, 2237, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL); - dasm_put(Dst, 2292, LJ_TUDATA, LJ_TISNUM, LJ_TNUMX, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB); - dasm_put(Dst, 2364, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); - dasm_put(Dst, 2431, 2+1, LJ_TTAB, 1+1, LJ_TISNUM); + dasm_put(Dst, 1806, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(mmname)+4*MM_metatable, LJ_TTAB, Dt6(->hmask)); + dasm_put(Dst, 1895, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL); + dasm_put(Dst, 1950, LJ_TUDATA, LJ_TISNUM, LJ_TNUMX, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB); + dasm_put(Dst, 2019, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 2090, 2+1, LJ_TTAB, 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 2509); + dasm_put(Dst, 2166); } else { - dasm_put(Dst, 2519); + dasm_put(Dst, 2176); } - dasm_put(Dst, 2526, 1+1, LJ_TSTR, LJ_TSTR, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); - dasm_put(Dst, 2591, Dt1(->base), Dt1(->base), 1+1, LJ_TTAB, Dt1(->base)); - dasm_put(Dst, 2675, Dt1(->base), 1+2, LJ_TNIL, LJ_TNIL, 1+1, LJ_TTAB); - dasm_put(Dst, 2775, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 1+1, LJ_TTAB, LJ_TISNUM); + dasm_put(Dst, 2183, 1+1, LJ_TSTR, LJ_TSTR, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 2252, Dt1(->base), Dt1(->base), 1+1, LJ_TTAB, Dt1(->base)); + dasm_put(Dst, 2321, Dt1(->base), 1+2, LJ_TNIL, LJ_TNIL, 1+1, LJ_TTAB); + dasm_put(Dst, 2424, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 1+1, LJ_TTAB, LJ_TISNUM); if (sse) { - dasm_put(Dst, 2830, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 2487, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); } else { } - dasm_put(Dst, 2863, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0); - dasm_put(Dst, 2950, 1+1, LJ_TTAB, Dt8(->upvalue[0]), LJ_TFUNC); + dasm_put(Dst, 2520, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0); + dasm_put(Dst, 2601, 1+1, LJ_TTAB, Dt8(->upvalue[0]), LJ_TFUNC); if (sse) { - dasm_put(Dst, 2980); + dasm_put(Dst, 2639); } else { - dasm_put(Dst, 2990); + dasm_put(Dst, 2649); } - dasm_put(Dst, 2997, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE, LJ_TFUNC, Dt7(->gate)); - dasm_put(Dst, 3071, 2+1, LJ_TFUNC, LJ_TFUNC, 2*8+FRAME_PCALL, 2*8, 1+1, LJ_TTHREAD); - dasm_put(Dst, 3169, Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top)); - dasm_put(Dst, 3235, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top)); - dasm_put(Dst, 3339, Dt1(->maxstack), LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2); - dasm_put(Dst, 3462, Dt1(->top), Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base)); - dasm_put(Dst, 3543, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 3649, LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), FRAME_TYPE); - dasm_put(Dst, 3749, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status)); + dasm_put(Dst, 2656, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE_SHIFT, 2+1, LJ_TFUNC); + dasm_put(Dst, 2721, LJ_TFUNC, 16+FRAME_PCALL, 1+1, LJ_TTHREAD, Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top)); + dasm_put(Dst, 2810, Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); + dasm_put(Dst, 2903, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), LJ_TTRUE, FRAME_TYPE); + dasm_put(Dst, 3023, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2, Dt1(->top), Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe)); + dasm_put(Dst, 3119, Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 3185, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack)); + dasm_put(Dst, 3280, FRAME_TYPE, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME); + dasm_put(Dst, 3392, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status)); if (sse) { - dasm_put(Dst, 3836, 1+1, LJ_TISNUM, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); + dasm_put(Dst, 3419, 1+1, LJ_TISNUM, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); } else { - dasm_put(Dst, 3892, 1+1, LJ_TISNUM); + dasm_put(Dst, 3483, 1+1, LJ_TISNUM); } - dasm_put(Dst, 3924, 1+1, FRAME_TYPE, LJ_TNIL); + dasm_put(Dst, 3519, 1+1, FRAME_TYPE, LJ_TNIL); if (sse) { - dasm_put(Dst, 4009, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4071, 1+1, LJ_TISNUM); + dasm_put(Dst, 3614, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 3676, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4101, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4160, 1+1, LJ_TISNUM); + dasm_put(Dst, 3706, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 3765, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4187, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4256, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4313, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4376, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4466); + dasm_put(Dst, 3792, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3861, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3918, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3981, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 4071); if (sse) { - dasm_put(Dst, 4478, 1+1, LJ_TISNUM); + dasm_put(Dst, 4083, 1+1, LJ_TISNUM); } else { } - dasm_put(Dst, 4503); + dasm_put(Dst, 4108); if (sse) { - dasm_put(Dst, 4523, 1+1, LJ_TISNUM); + dasm_put(Dst, 4122, 1+1, LJ_TISNUM); } else { } - dasm_put(Dst, 4548); + dasm_put(Dst, 4147); if (sse) { - dasm_put(Dst, 4568, 1+1, LJ_TISNUM); + dasm_put(Dst, 4161, 1+1, LJ_TISNUM); } else { } - dasm_put(Dst, 4593); + dasm_put(Dst, 4186); if (sse) { - dasm_put(Dst, 4615, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); + dasm_put(Dst, 4202, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); } else { - dasm_put(Dst, 4650, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); + dasm_put(Dst, 4241, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); } - dasm_put(Dst, 4679, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM); - dasm_put(Dst, 4744, 1+1, LJ_TISNUM); + dasm_put(Dst, 4274, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4339, 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 4839); + dasm_put(Dst, 4438); } else { - dasm_put(Dst, 4845); + dasm_put(Dst, 4444); } - dasm_put(Dst, 4852); + dasm_put(Dst, 4451); if (sse) { - dasm_put(Dst, 4877); + dasm_put(Dst, 4476); } else { - dasm_put(Dst, 4883); + dasm_put(Dst, 4482); } - dasm_put(Dst, 4886, 1+2); + dasm_put(Dst, 4485, 1+2); if (sse) { - dasm_put(Dst, 4895); + dasm_put(Dst, 4494); } else { - dasm_put(Dst, 4903); + dasm_put(Dst, 4502); } - dasm_put(Dst, 492); + dasm_put(Dst, 4510); if (sse) { - dasm_put(Dst, 4911, (unsigned int)(U64x(43500000,00000000)), (unsigned int)((U64x(43500000,00000000))>>32)); + dasm_put(Dst, 4513, (unsigned int)(U64x(43500000,00000000)), (unsigned int)((U64x(43500000,00000000))>>32)); } else { - dasm_put(Dst, 4938); + dasm_put(Dst, 4540); } - dasm_put(Dst, 4955); + dasm_put(Dst, 4557); if (sse) { - dasm_put(Dst, 4971, 1+1, LJ_TISNUM); + dasm_put(Dst, 4573, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4996, 1+1, LJ_TISNUM); + dasm_put(Dst, 4598, 1+1, LJ_TISNUM); } - dasm_put(Dst, 5018); + dasm_put(Dst, 4620); if (sse) { - dasm_put(Dst, 5036); + dasm_put(Dst, 4642); } else { - dasm_put(Dst, 5062); + dasm_put(Dst, 4668); } - dasm_put(Dst, 5079, 1+2); + dasm_put(Dst, 4685, 1+2); if (sse) { - dasm_put(Dst, 5119); + dasm_put(Dst, 4725); } else { - dasm_put(Dst, 5127); + dasm_put(Dst, 4733); } - dasm_put(Dst, 5137, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4743, 2+1, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 5189, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4795, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 5236, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4842, 2+1, LJ_TISNUM, LJ_TISNUM); } if (sse) { - dasm_put(Dst, 5277, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4883, 1+1, LJ_TISNUM, LJ_TISNUM); } else { } if (sse) { - dasm_put(Dst, 5348, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4954, 1+1, LJ_TISNUM, LJ_TISNUM); } else { } if (!sse) { - dasm_put(Dst, 5419); + dasm_put(Dst, 5025); } - dasm_put(Dst, 5428, 1+1, LJ_TSTR); + dasm_put(Dst, 5034, 1+1, LJ_TSTR); if (sse) { - dasm_put(Dst, 5450, Dt5(->len)); + dasm_put(Dst, 5056, Dt5(->len)); } else { - dasm_put(Dst, 5461, Dt5(->len)); + dasm_put(Dst, 5067, Dt5(->len)); } - dasm_put(Dst, 5469, 1+1, LJ_TSTR, Dt5(->len), Dt5([1])); + dasm_put(Dst, 5075, 1+1, LJ_TSTR, Dt5(->len), Dt5([1])); if (sse) { - dasm_put(Dst, 5503); + dasm_put(Dst, 5113); } else { - dasm_put(Dst, 5513); + dasm_put(Dst, 5123); } - dasm_put(Dst, 5524, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM); + dasm_put(Dst, 5134, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 5561); + dasm_put(Dst, 5171); } else { - dasm_put(Dst, 5581); + dasm_put(Dst, 5191); } - dasm_put(Dst, 5601, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2, LJ_TISNUM); - dasm_put(Dst, 2504); + dasm_put(Dst, 5211, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2, LJ_TISNUM); + dasm_put(Dst, 2161); if (sse) { - dasm_put(Dst, 5715); + dasm_put(Dst, 5320); } else { - dasm_put(Dst, 5726); + dasm_put(Dst, 5331); } - dasm_put(Dst, 5734, LJ_TSTR, LJ_TISNUM, Dt5(->len)); + dasm_put(Dst, 5339, LJ_TSTR, LJ_TISNUM, Dt5(->len)); if (sse) { - dasm_put(Dst, 5764); + dasm_put(Dst, 5369); } else { } - dasm_put(Dst, 5771, sizeof(GCstr)-1); - dasm_put(Dst, 5846, 2+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); - dasm_put(Dst, 5907, LJ_TSTR, LJ_TISNUM); + dasm_put(Dst, 5376, sizeof(GCstr)-1); + dasm_put(Dst, 5451, 2+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 5512, LJ_TSTR, LJ_TISNUM); if (sse) { - dasm_put(Dst, 5931); + dasm_put(Dst, 5533); } else { - dasm_put(Dst, 5938); + dasm_put(Dst, 5540); } - dasm_put(Dst, 5950, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(tmpbuf.buf), 1+1); - dasm_put(Dst, 6018, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); - dasm_put(Dst, 6088, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz)); - dasm_put(Dst, 6164, sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), 1+1); - dasm_put(Dst, 6249, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); - dasm_put(Dst, 6326, 1+1, LJ_TTAB); + dasm_put(Dst, 5552, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(tmpbuf.buf), 1+1); + dasm_put(Dst, 5620, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 5687, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz)); + dasm_put(Dst, 5760, sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), 1+1); + dasm_put(Dst, 5845, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 5919, 1+1, LJ_TTAB); if (sse) { - dasm_put(Dst, 6399); + dasm_put(Dst, 5986); } else { } if (sse) { - dasm_put(Dst, 6409, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 5996, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } if (sse) { - dasm_put(Dst, 6461, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6048, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6504); + dasm_put(Dst, 6091, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6514); - } - dasm_put(Dst, 6518, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6536); + dasm_put(Dst, 6118); } else { } - dasm_put(Dst, 6553); + dasm_put(Dst, 6135); if (sse) { - dasm_put(Dst, 6561, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6143, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6504); + dasm_put(Dst, 6091, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6514); - } - dasm_put(Dst, 6518, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6604); + dasm_put(Dst, 6186); } else { } - dasm_put(Dst, 6553); + dasm_put(Dst, 6135); if (sse) { - dasm_put(Dst, 6621, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6203, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6504); + dasm_put(Dst, 6091, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6514); - } - dasm_put(Dst, 6518, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6664); + dasm_put(Dst, 6246); } else { } - dasm_put(Dst, 6553); + dasm_put(Dst, 6135); if (sse) { - dasm_put(Dst, 6681, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6263, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6724); + dasm_put(Dst, 6306); if (sse) { - dasm_put(Dst, 6731, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6313, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6774); + dasm_put(Dst, 6356); if (sse) { - dasm_put(Dst, 6778); + dasm_put(Dst, 6360); } else { } - dasm_put(Dst, 6804); + dasm_put(Dst, 6372); if (sse) { - dasm_put(Dst, 6395); - } - dasm_put(Dst, 6807); - if (sse) { - dasm_put(Dst, 6816, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6383, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6885); + dasm_put(Dst, 6452); if (sse) { - dasm_put(Dst, 6894, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6461, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 6963); + dasm_put(Dst, 6530); if (sse) { - dasm_put(Dst, 6973, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6540, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 7042); + dasm_put(Dst, 6609); if (sse) { - dasm_put(Dst, 7052, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6619, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 7121); + dasm_put(Dst, 6688); if (sse) { - dasm_put(Dst, 7130, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + dasm_put(Dst, 6697, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } - dasm_put(Dst, 7199, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base)); - dasm_put(Dst, 7282, Dt1(->top), Dt7(->gate), LJ_TFUNC, Dt7(->gate), Dt1(->base), LUA_MINSTACK, Dt1(->base), Dt1(->top)); - dasm_put(Dst, 7400, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 6766, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base)); + dasm_put(Dst, 6844, Dt1(->top), Dt7(->pc), FRAME_TYPE, LUA_MINSTACK, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 6970, Dt1(->top), Dt1(->base), Dt1(->top)); #if LJ_HASJIT - dasm_put(Dst, 7442, DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount)); + dasm_put(Dst, 7009, DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount)); #endif - dasm_put(Dst, 7475, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base), Dt1(->base)); - dasm_put(Dst, 7542, BC__MAX*8); + dasm_put(Dst, 7042, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 7109, GG_DISP2STATIC); #if LJ_HASJIT - dasm_put(Dst, 7579); + dasm_put(Dst, 7146); #endif - dasm_put(Dst, 7581); + dasm_put(Dst, 7148); #if LJ_HASJIT - dasm_put(Dst, 7579); + dasm_put(Dst, 7146); #endif - dasm_put(Dst, 7584); + dasm_put(Dst, 7151); #if LJ_HASJIT - dasm_put(Dst, 7579); + dasm_put(Dst, 7146); #endif - dasm_put(Dst, 7587); + dasm_put(Dst, 7154); #if LJ_HASJIT - dasm_put(Dst, 7590, Dt7(->pc), PC2PROTO(k), DISPATCH_GL(jit_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); + dasm_put(Dst, 7157, Dt7(->pc), PC2PROTO(k), DISPATCH_GL(jit_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); #endif - dasm_put(Dst, 7637); + dasm_put(Dst, 7204); if (!sse) { - dasm_put(Dst, 7640); + dasm_put(Dst, 7207); } - dasm_put(Dst, 7685, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7252, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); if (!sse) { - dasm_put(Dst, 7771); + dasm_put(Dst, 7338); } - dasm_put(Dst, 7816, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32)); + dasm_put(Dst, 7383, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32)); if (!sse) { - dasm_put(Dst, 7902); + dasm_put(Dst, 7469); } - dasm_put(Dst, 7941, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7508, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); if (sse) { - dasm_put(Dst, 8030, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7597, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); } else { - dasm_put(Dst, 8144); + dasm_put(Dst, 7711); } - dasm_put(Dst, 8191); + dasm_put(Dst, 7758); if (!sse) { } else { - dasm_put(Dst, 8268); + dasm_put(Dst, 7835); } - dasm_put(Dst, 8271); - dasm_put(Dst, 8356, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); - dasm_put(Dst, 8457, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7ff00000,00000000)), (unsigned int)((U64x(7ff00000,00000000))>>32)); - dasm_put(Dst, 8631); + dasm_put(Dst, 7838); + dasm_put(Dst, 7923, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 8024, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7ff00000,00000000)), (unsigned int)((U64x(7ff00000,00000000))>>32)); + dasm_put(Dst, 8198); if (sse) { - dasm_put(Dst, 8672); - dasm_put(Dst, 8742); - dasm_put(Dst, 8814); + dasm_put(Dst, 8239); + dasm_put(Dst, 8309); + dasm_put(Dst, 8381); } else { - dasm_put(Dst, 8866); - dasm_put(Dst, 8958); + dasm_put(Dst, 8433); + dasm_put(Dst, 8525); } - dasm_put(Dst, 9004); + dasm_put(Dst, 8571); if (sse) { - dasm_put(Dst, 9010, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); - dasm_put(Dst, 9095, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); + dasm_put(Dst, 8577, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); + dasm_put(Dst, 8662, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); } else { - dasm_put(Dst, 9223); - dasm_put(Dst, 9306); + dasm_put(Dst, 8790); + dasm_put(Dst, 8873); if (cmov) { - dasm_put(Dst, 9361); + dasm_put(Dst, 8928); } else { - dasm_put(Dst, 9380); + dasm_put(Dst, 8947); } - dasm_put(Dst, 9219); + dasm_put(Dst, 8786); } - dasm_put(Dst, 9421); + dasm_put(Dst, 8988); } /* Generate the code for a single instruction. */ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) { int vk = 0; - dasm_put(Dst, 159, defop); + dasm_put(Dst, 9010, defop); switch (op) { @@ -1427,602 +1397,602 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) /* Remember: all ops branch for a true comparison, fall through otherwise. */ case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - dasm_put(Dst, 9443, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9012, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 9464); + dasm_put(Dst, 9033); } else { - dasm_put(Dst, 9479); + dasm_put(Dst, 9048); if (cmov) { - dasm_put(Dst, 9489); + dasm_put(Dst, 9058); } else { - dasm_put(Dst, 9495); + dasm_put(Dst, 9064); } } switch (op) { case BC_ISLT: - dasm_put(Dst, 9502); + dasm_put(Dst, 9071); break; case BC_ISGE: - dasm_put(Dst, 9301); + dasm_put(Dst, 8868); break; case BC_ISLE: - dasm_put(Dst, 6321); + dasm_put(Dst, 5914); break; case BC_ISGT: - dasm_put(Dst, 9507); + dasm_put(Dst, 9076); break; default: break; /* Shut up GCC. */ } - dasm_put(Dst, 9512, -BCBIAS_J*4); + dasm_put(Dst, 9081, -BCBIAS_J*4); break; case BC_ISEQV: case BC_ISNEV: vk = op == BC_ISEQV; - dasm_put(Dst, 9547, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9116, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 9573); + dasm_put(Dst, 9142); } else { - dasm_put(Dst, 9585); + dasm_put(Dst, 9154); if (cmov) { - dasm_put(Dst, 9489); + dasm_put(Dst, 9058); } else { - dasm_put(Dst, 9495); + dasm_put(Dst, 9064); } } iseqne_fp: if (vk) { - dasm_put(Dst, 9592); + dasm_put(Dst, 9161); } else { - dasm_put(Dst, 9601); + dasm_put(Dst, 9170); } iseqne_end: if (vk) { - dasm_put(Dst, 9610, -BCBIAS_J*4); + dasm_put(Dst, 9179, -BCBIAS_J*4); } else { - dasm_put(Dst, 9625, -BCBIAS_J*4); + dasm_put(Dst, 9194, -BCBIAS_J*4); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); if (op == BC_ISEQV || op == BC_ISNEV) { - dasm_put(Dst, 9640, LJ_TISPRI, LJ_TISTABUD, Dt6(->metatable), Dt6(->nomm), 1<metatable), Dt6(->nomm), 1<>32)); + dasm_put(Dst, 9503, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); } else { - dasm_put(Dst, 9959); + dasm_put(Dst, 9528); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_LEN: - dasm_put(Dst, 9968, LJ_TSTR); + dasm_put(Dst, 9537, LJ_TSTR); if (sse) { - dasm_put(Dst, 9982, Dt5(->len)); + dasm_put(Dst, 9551, Dt5(->len)); } else { - dasm_put(Dst, 10000, Dt5(->len)); + dasm_put(Dst, 9569, Dt5(->len)); } - dasm_put(Dst, 10009, LJ_TTAB); + dasm_put(Dst, 9578, LJ_TTAB); if (sse) { - dasm_put(Dst, 10051); + dasm_put(Dst, 9620); } else { } - dasm_put(Dst, 10060); + dasm_put(Dst, 9629); break; /* -- Binary ops -------------------------------------------------------- */ case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10090); + dasm_put(Dst, 9659); } else { - dasm_put(Dst, 10105); + dasm_put(Dst, 9674); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10126); + dasm_put(Dst, 9695); } else { - dasm_put(Dst, 10141); + dasm_put(Dst, 9710); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10172); + dasm_put(Dst, 9741); } else { - dasm_put(Dst, 10186); + dasm_put(Dst, 9755); } break; } if (sse) { - dasm_put(Dst, 9952); + dasm_put(Dst, 9521); } else { - dasm_put(Dst, 9964); + dasm_put(Dst, 9533); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10194); + dasm_put(Dst, 9763); } else { - dasm_put(Dst, 10209); + dasm_put(Dst, 9778); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10218); + dasm_put(Dst, 9787); } else { - dasm_put(Dst, 10233); + dasm_put(Dst, 9802); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10242); + dasm_put(Dst, 9811); } else { - dasm_put(Dst, 10256); + dasm_put(Dst, 9825); } break; } if (sse) { - dasm_put(Dst, 9952); + dasm_put(Dst, 9521); } else { - dasm_put(Dst, 9964); + dasm_put(Dst, 9533); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_MULVN: case BC_MULNV: case BC_MULVV: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10264); + dasm_put(Dst, 9833); } else { - dasm_put(Dst, 10279); + dasm_put(Dst, 9848); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10288); + dasm_put(Dst, 9857); } else { - dasm_put(Dst, 10303); + dasm_put(Dst, 9872); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10312); + dasm_put(Dst, 9881); } else { - dasm_put(Dst, 10326); + dasm_put(Dst, 9895); } break; } if (sse) { - dasm_put(Dst, 9952); + dasm_put(Dst, 9521); } else { - dasm_put(Dst, 9964); + dasm_put(Dst, 9533); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10334); + dasm_put(Dst, 9903); } else { - dasm_put(Dst, 10349); + dasm_put(Dst, 9918); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10358); + dasm_put(Dst, 9927); } else { - dasm_put(Dst, 10373); + dasm_put(Dst, 9942); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10382); + dasm_put(Dst, 9951); } else { - dasm_put(Dst, 10396); + dasm_put(Dst, 9965); } break; } if (sse) { - dasm_put(Dst, 9952); + dasm_put(Dst, 9521); } else { - dasm_put(Dst, 9964); + dasm_put(Dst, 9533); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_MODVN: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10404); + dasm_put(Dst, 9973); } else { - dasm_put(Dst, 10419); + dasm_put(Dst, 9988); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10428); + dasm_put(Dst, 9997); } else { - dasm_put(Dst, 10443); + dasm_put(Dst, 10012); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10452); + dasm_put(Dst, 10021); } else { - dasm_put(Dst, 10466); + dasm_put(Dst, 10035); } break; } - dasm_put(Dst, 10474); + dasm_put(Dst, 10043); if (sse) { - dasm_put(Dst, 9952); + dasm_put(Dst, 9521); } else { - dasm_put(Dst, 9964); + dasm_put(Dst, 9533); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_MODNV: case BC_MODVV: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10404); + dasm_put(Dst, 9973); } else { - dasm_put(Dst, 10419); + dasm_put(Dst, 9988); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10428); + dasm_put(Dst, 9997); } else { - dasm_put(Dst, 10443); + dasm_put(Dst, 10012); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10452); + dasm_put(Dst, 10021); } else { - dasm_put(Dst, 10466); + dasm_put(Dst, 10035); } break; } - dasm_put(Dst, 10480); + dasm_put(Dst, 10049); break; case BC_POW: - dasm_put(Dst, 10070); + dasm_put(Dst, 9639); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10078, LJ_TISNUM); + dasm_put(Dst, 9647, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10404); + dasm_put(Dst, 9973); } else { - dasm_put(Dst, 10419); + dasm_put(Dst, 9988); } break; case 1: - dasm_put(Dst, 10114, LJ_TISNUM); + dasm_put(Dst, 9683, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10428); + dasm_put(Dst, 9997); } else { - dasm_put(Dst, 10443); + dasm_put(Dst, 10012); } break; default: - dasm_put(Dst, 10150, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9719, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10452); + dasm_put(Dst, 10021); } else { - dasm_put(Dst, 10466); + dasm_put(Dst, 10035); } break; } - dasm_put(Dst, 10485); + dasm_put(Dst, 10054); if (sse) { - dasm_put(Dst, 9952); + dasm_put(Dst, 9521); } else { - dasm_put(Dst, 9964); + dasm_put(Dst, 9533); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_CAT: - dasm_put(Dst, 10489, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 10058, Dt1(->base), Dt1(->base)); break; /* -- Constant ops ------------------------------------------------------ */ case BC_KSTR: - dasm_put(Dst, 10580, LJ_TSTR); + dasm_put(Dst, 10149, LJ_TSTR); break; case BC_KSHORT: if (sse) { - dasm_put(Dst, 10617); + dasm_put(Dst, 10186); } else { - dasm_put(Dst, 10632); + dasm_put(Dst, 10201); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_KNUM: if (sse) { - dasm_put(Dst, 10640); + dasm_put(Dst, 10209); } else { - dasm_put(Dst, 10654); + dasm_put(Dst, 10223); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_KPRI: - dasm_put(Dst, 10662); + dasm_put(Dst, 10231); break; case BC_KNIL: - dasm_put(Dst, 10691, LJ_TNIL); + dasm_put(Dst, 10260, LJ_TNIL); break; /* -- Upvalue and function ops ------------------------------------------ */ case BC_UGET: - dasm_put(Dst, 10739, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 10308, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_USETV: #define TV2MARKOFS \ ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)) - dasm_put(Dst, 10785, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); - dasm_put(Dst, 10881); + dasm_put(Dst, 10354, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); + dasm_put(Dst, 10450); break; #undef TV2MARKOFS case BC_USETS: - dasm_put(Dst, 10893, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); + dasm_put(Dst, 10462, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); break; case BC_USETN: - dasm_put(Dst, 10989); + dasm_put(Dst, 10558); if (sse) { - dasm_put(Dst, 10994); + dasm_put(Dst, 10563); } else { - dasm_put(Dst, 9768); + dasm_put(Dst, 9337); } - dasm_put(Dst, 11002, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 10571, offsetof(GCfuncL, uvptr), DtA(->v)); if (sse) { - dasm_put(Dst, 4877); + dasm_put(Dst, 10580); } else { - dasm_put(Dst, 4883); + dasm_put(Dst, 10586); } - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_USETP: - dasm_put(Dst, 11011, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 10589, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_UCLO: - dasm_put(Dst, 11051, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); + dasm_put(Dst, 10629, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); break; case BC_FNEW: - dasm_put(Dst, 11107, Dt1(->base), Dt1(->base), LJ_TFUNC); + dasm_put(Dst, 10685, Dt1(->base), Dt1(->base), LJ_TFUNC); break; /* -- Table ops --------------------------------------------------------- */ case BC_TNEW: - dasm_put(Dst, 11174, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB); + dasm_put(Dst, 10752, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB); break; case BC_TDUP: - dasm_put(Dst, 11298, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); + dasm_put(Dst, 10876, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); break; case BC_GGET: - dasm_put(Dst, 11397, Dt7(->env)); + dasm_put(Dst, 10975, Dt7(->env)); break; case BC_GSET: - dasm_put(Dst, 11417, Dt7(->env)); + dasm_put(Dst, 10995, Dt7(->env)); break; case BC_TGETV: - dasm_put(Dst, 11437, LJ_TTAB, LJ_TISNUM); + dasm_put(Dst, 11015, LJ_TTAB, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11470); + dasm_put(Dst, 11048); } else { } - dasm_put(Dst, 11491, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); - dasm_put(Dst, 11689, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); + dasm_put(Dst, 11267, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable)); - dasm_put(Dst, 11981, Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 11474, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable)); + dasm_put(Dst, 11559, Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETS: - dasm_put(Dst, 12045, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); - dasm_put(Dst, 12122, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<next)); - dasm_put(Dst, 12214, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 11623, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); + dasm_put(Dst, 11700, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<next)); + dasm_put(Dst, 11792, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETB: - dasm_put(Dst, 12306, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); - dasm_put(Dst, 12406, Dt6(->metatable), Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 11884, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); + dasm_put(Dst, 11984, Dt6(->metatable), Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETM: - dasm_put(Dst, 12454); + dasm_put(Dst, 12032); if (sse) { - dasm_put(Dst, 10994); + dasm_put(Dst, 10563); } else { } - dasm_put(Dst, 12459, Dt6(->marked), LJ_GC_BLACK); + dasm_put(Dst, 12037, Dt6(->marked), LJ_GC_BLACK); if (sse) { - dasm_put(Dst, 12484); + dasm_put(Dst, 12062); } else { } - dasm_put(Dst, 12492, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); - dasm_put(Dst, 12628, Dt6(->gclist)); + dasm_put(Dst, 12070, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); + dasm_put(Dst, 12206, Dt6(->gclist)); break; /* -- Calls and vararg handling ----------------------------------------- */ case BC_CALL: case BC_CALLM: - dasm_put(Dst, 10074); + dasm_put(Dst, 9643); if (op == BC_CALLM) { - dasm_put(Dst, 12636); + dasm_put(Dst, 12214); } - dasm_put(Dst, 12641, LJ_TFUNC, Dt7(->gate)); + dasm_put(Dst, 12219, LJ_TFUNC, Dt7(->pc)); break; case BC_CALLMT: - dasm_put(Dst, 12636); + dasm_put(Dst, 12214); break; case BC_CALLT: - dasm_put(Dst, 12664, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->gate)); - dasm_put(Dst, 12773, FRAME_TYPE, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 12262, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc)); + dasm_put(Dst, 12386, FRAME_TYPE, Dt7(->pc), PC2PROTO(k)); break; case BC_ITERC: - dasm_put(Dst, 12834, LJ_TFUNC, Dt7(->gate)); + dasm_put(Dst, 12447, LJ_TFUNC, 2+1, Dt7(->pc)); break; case BC_VARG: - dasm_put(Dst, 12896, Dt7(->pc), PC2PROTO(numparams), (8+FRAME_VARG), LJ_TNIL); - dasm_put(Dst, 13050, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 12529, Dt7(->pc), PC2PROTO(numparams), (8+FRAME_VARG), LJ_TNIL); + dasm_put(Dst, 12683, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); break; /* -- Returns ----------------------------------------------------------- */ case BC_RETM: - dasm_put(Dst, 12636); + dasm_put(Dst, 12214); break; case BC_RET: case BC_RET0: case BC_RET1: if (op != BC_RET0) { - dasm_put(Dst, 13155); + dasm_put(Dst, 12788); } - dasm_put(Dst, 13159, FRAME_TYPE); + dasm_put(Dst, 12792, FRAME_TYPE); switch (op) { case BC_RET: - dasm_put(Dst, 13178); + dasm_put(Dst, 12811); break; case BC_RET1: - dasm_put(Dst, 13242); + dasm_put(Dst, 12875); /* fallthrough */ case BC_RET0: - dasm_put(Dst, 13258); + dasm_put(Dst, 12891); default: break; } - dasm_put(Dst, 13269, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 12902, Dt7(->pc), PC2PROTO(k)); if (op == BC_RET) { - dasm_put(Dst, 13317, LJ_TNIL); + dasm_put(Dst, 12950, LJ_TNIL); } else { - dasm_put(Dst, 13328, LJ_TNIL); + dasm_put(Dst, 12961, LJ_TNIL); } - dasm_put(Dst, 13335); + dasm_put(Dst, 12968); if (op != BC_RET0) { - dasm_put(Dst, 13355); + dasm_put(Dst, 12988); } - dasm_put(Dst, 4966); + dasm_put(Dst, 4568); break; /* -- Loops and branches ------------------------------------------------ */ @@ -2030,7 +2000,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FORL: #if LJ_HASJIT - dasm_put(Dst, 13358, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 12991, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; @@ -2042,57 +2012,57 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FORI: case BC_IFORL: vk = (op == BC_IFORL || op == BC_JFORL); - dasm_put(Dst, 13379); + dasm_put(Dst, 13012); if (!vk) { - dasm_put(Dst, 13383, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 13016, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 13402); + dasm_put(Dst, 13035); if (!vk) { - dasm_put(Dst, 13406, LJ_TISNUM); + dasm_put(Dst, 13039, LJ_TISNUM); } if (sse) { - dasm_put(Dst, 13415); + dasm_put(Dst, 13048); if (vk) { - dasm_put(Dst, 13427); + dasm_put(Dst, 13060); } else { - dasm_put(Dst, 13446); + dasm_put(Dst, 13079); } - dasm_put(Dst, 13451); + dasm_put(Dst, 13084); } else { - dasm_put(Dst, 13464); + dasm_put(Dst, 13097); if (vk) { - dasm_put(Dst, 13470); + dasm_put(Dst, 13103); } else { - dasm_put(Dst, 13486); + dasm_put(Dst, 13119); } - dasm_put(Dst, 13494); + dasm_put(Dst, 13127); if (cmov) { - dasm_put(Dst, 9489); + dasm_put(Dst, 9058); } else { - dasm_put(Dst, 9495); + dasm_put(Dst, 9064); } if (!cmov) { - dasm_put(Dst, 13499); + dasm_put(Dst, 13132); } } if (op == BC_FORI) { - dasm_put(Dst, 13505, -BCBIAS_J*4); + dasm_put(Dst, 13138, -BCBIAS_J*4); } else if (op == BC_JFORI) { - dasm_put(Dst, 13515, -BCBIAS_J*4, BC_JLOOP); + dasm_put(Dst, 13148, -BCBIAS_J*4, BC_JLOOP); } else if (op == BC_IFORL) { - dasm_put(Dst, 13529, -BCBIAS_J*4); + dasm_put(Dst, 13162, -BCBIAS_J*4); } else { - dasm_put(Dst, 13525, BC_JLOOP); + dasm_put(Dst, 13158, BC_JLOOP); } - dasm_put(Dst, 9524); + dasm_put(Dst, 9093); if (sse) { - dasm_put(Dst, 13539); + dasm_put(Dst, 13172); } break; case BC_ITERL: #if LJ_HASJIT - dasm_put(Dst, 13358, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 12991, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; @@ -2101,33 +2071,96 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; #endif case BC_IITERL: - dasm_put(Dst, 13550, LJ_TNIL); + dasm_put(Dst, 13183, LJ_TNIL); if (op == BC_JITERL) { - dasm_put(Dst, 13565, BC_JLOOP); + dasm_put(Dst, 13198, BC_JLOOP); } else { - dasm_put(Dst, 13579, -BCBIAS_J*4); + dasm_put(Dst, 13212, -BCBIAS_J*4); } - dasm_put(Dst, 9828); + dasm_put(Dst, 9397); break; case BC_LOOP: #if LJ_HASJIT - dasm_put(Dst, 13358, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 12991, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; case BC_ILOOP: - dasm_put(Dst, 7616); + dasm_put(Dst, 7183); break; case BC_JLOOP: #if LJ_HASJIT - dasm_put(Dst, 13595, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); + dasm_put(Dst, 13228, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); #endif break; case BC_JMP: - dasm_put(Dst, 13622, -BCBIAS_J*4); + dasm_put(Dst, 13255, -BCBIAS_J*4); + break; + + /* -- Function headers -------------------------------------------------- */ + + /* + ** Reminder: A function may be called with func/args above L->maxstack, + ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot, + ** too. This means all FUNC* ops (including fast functions) must check + ** for stack overflow _before_ adding more slots! + */ + + case BC_FUNCF: +#if LJ_HASJIT +#endif + case BC_FUNCV: /* NYI: compiled vararg functions. */ + break; + + case BC_JFUNCF: +#if !LJ_HASJIT + break; +#endif + case BC_IFUNCF: + dasm_put(Dst, 13281, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); + if (op == BC_JFUNCF) { + dasm_put(Dst, 13312, BC_JLOOP); + } else { + dasm_put(Dst, 7183); + } + dasm_put(Dst, 13321, LJ_TNIL); + break; + + case BC_JFUNCV: +#if !LJ_HASJIT + break; +#endif + dasm_put(Dst, 7146); + break; /* NYI: compiled vararg functions. */ + + case BC_IFUNCV: + dasm_put(Dst, 13343, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); + if (op == BC_JFUNCV) { + dasm_put(Dst, 13312, BC_JLOOP); + } else { + dasm_put(Dst, 13440, -4+PC2PROTO(k)); + } + dasm_put(Dst, 13465, LJ_TNIL); + break; + + case BC_FUNCC: + case BC_FUNCCW: + dasm_put(Dst, 13487, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); + if (op == BC_FUNCC) { + dasm_put(Dst, 13517); + } else { + dasm_put(Dst, 13521); + } + dasm_put(Dst, 13529, DISPATCH_GL(vmstate), ~LJ_VMST_C); + if (op == BC_FUNCC) { + dasm_put(Dst, 13539); + } else { + dasm_put(Dst, 13544, DISPATCH_GL(wrapf)); + } + dasm_put(Dst, 13550, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); break; /* ---------------------------------------------------------------------- */ @@ -2155,7 +2188,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx, cmov, sse); - dasm_put(Dst, 13648); + dasm_put(Dst, 13576); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op, cmov, sse); diff --git a/src/buildvm_x64win.h b/src/buildvm_x64win.h index 94d0641f..8784aecf 100644 --- a/src/buildvm_x64win.h +++ b/src/buildvm_x64win.h @@ -12,687 +12,680 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned char build_actionlist[13496] = { - 254,1,248,10,137,202,137,114,252,252,139,181,233,15,182,142,233,139,190,233, - 139,108,36,96,141,12,202,59,141,233,15,135,244,11,15,182,142,233,57,200,15, - 134,244,249,248,2,255,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252, - 255,36,252,235,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3, - 252,233,244,2,248,12,137,113,252,252,141,52,197,237,141,148,253,49,233,137, - 106,252,248,137,114,252,252,139,181,233,15,182,174,233,141,60,252,234,139, - 108,36,96,59,189,233,15,135,244,13,137,208,15,182,174,233,133,252,237,15, - 132,244,248,248,1,131,193,8,57,209,15,131,244,249,255,139,121,252,248,137, - 56,139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15, - 133,244,1,248,2,139,190,233,255,139,6,15,182,204,15,182,232,131,198,4,193, - 232,16,252,255,36,252,235,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133, - 244,3,252,233,244,2,248,14,137,113,252,252,72,139,189,233,139,108,36,96,141, - 68,193,252,248,137,141,233,141,136,233,137,133,233,59,141,233,72,137,252, - 250,137,252,233,15,135,244,15,199,131,233,237,252,255,147,233,199,131,233, - 237,139,149,233,255,141,12,194,252,247,217,3,141,233,248,16,131,192,1,137, - 68,36,84,252,247,198,237,15,132,244,17,252,233,244,18,248,19,137,113,252, - 252,72,139,189,233,139,108,36,96,141,68,193,252,248,137,141,233,141,136,233, - 137,133,233,59,141,233,137,252,233,15,135,244,15,199,131,233,237,252,255, - 215,199,131,233,237,139,149,233,255,141,12,194,252,247,217,3,141,233,248, - 16,131,192,1,137,68,36,84,252,247,198,237,15,132,244,17,248,18,252,247,198, - 237,15,132,244,20,199,131,233,237,131,230,252,248,41,214,252,247,222,131, - 232,1,15,132,244,248,248,1,139,44,10,137,106,252,248,139,108,10,4,137,106, - 252,252,131,194,8,131,232,1,15,133,244,1,248,2,139,108,36,96,137,181,233, - 248,3,139,68,36,84,139,76,36,88,248,4,255,57,193,15,133,244,252,248,5,131, - 252,234,8,137,149,233,248,21,72,139,76,36,104,72,137,141,233,49,192,248,22, - 72,131,196,40,91,94,95,93,195,248,6,15,130,244,253,59,149,233,15,135,244, - 254,199,66,252,252,237,131,194,8,131,192,1,252,233,244,4,248,7,133,201,15, - 132,244,5,41,193,141,20,202,252,233,244,5,248,8,255,137,149,233,137,68,36, - 84,137,202,137,252,233,232,251,1,0,139,149,233,252,233,244,3,248,23,137,208, - 72,137,204,248,24,139,108,36,96,139,173,233,199,133,233,237,252,233,244,22, - 248,25,72,129,225,239,72,137,204,248,26,139,108,36,96,72,199,193,252,248, - 252,255,252,255,252,255,184,237,139,149,233,139,157,233,129,195,239,139,114, - 252,252,199,66,252,252,237,199,131,233,237,255,252,233,244,16,248,20,252, - 247,198,237,15,132,244,27,131,230,252,248,41,252,242,72,141,76,49,252,248, - 139,114,252,252,199,68,10,4,237,252,233,244,16,248,15,186,237,252,233,244, - 247,248,13,137,202,248,11,141,68,194,252,248,15,182,142,233,131,198,4,137, - 149,233,137,133,233,137,116,36,100,137,202,248,1,137,252,233,232,251,1,0, - 139,141,233,255,139,133,233,139,105,252,248,139,113,252,252,41,200,193,232, - 3,131,192,1,252,255,165,233,248,28,85,87,86,83,72,131,252,236,40,137,205, - 137,76,36,96,137,209,190,237,49,192,72,141,188,253,36,233,139,157,233,129, - 195,239,72,137,189,233,137,68,36,100,72,137,68,36,104,137,68,36,88,137,68, - 36,92,56,133,233,15,132,244,249,199,131,233,237,136,133,233,139,149,233,139, +static const unsigned char build_actionlist[13390] = { + 254,1,248,10,252,247,198,237,15,132,244,11,131,230,252,248,41,252,242,72, + 141,76,49,252,248,139,114,252,252,199,68,10,4,237,248,12,131,192,1,137,68, + 36,84,252,247,198,237,15,132,244,13,248,14,252,247,198,237,15,132,244,10, + 199,131,233,237,131,230,252,248,41,214,252,247,222,131,232,1,15,132,244,248, + 248,1,139,44,10,137,106,252,248,139,108,10,4,137,106,252,252,131,194,8,131, + 232,1,15,133,244,1,248,2,255,139,108,36,96,137,181,233,248,3,139,68,36,84, + 139,76,36,88,248,4,57,193,15,133,244,252,248,5,131,252,234,8,137,149,233, + 248,15,72,139,76,36,104,72,137,141,233,49,192,248,16,72,131,196,40,91,94, + 95,93,195,248,6,15,130,244,253,59,149,233,15,135,244,254,199,66,252,252,237, + 131,194,8,131,192,1,252,233,244,4,248,7,255,133,201,15,132,244,5,41,193,141, + 20,202,252,233,244,5,248,8,137,149,233,137,68,36,84,137,202,137,252,233,232, + 251,1,0,139,149,233,252,233,244,3,248,17,137,208,72,137,204,248,18,139,108, + 36,96,139,173,233,199,133,233,237,252,233,244,16,248,19,72,129,225,239,72, + 137,204,248,20,139,108,36,96,72,199,193,252,248,252,255,252,255,252,255,184, + 237,255,139,149,233,139,157,233,129,195,239,139,114,252,252,199,66,252,252, + 237,199,131,233,237,252,233,244,12,248,21,186,237,252,233,244,248,248,22, + 131,232,8,252,233,244,247,248,23,141,68,194,252,248,248,1,15,182,142,233, + 131,198,4,137,149,233,137,133,233,255,137,116,36,100,137,202,248,2,137,252, + 233,232,251,1,0,139,149,233,139,133,233,139,106,252,248,139,114,252,252,41, + 208,193,232,3,131,192,1,139,181,233,139,14,15,182,252,233,15,182,205,131, + 198,4,252,255,36,252,235,248,24,85,87,86,83,72,131,252,236,40,137,205,137, + 76,36,96,137,209,190,237,49,192,72,141,188,253,36,233,139,157,233,129,195, + 239,72,137,189,233,137,68,36,100,72,137,68,36,104,137,68,36,88,137,68,36, + 92,56,133,233,15,132,244,249,199,131,233,237,136,133,233,139,149,233,139, 133,233,41,200,193,232,3,131,192,1,41,209,139,114,252,252,137,68,36,84,252, - 247,198,237,15,132,244,17,252,233,244,18,248,29,255,85,87,86,83,72,131,252, - 236,40,190,237,68,137,76,36,92,252,233,244,247,248,30,85,87,86,83,72,131, + 247,198,237,15,132,244,13,255,252,233,244,14,248,25,85,87,86,83,72,131,252, + 236,40,190,237,68,137,76,36,92,252,233,244,247,248,26,85,87,86,83,72,131, 252,236,40,190,237,248,1,68,137,68,36,88,137,205,137,76,36,96,137,209,248, 2,72,139,189,233,72,137,124,36,104,137,108,36,100,72,137,165,233,139,157, 233,129,195,239,248,3,199,131,233,237,139,149,233,1,206,41,214,139,133,233, - 41,200,193,232,3,131,192,1,139,105,252,248,129,121,253,252,252,239,15,133, - 244,31,252,255,165,233,248,32,255,85,87,86,83,72,131,252,236,40,137,205,137, - 76,36,96,137,108,36,100,139,189,233,43,189,233,199,68,36,92,0,0,0,0,137,124, - 36,88,72,139,189,233,72,137,124,36,104,72,137,165,233,65,252,255,209,133, - 192,15,132,244,21,137,193,190,237,252,233,244,2,248,27,1,209,131,230,252, - 248,137,213,41,252,242,199,68,193,252,252,237,137,200,139,117,252,244,72, - 99,77,252,240,72,141,61,245,72,1,252,249,139,122,252,248,139,191,233,139, - 191,233,252,255,225,248,33,15,182,78,252,255,131,252,237,16,141,12,202,41, - 252,233,15,132,244,34,252,247,217,193,252,233,3,65,137,200,139,76,36,96,137, - 145,233,139,80,4,139,0,137,85,4,137,69,0,137,252,234,252,233,244,35,248,36, - 255,137,68,36,80,199,68,36,84,237,72,141,68,36,80,128,126,252,252,235,15, - 133,244,247,141,139,233,137,41,199,65,4,237,137,205,252,233,244,248,248,37, - 15,182,70,252,254,255,252,242,15,42,192,252,242,15,17,68,36,80,255,72,141, - 68,36,80,252,233,244,247,248,38,15,182,70,252,254,141,4,194,248,1,15,182, - 110,252,255,141,44,252,234,248,2,139,76,36,96,137,145,233,137,252,234,73, - 137,192,137,205,137,116,36,100,232,251,1,1,139,149,233,133,192,15,132,244, - 249,248,34,15,182,78,252,253,139,104,4,139,0,137,108,202,4,137,4,202,139, - 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,139, - 141,233,137,113,252,244,141,177,233,41,214,139,105,252,248,184,3,0,0,0,252, - 255,165,233,248,39,137,68,36,80,199,68,36,84,237,72,141,68,36,80,128,126, - 252,252,235,15,133,244,247,141,139,233,255,137,41,199,65,4,237,137,205,252, - 233,244,248,248,40,15,182,70,252,254,255,72,141,68,36,80,252,233,244,247, - 248,41,15,182,70,252,254,141,4,194,248,1,15,182,110,252,255,141,44,252,234, - 248,2,139,76,36,96,137,145,233,137,252,234,73,137,192,137,205,137,116,36, - 100,232,251,1,2,139,149,233,133,192,15,132,244,249,15,182,78,252,253,139, - 108,202,4,139,12,202,137,104,4,137,8,248,42,139,6,15,182,204,15,182,232,131, + 41,200,193,232,3,131,192,1,248,27,255,139,105,252,248,129,121,253,252,252, + 239,15,133,244,28,248,29,137,202,137,114,252,252,139,181,233,139,14,15,182, + 252,233,15,182,205,131,198,4,252,255,36,252,235,248,30,85,87,86,83,72,131, + 252,236,40,137,205,137,76,36,96,137,108,36,100,139,189,233,43,189,233,199, + 68,36,92,0,0,0,0,137,124,36,88,72,139,189,233,72,137,124,36,104,72,137,165, + 233,65,252,255,209,133,192,15,132,244,15,137,193,190,237,252,233,244,2,248, + 11,1,209,131,230,252,248,137,213,41,252,242,199,68,193,252,252,237,137,200, + 139,117,252,244,72,99,77,252,240,72,141,61,245,72,1,252,249,139,122,252,248, + 139,191,233,255,139,191,233,252,255,225,248,31,15,182,78,252,255,131,252, + 237,16,141,12,202,41,252,233,15,132,244,32,252,247,217,193,252,233,3,65,137, + 200,139,76,36,96,137,145,233,139,80,4,139,0,137,85,4,137,69,0,137,252,234, + 252,233,244,33,248,34,137,68,36,80,199,68,36,84,237,72,141,68,36,80,128,126, + 252,252,235,15,133,244,247,141,139,233,137,41,199,65,4,237,137,205,252,233, + 244,248,248,35,15,182,70,252,254,255,252,242,15,42,192,252,242,15,17,68,36, + 80,255,72,141,68,36,80,252,233,244,247,248,36,15,182,70,252,254,141,4,194, + 248,1,15,182,110,252,255,141,44,252,234,248,2,139,76,36,96,137,145,233,137, + 252,234,73,137,192,137,205,137,116,36,100,232,251,1,1,139,149,233,133,192, + 15,132,244,249,248,32,15,182,78,252,253,139,104,4,139,0,137,108,202,4,137, + 4,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, + 248,3,139,141,233,137,113,252,244,141,177,233,41,214,139,105,252,248,184, + 237,252,233,244,29,248,37,137,68,36,80,199,68,36,84,237,72,141,68,36,80,128, + 126,252,252,235,15,133,244,247,255,141,139,233,137,41,199,65,4,237,137,205, + 252,233,244,248,248,38,15,182,70,252,254,255,72,141,68,36,80,252,233,244, + 247,248,39,15,182,70,252,254,141,4,194,248,1,15,182,110,252,255,141,44,252, + 234,248,2,139,76,36,96,137,145,233,137,252,234,73,137,192,137,205,137,116, + 36,100,232,251,1,2,139,149,233,133,192,15,132,244,249,15,182,78,252,253,139, + 108,202,4,139,12,202,137,104,4,137,8,248,40,139,6,15,182,204,15,182,232,131, 198,4,193,232,16,252,255,36,252,235,248,3,139,141,233,137,113,252,244,15, 182,70,252,253,139,108,194,4,139,4,194,137,105,20,137,65,16,141,177,233,41, - 214,139,105,252,248,184,4,0,0,0,252,255,165,233,248,43,139,108,36,96,137, - 149,233,68,141,4,194,141,20,202,137,252,233,68,15,182,78,252,252,137,116, - 36,100,232,251,1,3,248,3,139,149,233,131,252,248,1,15,135,244,44,248,4,255, - 141,118,4,15,130,244,252,248,5,15,183,70,252,254,141,180,253,134,233,248, - 6,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248, - 45,131,198,4,129,120,253,4,239,15,130,244,5,252,233,244,6,248,46,129,120, - 253,4,239,252,233,244,4,248,47,131,252,238,4,65,137,192,65,137,252,233,139, - 108,36,96,137,149,233,137,202,137,252,233,137,116,36,100,232,251,1,4,252, - 233,244,3,248,48,255,141,4,199,252,233,244,247,248,49,141,4,199,141,44,252, - 234,149,252,233,244,248,248,50,141,4,194,137,197,252,233,244,248,248,51,141, - 4,194,248,1,141,44,252,234,248,2,141,12,202,65,137,232,65,137,193,15,182, - 70,252,252,137,68,36,32,139,108,36,96,137,149,233,137,202,137,252,233,137, - 116,36,100,232,251,1,5,139,149,233,133,192,15,132,244,42,248,44,137,193,41, - 208,137,113,252,244,141,176,233,139,105,252,248,184,3,0,0,0,129,121,253,252, - 252,239,15,133,244,31,255,252,255,165,233,248,52,139,108,36,96,137,149,233, - 141,20,194,137,252,233,137,116,36,100,232,251,1,6,139,149,233,252,233,244, - 44,248,31,137,76,36,84,137,68,36,80,131,252,233,8,139,108,36,96,137,149,233, - 137,202,68,141,4,193,137,252,233,137,116,36,100,232,251,1,7,139,149,233,139, - 76,36,84,139,68,36,80,139,105,252,248,131,192,1,57,215,15,132,244,53,252, - 255,165,233,248,54,139,108,36,96,137,149,233,137,202,137,252,233,137,116, - 36,100,232,251,1,8,139,149,233,139,70,252,252,15,182,204,15,182,232,193,232, - 16,252,255,164,253,252,235,233,248,55,129,252,248,239,15,130,244,56,255,139, - 105,4,129,252,253,239,15,131,244,56,137,68,36,84,137,105,252,252,139,41,137, - 105,252,248,131,232,2,15,132,244,248,137,76,36,80,248,1,131,193,8,139,105, - 4,137,105,252,252,139,41,137,105,252,248,131,232,1,15,133,244,1,139,76,36, - 80,248,2,139,68,36,84,252,233,244,57,248,58,129,252,248,239,15,130,244,56, - 139,105,4,184,237,252,247,213,57,232,255,15,71,197,255,15,134,244,247,137, - 232,248,1,255,139,105,252,248,139,132,253,197,233,199,65,252,252,237,137, - 65,252,248,252,233,244,59,248,60,129,252,248,239,15,130,244,56,139,105,4, - 129,252,253,239,15,133,244,252,248,1,139,41,139,173,233,248,2,133,252,237, - 199,65,252,252,237,15,132,244,59,139,65,252,248,139,131,233,199,65,252,252, - 237,137,105,252,248,137,76,36,80,139,141,233,255,35,136,233,105,201,239,3, - 141,233,248,3,129,185,233,239,15,133,244,250,57,129,233,15,132,244,251,248, - 4,139,137,233,133,201,15,133,244,3,252,233,244,59,248,5,139,105,4,129,252, - 253,239,15,132,244,59,255,139,1,139,76,36,80,137,105,252,252,137,65,252,248, - 252,233,244,59,248,6,129,252,253,239,15,132,244,1,129,252,253,239,15,135, - 244,253,189,237,248,7,252,247,213,139,172,253,171,233,252,233,244,2,248,61, - 129,252,248,239,15,130,244,56,129,121,253,4,239,15,133,244,56,255,139,41, - 131,189,233,0,15,133,244,56,129,121,253,12,239,15,133,244,56,139,65,8,137, - 133,233,199,65,252,252,237,137,105,252,248,252,246,133,233,235,15,132,244, - 247,128,165,233,235,139,131,233,137,171,233,137,133,233,248,1,252,233,244, - 59,248,62,255,129,252,248,239,15,130,244,56,129,121,253,4,239,15,133,244, - 56,137,84,36,80,137,205,139,17,68,141,65,8,139,76,36,96,232,251,1,9,137,252, - 233,139,84,36,80,139,40,139,64,4,137,105,252,248,137,65,252,252,252,233,244, - 59,248,63,129,252,248,239,15,133,244,56,129,121,253,4,239,15,135,244,56,255, - 252,242,15,16,1,252,233,244,64,255,221,1,252,233,244,65,255,248,66,129,252, - 248,239,15,130,244,56,129,121,253,4,239,15,133,244,249,139,1,248,2,199,65, - 252,252,237,137,65,252,248,252,233,244,59,248,3,129,121,253,4,239,15,135, - 244,56,131,187,233,0,15,133,244,56,139,171,233,59,171,233,255,15,130,244, - 247,232,244,67,248,1,139,108,36,96,137,141,233,137,113,252,252,137,116,36, - 100,137,84,36,80,137,202,137,252,233,232,251,1,10,139,141,233,139,84,36,80, - 252,233,244,2,248,68,129,252,248,239,15,130,244,56,15,132,244,248,248,1,129, - 121,253,4,239,15,133,244,56,137,84,36,80,139,17,139,108,36,96,137,141,233, - 255,137,113,252,252,68,141,65,8,137,252,233,137,116,36,100,232,251,1,11,139, - 141,233,139,84,36,80,133,192,15,132,244,249,139,105,8,139,65,12,137,105,252, - 248,137,65,252,252,139,105,16,139,65,20,137,41,137,65,4,248,69,184,237,252, - 233,244,70,248,2,199,65,12,237,252,233,244,1,248,3,199,65,252,252,237,252, - 233,244,59,248,71,129,252,248,239,15,130,244,56,129,121,253,4,239,255,15, - 133,244,56,139,133,233,199,65,252,252,237,137,65,252,248,199,65,12,237,184, - 237,252,233,244,70,248,72,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,133,244,56,129,121,253,12,239,15,135,244,56,255,252,242,15,16,65,8,72, - 189,237,237,102,72,15,110,205,252,242,15,88,193,252,242,15,45,192,252,242, - 15,17,65,252,248,255,139,41,59,133,233,15,131,244,248,193,224,3,3,133,233, - 248,1,129,120,253,4,239,15,132,244,73,139,40,139,64,4,137,41,137,65,4,252, - 233,244,69,248,2,131,189,233,0,15,132,244,73,137,84,36,80,135,205,137,194, - 232,251,1,12,137,252,233,139,84,36,80,133,192,15,133,244,1,248,73,184,237, - 252,233,244,70,248,74,255,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,133,244,56,139,133,233,199,65,252,252,237,137,65,252,248,255,15,87,192, - 252,242,15,17,65,8,255,217,252,238,221,89,8,255,184,237,252,233,244,70,248, - 75,129,252,248,239,15,130,244,56,137,113,252,252,190,237,137,202,131,193, - 8,131,232,1,139,105,252,248,248,1,252,246,131,233,235,15,133,244,249,248, - 2,129,121,253,252,252,239,15,133,244,31,252,255,165,233,248,3,131,198,1,252, - 233,244,2,248,76,255,129,252,248,239,15,130,244,56,129,121,253,12,239,15, - 133,244,56,137,113,252,252,139,105,4,137,105,12,199,65,4,237,139,41,139,113, - 8,137,105,8,137,49,190,237,137,202,129,193,239,131,232,2,252,233,244,1,248, - 9,139,116,36,100,252,233,244,56,248,77,129,252,248,239,15,130,244,56,139, - 41,137,113,252,252,137,116,36,100,137,108,36,80,129,121,253,4,239,15,133, - 244,9,255,72,131,189,233,0,15,133,244,9,128,189,233,235,15,135,244,9,139, - 181,233,137,116,36,84,15,132,244,247,59,181,233,15,132,244,9,248,1,141,116, - 198,252,240,59,181,233,15,135,244,9,137,181,233,139,108,36,96,137,141,233, - 131,193,8,137,141,233,255,139,108,36,84,141,76,193,232,72,41,252,241,57,252, - 238,15,132,244,249,248,2,139,68,14,4,137,70,252,252,139,4,14,137,70,252,248, - 131,252,238,8,57,252,238,15,133,244,2,248,3,139,76,36,80,139,84,36,84,232, - 244,28,199,131,233,237,139,108,36,96,139,116,36,80,139,149,233,129,252,248, - 239,15,135,244,254,248,4,139,142,233,139,190,233,137,142,233,137,252,254, - 41,206,15,132,244,252,255,141,4,50,193,252,238,3,59,133,233,15,135,244,255, - 137,213,72,41,205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131,193,8,57, - 252,249,15,133,244,5,248,6,141,70,2,199,66,252,252,237,248,7,139,116,36,100, - 137,68,36,84,72,199,193,252,248,252,255,252,255,252,255,252,247,198,237,15, - 132,244,17,252,233,244,18,248,8,199,66,252,252,237,139,142,233,131,252,233, - 8,137,142,233,139,1,137,2,139,65,4,137,66,4,184,237,252,233,244,7,248,9,255, - 139,76,36,80,137,185,233,137,252,242,137,252,233,232,251,1,0,139,149,233, - 252,233,244,4,248,9,139,116,36,100,252,233,244,56,248,78,139,173,233,137, - 113,252,252,137,116,36,100,137,108,36,80,72,131,189,233,0,15,133,244,9,128, - 189,233,235,15,135,244,9,139,181,233,137,116,36,84,15,132,244,247,59,181, - 233,255,15,132,244,9,248,1,141,116,198,252,248,59,181,233,15,135,244,9,137, - 181,233,139,108,36,96,137,141,233,137,141,233,139,108,36,84,141,76,193,252, - 240,72,41,252,241,57,252,238,15,132,244,249,248,2,139,68,14,4,137,70,252, - 252,139,4,14,137,70,252,248,131,252,238,8,57,252,238,15,133,244,2,248,3,139, - 76,36,80,139,84,36,84,232,244,28,199,131,233,237,139,108,36,96,139,116,36, - 80,139,149,233,255,129,252,248,239,15,135,244,254,248,4,139,142,233,139,190, - 233,137,142,233,137,252,254,41,206,15,132,244,252,141,4,50,193,252,238,3, - 59,133,233,15,135,244,255,137,213,72,41,205,248,5,139,1,137,4,41,139,65,4, - 137,68,41,4,131,193,8,57,252,249,15,133,244,5,248,6,141,70,1,248,7,139,116, - 36,100,137,68,36,84,49,201,252,247,198,237,15,132,244,17,255,252,233,244, - 18,248,8,137,252,242,137,252,233,232,251,1,13,248,9,139,76,36,80,137,185, - 233,137,252,242,137,252,233,232,251,1,0,139,149,233,252,233,244,4,248,79, - 139,108,36,96,137,113,252,252,72,252,247,133,233,237,15,132,244,56,137,141, - 233,141,68,193,252,248,137,133,233,49,192,72,137,133,233,176,235,136,133, - 233,252,233,244,22,255,248,65,221,89,252,248,252,233,244,59,248,80,129,252, - 248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,72, - 184,237,237,102,72,15,110,200,15,84,193,248,64,252,242,15,17,65,252,248,255, - 248,80,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,221, - 1,217,225,248,64,248,65,221,89,252,248,255,248,59,184,237,248,70,137,68,36, - 84,248,57,252,247,198,237,15,133,244,253,248,5,56,70,252,255,15,135,244,252, - 139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,6, - 199,68,193,252,244,237,131,192,1,252,233,244,5,248,7,137,202,72,199,193,252, - 248,252,255,252,255,252,255,252,233,244,18,255,248,81,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,81,1,252,233,244,64, - 248,82,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252, - 242,15,16,1,232,244,83,252,233,244,64,248,84,255,129,252,248,239,15,130,244, - 56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,232,244,85,252,233,244, - 64,255,248,81,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,221,1,217,252,250,252,233,244,65,248,82,129,252,248,239,15,130,244,56, - 129,121,253,4,239,15,135,244,56,221,1,232,244,83,252,233,244,65,248,84,255, - 129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,232,244, - 85,252,233,244,65,255,248,86,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,135,244,56,217,252,237,221,1,217,252,241,252,233,244,65,248,87,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,217,252,236,221, - 1,217,252,241,252,233,244,65,248,88,129,252,248,239,255,15,130,244,56,129, - 121,253,4,239,15,135,244,56,221,1,232,244,89,252,233,244,65,248,90,129,252, - 248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,252,254,252, - 233,244,65,248,91,129,252,248,239,255,15,130,244,56,129,121,253,4,239,15, - 135,244,56,221,1,217,252,255,252,233,244,65,248,92,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,221,1,217,252,242,221,216,252,233, - 244,65,248,93,129,252,248,239,15,130,244,56,255,129,121,253,4,239,15,135, - 244,56,221,1,217,192,216,200,217,232,222,225,217,252,250,217,252,243,252, - 233,244,65,248,94,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135, - 244,56,221,1,217,192,216,200,217,232,222,225,217,252,250,217,201,217,252, - 243,252,233,244,65,248,95,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,135,244,56,255,221,1,217,232,217,252,243,252,233,244,65,255,248,96,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1, - 255,137,76,36,80,137,213,232,251,1,14,139,76,36,80,137,252,234,252,233,244, - 64,255,248,97,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,252,242,15,16,1,255,137,76,36,80,137,213,232,251,1,15,139,76,36,80,137, - 252,234,252,233,244,64,255,248,98,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,255,137,76,36,80,137,213,232,251,1,16, - 139,76,36,80,137,252,234,252,233,244,64,248,99,255,248,100,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,252,242,15, - 89,133,233,252,233,244,64,255,248,100,129,252,248,239,15,130,244,56,129,121, - 253,4,239,15,135,244,56,221,1,220,141,233,252,233,244,65,255,248,101,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12, - 239,15,135,244,56,221,1,221,65,8,217,252,243,252,233,244,65,248,102,129,252, - 248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239, - 255,15,135,244,56,221,65,8,221,1,217,252,253,221,217,252,233,244,65,248,103, - 129,252,248,239,15,130,244,56,139,105,4,129,252,253,239,15,135,244,56,139, - 1,137,105,252,252,137,65,252,248,209,229,129,252,253,0,0,224,252,255,15,131, - 244,249,9,232,15,132,244,249,184,252,254,3,0,0,129,252,253,0,0,32,0,15,130, - 244,250,248,1,193,252,237,21,41,197,255,252,242,15,42,197,255,137,108,36, - 80,219,68,36,80,255,139,105,252,252,129,229,252,255,252,255,15,128,129,205, - 0,0,224,63,137,105,252,252,248,2,255,252,242,15,17,1,255,221,25,255,184,237, - 252,233,244,70,248,3,255,15,87,192,252,233,244,2,255,217,252,238,252,233, - 244,2,255,252,242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15,89, - 193,252,242,15,17,65,252,248,255,221,1,199,68,36,80,0,0,128,90,216,76,36, - 80,221,89,252,248,255,139,105,252,252,184,52,4,0,0,209,229,252,233,244,1, - 255,248,104,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56, - 252,242,15,16,1,255,248,104,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,135,244,56,221,1,255,139,105,4,209,229,129,252,253,0,0,224,252,255,15, - 132,244,250,255,15,40,224,232,244,105,252,242,15,92,224,248,1,252,242,15, - 17,65,252,248,252,242,15,17,33,255,217,192,232,244,105,220,252,233,248,1, - 221,89,252,248,221,25,255,139,65,252,252,139,105,4,49,232,15,136,244,249, - 248,2,184,237,252,233,244,70,248,3,129,252,245,0,0,0,128,137,105,4,252,233, - 244,2,248,4,255,15,87,228,252,233,244,1,255,217,252,238,217,201,252,233,244, - 1,255,248,106,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,221,65,8,221,1,248,1,217,252,248,223, - 224,158,15,138,244,1,221,217,252,233,244,65,255,248,107,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244, - 56,252,242,15,16,1,252,242,15,16,73,8,232,244,108,252,233,244,64,255,248, - 107,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121, - 253,12,239,15,135,244,56,221,1,221,65,8,232,244,108,252,233,244,65,255,248, - 109,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242, - 15,16,1,189,2,0,0,0,248,1,57,197,15,131,244,64,129,124,253,252,233,252,252, - 239,15,135,244,56,252,242,15,16,76,252,233,252,248,252,242,15,93,193,131, - 197,1,252,233,244,1,255,248,110,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,189,2,0,0,0,248,1,57,197,15,131,244,64, - 129,124,253,252,233,252,252,239,15,135,244,56,252,242,15,16,76,252,233,252, - 248,252,242,15,95,193,131,197,1,252,233,244,1,255,248,5,221,216,252,233,244, - 56,255,248,111,129,252,248,239,15,130,244,56,129,121,253,4,239,15,133,244, - 56,139,41,255,252,242,15,42,133,233,252,233,244,64,255,219,133,233,252,233, - 244,65,255,248,112,129,252,248,239,15,133,244,56,129,121,253,4,239,15,133, - 244,56,139,41,131,189,233,1,15,130,244,73,15,182,173,233,255,252,242,15,42, - 197,252,233,244,64,255,137,108,36,80,219,68,36,80,252,233,244,65,255,248, - 113,139,171,233,59,171,233,15,130,244,247,232,244,67,248,1,129,252,248,239, - 15,133,244,56,129,121,253,4,239,15,135,244,56,255,252,242,15,45,1,61,252, - 255,0,0,0,15,135,244,56,137,68,36,84,255,221,1,219,92,36,84,129,124,36,84, - 252,255,0,0,0,15,135,244,56,255,199,68,36,32,1,0,0,0,72,141,68,36,84,137, - 76,36,80,248,114,139,108,36,96,137,149,233,68,139,68,36,32,72,137,194,137, - 252,233,137,116,36,100,232,251,1,17,139,76,36,80,139,149,233,199,65,252,252, - 237,137,65,252,248,252,233,244,59,248,115,139,171,233,59,171,233,15,130,244, - 247,232,244,67,248,1,137,76,36,80,199,68,36,84,252,255,252,255,252,255,252, - 255,129,252,248,239,15,130,244,56,15,134,244,247,129,121,253,20,239,255,252, - 242,15,45,105,16,137,108,36,84,255,221,65,16,219,92,36,84,255,248,1,129,121, - 253,4,239,15,133,244,56,129,121,253,12,239,15,135,244,56,139,41,137,108,36, - 32,139,173,233,255,252,242,15,45,73,8,255,139,68,36,84,57,197,15,130,244, - 251,248,2,133,201,15,142,244,253,248,3,139,108,36,32,41,200,15,140,244,116, - 141,172,253,13,233,131,192,1,248,4,137,68,36,32,137,232,252,233,244,114,248, - 5,15,140,244,252,141,68,40,1,252,233,244,2,248,6,137,232,252,233,244,2,248, - 7,255,15,132,244,254,1,252,233,131,193,1,15,143,244,3,248,8,185,1,0,0,0,252, - 233,244,3,248,116,49,192,252,233,244,4,248,117,129,252,248,239,15,130,244, - 56,139,171,233,59,171,233,15,130,244,247,232,244,67,248,1,255,137,76,36,80, - 129,121,253,4,239,15,133,244,56,129,121,253,12,239,15,135,244,56,139,41,255, - 252,242,15,45,65,8,255,221,65,8,219,92,36,84,139,68,36,84,255,133,192,15, - 142,244,116,131,189,233,1,15,130,244,116,15,133,244,118,57,131,233,15,130, - 244,118,15,182,141,233,139,171,233,137,68,36,32,248,1,136,77,0,131,197,1, - 131,232,1,15,133,244,1,139,131,233,252,233,244,114,248,119,129,252,248,239, - 255,15,130,244,56,139,171,233,59,171,233,15,130,244,247,232,244,67,248,1, - 137,76,36,80,129,121,253,4,239,15,133,244,56,139,41,139,133,233,133,192,15, - 132,244,116,57,131,233,15,130,244,120,129,197,239,137,116,36,84,137,68,36, - 32,139,179,233,248,1,255,15,182,77,0,131,197,1,131,232,1,136,12,6,15,133, - 244,1,137,252,240,139,116,36,84,252,233,244,114,248,121,129,252,248,239,15, - 130,244,56,139,171,233,59,171,233,15,130,244,247,232,244,67,248,1,137,76, - 36,80,129,121,253,4,239,15,133,244,56,139,41,139,133,233,57,131,233,255,15, - 130,244,120,129,197,239,137,116,36,84,137,68,36,32,139,179,233,252,233,244, - 249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248,131,252,249,90,15,135, - 244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1,137,252, - 240,139,116,36,84,252,233,244,114,248,122,129,252,248,239,15,130,244,56,255, - 139,171,233,59,171,233,15,130,244,247,232,244,67,248,1,137,76,36,80,129,121, - 253,4,239,15,133,244,56,139,41,139,133,233,57,131,233,15,130,244,120,129, - 197,239,137,116,36,84,137,68,36,32,139,179,233,252,233,244,249,248,1,15,182, - 76,5,0,131,252,249,97,15,130,244,248,255,131,252,249,122,15,135,244,248,131, - 252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1,137,252,240,139,116, - 36,84,252,233,244,114,248,123,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,133,244,56,137,84,36,80,137,205,139,9,232,251,1,18,137,252,233,139, - 84,36,80,255,252,242,15,42,192,252,233,244,64,255,248,124,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,72,189,237, - 237,102,72,15,110,205,252,242,15,88,193,102,15,126,197,252,242,15,42,197, - 252,233,244,64,255,248,125,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,135,244,56,252,242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15, - 88,193,102,15,126,197,255,137,68,36,84,141,68,193,252,240,255,137,84,36,80, - 255,248,1,57,200,15,134,244,126,129,120,253,4,239,15,135,244,127,255,252, - 242,15,16,0,252,242,15,88,193,102,15,126,194,33,213,255,131,232,8,252,233, - 244,1,255,248,128,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135, - 244,56,252,242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15,88,193, - 102,15,126,197,255,252,242,15,16,0,252,242,15,88,193,102,15,126,194,9,213, - 255,248,129,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56, - 252,242,15,16,1,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15, - 126,197,255,252,242,15,16,0,252,242,15,88,193,102,15,126,194,49,213,255,248, - 130,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242, - 15,16,1,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126,197, - 255,15,205,252,233,244,131,255,248,132,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,135,244,56,252,242,15,16,1,72,189,237,237,102,72,15,110, - 205,252,242,15,88,193,102,15,126,197,255,252,247,213,255,248,131,252,242, - 15,42,197,252,233,244,64,248,126,252,242,15,42,197,139,84,36,80,252,233,244, - 64,255,248,127,255,139,68,36,84,252,233,244,56,255,248,133,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244, - 56,252,242,15,16,1,252,242,15,16,73,8,72,189,237,237,102,72,15,110,213,252, - 242,15,88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201,255, - 211,229,137,193,252,233,244,131,255,248,134,129,252,248,239,15,130,244,56, - 129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252,242, - 15,16,1,252,242,15,16,73,8,72,189,237,237,102,72,15,110,213,252,242,15,88, - 194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,211,252,237, - 137,193,252,233,244,131,255,248,135,129,252,248,239,15,130,244,56,129,121, - 253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252,242,15,16,1, - 252,242,15,16,73,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252, - 242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,211,252,253,137,193, - 252,233,244,131,255,248,136,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,135,244,56,129,121,253,12,239,15,135,244,56,252,242,15,16,1,252,242,15, - 16,73,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88, - 202,137,200,102,15,126,197,102,15,126,201,255,211,197,137,193,252,233,244, - 131,255,248,137,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,252,242,15,16,1,252,242,15,16,73,8,72, + 214,139,105,252,248,184,237,252,233,244,29,248,41,139,108,36,96,137,149,233, + 68,141,4,194,141,20,202,137,252,233,68,15,182,78,252,252,137,116,36,100,232, + 251,1,3,248,3,139,149,233,255,131,252,248,1,15,135,244,42,248,4,141,118,4, + 15,130,244,252,248,5,15,183,70,252,254,141,180,253,134,233,248,6,139,6,15, + 182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,43,131,198, + 4,129,120,253,4,239,15,130,244,5,252,233,244,6,248,44,129,120,253,4,239,252, + 233,244,4,248,45,131,252,238,4,65,137,192,65,137,252,233,139,108,36,96,137, + 149,233,255,137,202,137,252,233,137,116,36,100,232,251,1,4,252,233,244,3, + 248,46,141,4,199,252,233,244,247,248,47,141,4,199,141,44,252,234,149,252, + 233,244,248,248,48,141,4,194,137,197,252,233,244,248,248,49,141,4,194,248, + 1,141,44,252,234,248,2,141,12,202,65,137,232,65,137,193,15,182,70,252,252, + 137,68,36,32,139,108,36,96,137,149,233,137,202,137,252,233,137,116,36,100, + 232,251,1,5,139,149,233,133,192,15,132,244,40,248,42,137,193,41,208,137,113, + 252,244,141,176,233,255,184,237,252,233,244,27,248,50,139,108,36,96,137,149, + 233,141,20,194,137,252,233,137,116,36,100,232,251,1,6,139,149,233,252,233, + 244,42,248,51,141,76,202,8,248,28,137,76,36,84,137,68,36,80,131,252,233,8, + 139,108,36,96,137,149,233,137,202,68,141,4,193,137,252,233,137,116,36,100, + 232,251,1,7,139,149,233,139,76,36,84,139,68,36,80,139,105,252,248,131,192, + 1,57,215,15,132,244,52,137,202,137,114,252,252,139,181,233,139,14,15,182, + 252,233,15,182,205,131,198,4,252,255,36,252,235,248,53,139,108,36,96,137, + 149,233,137,202,137,252,233,137,116,36,100,232,251,1,8,139,149,233,139,70, + 252,252,15,182,204,15,182,232,193,232,16,252,255,164,253,252,235,233,248, + 54,255,129,252,248,239,15,130,244,55,139,106,4,129,252,253,239,15,131,244, + 55,139,114,252,252,137,68,36,84,137,106,252,252,139,42,137,106,252,248,131, + 232,2,15,132,244,248,137,209,248,1,131,193,8,139,105,4,137,105,252,252,139, + 41,137,105,252,248,131,232,1,15,133,244,1,248,2,139,68,36,84,252,233,244, + 56,248,57,129,252,248,239,15,130,244,55,139,106,4,184,237,252,247,213,57, + 232,255,15,71,197,255,15,134,244,247,137,232,248,1,255,139,106,252,248,139, + 132,253,197,233,139,114,252,252,199,66,252,252,237,137,66,252,248,252,233, + 244,58,248,59,129,252,248,239,15,130,244,55,139,106,4,139,114,252,252,129, + 252,253,239,15,133,244,252,248,1,139,42,139,173,233,248,2,133,252,237,199, + 66,252,252,237,15,132,244,58,139,131,233,199,66,252,252,237,137,106,252,248, + 139,141,233,255,35,136,233,105,201,239,3,141,233,248,3,129,185,233,239,15, + 133,244,250,57,129,233,15,132,244,251,248,4,139,137,233,133,201,15,133,244, + 3,252,233,244,58,248,5,139,105,4,129,252,253,239,15,132,244,58,255,139,1, + 137,106,252,252,137,66,252,248,252,233,244,58,248,6,129,252,253,239,15,132, + 244,1,129,252,253,239,15,135,244,253,189,237,248,7,252,247,213,139,172,253, + 171,233,252,233,244,2,248,60,129,252,248,239,15,130,244,55,129,122,253,4, + 239,15,133,244,55,255,139,42,131,189,233,0,15,133,244,55,129,122,253,12,239, + 15,133,244,55,139,66,8,137,133,233,139,114,252,252,199,66,252,252,237,137, + 106,252,248,252,246,133,233,235,15,132,244,247,128,165,233,235,139,131,233, + 137,171,233,137,133,233,248,1,252,233,244,58,248,61,255,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,133,244,55,137,213,68,141,66,8,139,18,139, + 76,36,96,232,251,1,9,137,252,234,139,40,139,64,4,139,114,252,252,137,106, + 252,248,137,66,252,252,252,233,244,58,248,62,129,252,248,239,15,133,244,55, + 129,122,253,4,239,15,135,244,55,255,252,242,15,16,2,252,233,244,63,255,221, + 2,252,233,244,64,255,248,65,129,252,248,239,15,130,244,55,139,114,252,252, + 129,122,253,4,239,15,133,244,249,139,2,248,2,199,66,252,252,237,137,66,252, + 248,252,233,244,58,248,3,129,122,253,4,239,15,135,244,55,131,187,233,0,15, + 133,244,55,139,171,233,59,171,233,255,15,130,244,247,232,244,66,248,1,139, + 108,36,96,137,149,233,137,116,36,100,137,252,233,232,251,1,10,139,149,233, + 252,233,244,2,248,67,129,252,248,239,15,130,244,55,15,132,244,248,248,1,129, + 122,253,4,239,15,133,244,55,139,108,36,96,137,149,233,255,139,114,252,252, + 68,141,66,8,139,18,137,252,233,137,116,36,100,232,251,1,11,139,149,233,133, + 192,15,132,244,249,139,106,8,139,66,12,137,106,252,248,137,66,252,252,139, + 106,16,139,66,20,137,42,137,66,4,248,68,184,237,252,233,244,69,248,2,199, + 66,12,237,252,233,244,1,248,3,199,66,252,252,237,252,233,244,58,248,70,129, + 252,248,239,15,130,244,55,139,106,252,248,129,122,253,4,239,255,15,133,244, + 55,139,133,233,139,114,252,252,199,66,252,252,237,137,66,252,248,199,66,12, + 237,184,237,252,233,244,69,248,71,129,252,248,239,15,130,244,55,129,122,253, + 4,239,15,133,244,55,129,122,253,12,239,15,135,244,55,139,114,252,252,255, + 252,242,15,16,66,8,72,189,237,237,102,72,15,110,205,252,242,15,88,193,252, + 242,15,45,192,252,242,15,17,66,252,248,255,139,42,59,133,233,15,131,244,248, + 193,224,3,3,133,233,248,1,129,120,253,4,239,15,132,244,72,139,40,139,64,4, + 137,42,137,66,4,252,233,244,68,248,2,131,189,233,0,15,132,244,72,137,252, + 233,137,213,137,194,232,251,1,12,137,252,234,133,192,15,133,244,1,248,72, + 184,237,252,233,244,69,248,73,255,129,252,248,239,15,130,244,55,139,106,252, + 248,129,122,253,4,239,15,133,244,55,139,133,233,139,114,252,252,199,66,252, + 252,237,137,66,252,248,255,15,87,192,252,242,15,17,66,8,255,217,252,238,221, + 90,8,255,184,237,252,233,244,69,248,74,129,252,248,239,15,130,244,55,141, + 74,8,131,232,1,190,237,248,1,15,182,171,233,193,252,237,235,131,229,1,1,252, + 238,252,233,244,27,248,75,129,252,248,239,15,130,244,55,129,122,253,12,239, + 15,133,244,55,255,139,106,4,137,106,12,199,66,4,237,139,42,139,114,8,137, + 106,8,137,50,141,74,16,131,232,2,190,237,252,233,244,1,248,76,129,252,248, + 239,15,130,244,55,139,42,139,114,252,252,137,116,36,100,137,108,36,80,129, + 122,253,4,239,15,133,244,55,72,131,189,233,0,15,133,244,55,128,189,233,235, + 15,135,244,55,139,141,233,15,132,244,247,255,59,141,233,15,132,244,55,248, + 1,141,116,193,252,240,59,181,233,15,135,244,55,137,181,233,139,108,36,96, + 137,149,233,131,194,8,137,149,233,141,108,194,232,72,41,252,245,57,206,15, + 132,244,249,248,2,139,68,46,4,137,70,252,252,139,4,46,137,70,252,248,131, + 252,238,8,57,206,15,133,244,2,248,3,137,202,139,76,36,80,232,244,24,199,131, + 233,237,255,139,108,36,96,139,116,36,80,139,149,233,129,252,248,239,15,135, + 244,254,248,4,139,142,233,139,190,233,137,142,233,137,252,254,41,206,15,132, + 244,252,141,4,50,193,252,238,3,59,133,233,15,135,244,255,137,213,72,41,205, + 248,5,139,1,137,4,41,139,65,4,137,68,41,4,131,193,8,57,252,249,15,133,244, + 5,248,6,141,70,2,199,66,252,252,237,248,7,139,116,36,100,137,68,36,84,72, + 199,193,252,248,252,255,252,255,252,255,252,247,198,237,255,15,132,244,13, + 252,233,244,14,248,8,199,66,252,252,237,139,142,233,131,252,233,8,137,142, + 233,139,1,137,2,139,65,4,137,66,4,184,237,252,233,244,7,248,9,139,76,36,80, + 137,185,233,137,252,242,137,252,233,232,251,1,0,139,149,233,252,233,244,4, + 248,77,139,106,252,248,139,173,233,139,114,252,252,137,116,36,100,137,108, + 36,80,72,131,189,233,0,15,133,244,55,255,128,189,233,235,15,135,244,55,139, + 141,233,15,132,244,247,59,141,233,15,132,244,55,248,1,141,116,193,252,248, + 59,181,233,15,135,244,55,137,181,233,139,108,36,96,137,149,233,137,149,233, + 141,108,194,252,240,72,41,252,245,57,206,15,132,244,249,248,2,255,139,68, + 46,4,137,70,252,252,139,4,46,137,70,252,248,131,252,238,8,57,206,15,133,244, + 2,248,3,137,202,139,76,36,80,232,244,24,199,131,233,237,139,108,36,96,139, + 116,36,80,139,149,233,129,252,248,239,15,135,244,254,248,4,139,142,233,139, + 190,233,137,142,233,137,252,254,41,206,15,132,244,252,141,4,50,193,252,238, + 3,59,133,233,15,135,244,255,255,137,213,72,41,205,248,5,139,1,137,4,41,139, + 65,4,137,68,41,4,131,193,8,57,252,249,15,133,244,5,248,6,141,70,1,248,7,139, + 116,36,100,137,68,36,84,49,201,252,247,198,237,15,132,244,13,252,233,244, + 14,248,8,137,252,242,137,252,233,232,251,1,13,248,9,139,76,36,80,137,185, + 233,137,252,242,137,252,233,232,251,1,0,139,149,233,252,233,244,4,248,78, + 139,108,36,96,72,252,247,133,233,237,15,132,244,55,255,137,149,233,141,68, + 194,252,248,137,133,233,49,192,72,137,133,233,176,235,136,133,233,252,233, + 244,16,255,248,64,139,114,252,252,221,90,252,248,252,233,244,58,248,79,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2, + 72,184,237,237,102,72,15,110,200,15,84,193,248,63,139,114,252,252,252,242, + 15,17,66,252,248,255,248,79,129,252,248,239,15,130,244,55,129,122,253,4,239, + 15,135,244,55,221,2,217,225,248,63,248,64,139,114,252,252,221,90,252,248, + 255,248,58,184,237,248,69,137,68,36,84,248,56,252,247,198,237,15,133,244, + 253,248,5,56,70,252,255,15,135,244,252,15,182,78,252,253,72,252,247,209,141, + 20,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, + 248,6,199,68,194,252,244,237,131,192,1,252,233,244,5,248,7,72,199,193,252, + 248,252,255,252,255,252,255,252,233,244,14,255,248,80,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,81,2,252,233,244,63, + 248,81,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252, + 242,15,16,2,232,244,82,252,233,244,63,248,83,255,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,232,244,84,252,233,244, + 63,255,248,80,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,221,2,217,252,250,252,233,244,64,248,81,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,221,2,232,244,82,252,233,244,64,248,83,255, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,232,244, + 84,252,233,244,64,255,248,85,129,252,248,239,15,130,244,55,129,122,253,4, + 239,15,135,244,55,217,252,237,221,2,217,252,241,252,233,244,64,248,86,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,217,252,236,221, + 2,217,252,241,252,233,244,64,248,87,129,252,248,239,255,15,130,244,55,129, + 122,253,4,239,15,135,244,55,221,2,232,244,88,252,233,244,64,248,89,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,217,252,254,252, + 233,244,64,248,90,129,252,248,239,255,15,130,244,55,129,122,253,4,239,15, + 135,244,55,221,2,217,252,255,252,233,244,64,248,91,129,252,248,239,15,130, + 244,55,129,122,253,4,239,15,135,244,55,221,2,217,252,242,221,216,252,233, + 244,64,248,92,129,252,248,239,15,130,244,55,255,129,122,253,4,239,15,135, + 244,55,221,2,217,192,216,200,217,232,222,225,217,252,250,217,252,243,252, + 233,244,64,248,93,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135, + 244,55,221,2,217,192,216,200,217,232,222,225,217,252,250,217,201,217,252, + 243,252,233,244,64,248,94,129,252,248,239,15,130,244,55,129,122,253,4,239, + 15,135,244,55,255,221,2,217,232,217,252,243,252,233,244,64,255,248,95,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2, + 255,137,213,232,251,1,14,137,252,234,252,233,244,63,255,248,96,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,255,137, + 213,232,251,1,15,137,252,234,252,233,244,63,255,248,97,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,255,137,213,232, + 251,1,16,137,252,234,252,233,244,63,248,98,255,248,99,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,139,106,252,248, + 252,242,15,89,133,233,252,233,244,63,255,248,99,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,221,2,139,106,252,248,220,141,233,252, + 233,244,64,255,248,100,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,129,122,253,12,239,15,135,244,55,221,2,221,66,8,217,252,243,252, + 233,244,64,248,101,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135, + 244,55,129,122,253,12,239,255,15,135,244,55,221,66,8,221,2,217,252,253,221, + 217,252,233,244,64,248,102,129,252,248,239,15,130,244,55,139,106,4,129,252, + 253,239,15,135,244,55,139,114,252,252,139,2,137,106,252,252,137,66,252,248, + 209,229,129,252,253,0,0,224,252,255,15,131,244,249,9,232,15,132,244,249,184, + 252,254,3,0,0,129,252,253,0,0,32,0,15,130,244,250,248,1,193,252,237,21,41, + 197,255,252,242,15,42,197,255,137,108,36,80,219,68,36,80,255,139,106,252, + 252,129,229,252,255,252,255,15,128,129,205,0,0,224,63,137,106,252,252,248, + 2,255,252,242,15,17,2,255,221,26,255,184,237,252,233,244,69,248,3,255,15, + 87,192,252,233,244,2,255,217,252,238,252,233,244,2,255,248,4,255,252,242, + 15,16,2,72,189,237,237,102,72,15,110,205,252,242,15,89,193,252,242,15,17, + 66,252,248,255,221,2,199,68,36,80,0,0,128,90,216,76,36,80,221,90,252,248, + 255,139,106,252,252,184,52,4,0,0,209,229,252,233,244,1,255,248,103,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,255, + 248,103,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,255,139,106,4,139,114,252,252,209,229,129,252,253,0,0,224,252,255,15,132, + 244,250,255,15,40,224,232,244,104,252,242,15,92,224,248,1,252,242,15,17,66, + 252,248,252,242,15,17,34,255,217,192,232,244,104,220,252,233,248,1,221,90, + 252,248,221,26,255,139,66,252,252,139,106,4,49,232,15,136,244,249,248,2,184, + 237,252,233,244,69,248,3,129,252,245,0,0,0,128,137,106,4,252,233,244,2,248, + 4,255,15,87,228,252,233,244,1,255,217,252,238,217,201,252,233,244,1,255,248, + 105,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122, + 253,12,239,15,135,244,55,221,66,8,221,2,248,1,217,252,248,223,224,158,15, + 138,244,1,221,217,252,233,244,64,255,248,106,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,252,242, + 15,16,2,252,242,15,16,74,8,232,244,107,252,233,244,63,255,248,106,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122,253,12,239, + 15,135,244,55,221,2,221,66,8,232,244,107,252,233,244,64,255,248,108,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,189, + 2,0,0,0,248,1,57,197,15,131,244,63,129,124,253,252,234,252,252,239,15,135, + 244,55,252,242,15,16,76,252,234,252,248,252,242,15,93,193,131,197,1,252,233, + 244,1,255,248,109,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135, + 244,55,252,242,15,16,2,189,2,0,0,0,248,1,57,197,15,131,244,63,129,124,253, + 252,234,252,252,239,15,135,244,55,252,242,15,16,76,252,234,252,248,252,242, + 15,95,193,131,197,1,252,233,244,1,255,248,5,221,216,252,233,244,55,255,248, + 110,129,252,248,239,15,130,244,55,129,122,253,4,239,15,133,244,55,139,42, + 255,252,242,15,42,133,233,252,233,244,63,255,219,133,233,252,233,244,64,255, + 248,111,129,252,248,239,15,133,244,55,129,122,253,4,239,15,133,244,55,139, + 42,139,114,252,252,131,189,233,1,15,130,244,72,15,182,173,233,255,252,242, + 15,42,197,252,233,244,63,255,137,108,36,80,219,68,36,80,252,233,244,64,255, + 248,112,139,171,233,59,171,233,15,130,244,247,232,244,66,248,1,129,252,248, + 239,15,133,244,55,129,122,253,4,239,15,135,244,55,255,252,242,15,45,2,61, + 252,255,0,0,0,15,135,244,55,137,68,36,84,255,221,2,219,92,36,84,129,124,36, + 84,252,255,0,0,0,15,135,244,55,255,199,68,36,32,1,0,0,0,72,141,68,36,84,248, + 113,139,108,36,96,137,149,233,68,139,68,36,32,72,137,194,137,252,233,137, + 116,36,100,232,251,1,17,139,149,233,139,114,252,252,199,66,252,252,237,137, + 66,252,248,252,233,244,58,248,114,139,171,233,59,171,233,15,130,244,247,232, + 244,66,248,1,199,68,36,84,252,255,252,255,252,255,252,255,129,252,248,239, + 15,130,244,55,15,134,244,247,129,122,253,20,239,255,252,242,15,45,106,16, + 137,108,36,84,255,221,66,16,219,92,36,84,255,248,1,129,122,253,4,239,15,133, + 244,55,129,122,253,12,239,15,135,244,55,139,42,137,108,36,32,139,173,233, + 255,252,242,15,45,74,8,255,139,68,36,84,57,197,15,130,244,251,248,2,133,201, + 15,142,244,253,248,3,139,108,36,32,41,200,15,140,244,115,141,172,253,13,233, + 131,192,1,248,4,137,68,36,32,137,232,252,233,244,113,248,5,15,140,244,252, + 141,68,40,1,252,233,244,2,248,6,137,232,252,233,244,2,248,7,255,15,132,244, + 254,1,252,233,131,193,1,15,143,244,3,248,8,185,1,0,0,0,252,233,244,3,248, + 115,49,192,252,233,244,4,248,116,129,252,248,239,15,130,244,55,139,171,233, + 59,171,233,15,130,244,247,232,244,66,248,1,255,129,122,253,4,239,15,133,244, + 55,129,122,253,12,239,15,135,244,55,139,42,255,252,242,15,45,66,8,255,221, + 66,8,219,92,36,84,139,68,36,84,255,133,192,15,142,244,115,131,189,233,1,15, + 130,244,115,15,133,244,117,57,131,233,15,130,244,117,15,182,141,233,139,171, + 233,137,68,36,32,248,1,136,77,0,131,197,1,131,232,1,15,133,244,1,139,131, + 233,252,233,244,113,248,118,129,252,248,239,255,15,130,244,55,139,171,233, + 59,171,233,15,130,244,247,232,244,66,248,1,129,122,253,4,239,15,133,244,55, + 139,42,139,133,233,133,192,15,132,244,115,57,131,233,15,130,244,119,129,197, + 239,137,116,36,84,137,68,36,32,139,179,233,248,1,255,15,182,77,0,131,197, + 1,131,232,1,136,12,6,15,133,244,1,137,252,240,139,116,36,84,252,233,244,113, + 248,120,129,252,248,239,15,130,244,55,139,171,233,59,171,233,15,130,244,247, + 232,244,66,248,1,129,122,253,4,239,15,133,244,55,139,42,139,133,233,57,131, + 233,255,15,130,244,119,129,197,239,137,116,36,84,137,68,36,32,139,179,233, + 252,233,244,249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248,131,252, + 249,90,15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15,137, + 244,1,137,252,240,139,116,36,84,252,233,244,113,248,121,129,252,248,239,15, + 130,244,55,255,139,171,233,59,171,233,15,130,244,247,232,244,66,248,1,129, + 122,253,4,239,15,133,244,55,139,42,139,133,233,57,131,233,15,130,244,119, + 129,197,239,137,116,36,84,137,68,36,32,139,179,233,252,233,244,249,248,1, + 15,182,76,5,0,131,252,249,97,15,130,244,248,255,131,252,249,122,15,135,244, + 248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1,137,252,240, + 139,116,36,84,252,233,244,113,248,122,129,252,248,239,15,130,244,55,129,122, + 253,4,239,15,133,244,55,137,213,139,10,232,251,1,18,137,252,234,255,252,242, + 15,42,192,252,233,244,63,255,248,123,129,252,248,239,15,130,244,55,129,122, + 253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72,15,110,205, + 252,242,15,88,193,102,15,126,197,252,242,15,42,197,252,233,244,63,255,248, + 124,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242, + 15,16,2,72,189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126,197, + 255,137,68,36,84,141,68,194,252,240,248,1,57,208,15,134,244,125,129,120,253, + 4,239,15,135,244,126,255,252,242,15,16,0,252,242,15,88,193,102,15,126,193, + 33,205,255,131,232,8,252,233,244,1,255,248,127,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72, + 15,110,205,252,242,15,88,193,102,15,126,197,255,252,242,15,16,0,252,242,15, + 88,193,102,15,126,193,9,205,255,248,128,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72,15,110, + 205,252,242,15,88,193,102,15,126,197,255,252,242,15,16,0,252,242,15,88,193, + 102,15,126,193,49,205,255,248,129,129,252,248,239,15,130,244,55,129,122,253, + 4,239,15,135,244,55,252,242,15,16,2,72,189,237,237,102,72,15,110,205,252, + 242,15,88,193,102,15,126,197,255,15,205,252,233,244,125,255,248,130,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,72, + 189,237,237,102,72,15,110,205,252,242,15,88,193,102,15,126,197,255,252,247, + 213,255,248,125,252,242,15,42,197,252,233,244,63,255,248,126,139,68,36,84, + 252,233,244,55,255,248,131,129,252,248,239,15,130,244,55,129,122,253,4,239, + 15,135,244,55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15, + 16,74,8,72,189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88, + 202,137,200,102,15,126,197,102,15,126,201,255,211,229,137,193,252,233,244, + 125,255,248,132,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,72, 189,237,237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202,137,200, - 102,15,126,197,102,15,126,201,255,211,205,137,193,252,233,244,131,248,118, - 184,237,252,233,244,56,248,120,184,237,248,56,139,108,36,96,41,202,137,113, - 252,252,137,116,36,100,137,84,36,80,137,141,233,141,68,193,252,248,141,144, - 233,137,133,233,139,65,252,248,59,149,233,15,135,244,251,137,252,233,252, - 255,144,233,133,192,15,133,244,249,248,1,139,141,233,255,139,133,233,41,200, - 193,232,3,131,192,1,139,105,252,248,139,84,36,80,1,202,57,113,252,252,15, - 133,244,248,252,255,165,233,248,2,129,121,253,252,252,239,15,133,244,31,252, - 255,165,233,248,3,139,141,233,139,84,36,80,1,202,252,233,244,70,248,5,186, - 237,137,252,233,232,251,1,0,252,233,244,1,248,67,93,72,137,108,36,32,139, - 108,36,96,41,202,137,84,36,84,137,113,252,252,137,116,36,100,137,141,233, - 141,68,193,252,248,137,252,233,137,133,233,255,232,251,1,19,139,141,233,139, - 133,233,41,200,193,232,3,131,192,1,139,113,252,252,139,84,36,84,1,202,72, - 139,108,36,32,85,139,105,252,248,195,248,138,255,15,182,131,233,168,235,15, - 133,244,251,168,235,15,133,244,247,168,235,15,132,244,247,252,255,139,233, - 252,233,244,247,255,248,139,15,182,131,233,168,235,15,133,244,251,168,235, - 15,132,244,251,252,255,139,233,15,132,244,247,168,235,15,132,244,251,248, - 1,139,108,36,96,137,149,233,137,252,242,137,252,233,232,251,1,20,248,3,139, - 149,233,248,4,15,182,78,252,253,248,5,255,15,182,110,252,252,15,183,70,252, - 254,252,255,164,253,252,235,233,248,140,131,198,4,139,77,232,137,76,36,84, - 252,233,244,4,248,141,255,204,255,248,142,255,248,143,255,248,144,255,139, - 122,252,248,139,191,233,139,191,233,199,131,233,0,0,0,0,199,131,233,237,139, - 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,248,83, - 255,217,124,36,4,137,68,36,8,102,184,0,4,102,11,68,36,4,102,37,252,255,252, - 247,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195, - 255,248,145,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110, - 216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,252, - 242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102,72,15,110, - 208,252,242,15,194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1, - 195,248,85,255,217,124,36,4,137,68,36,8,102,184,0,8,102,11,68,36,4,102,37, - 252,255,252,251,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139, - 68,36,8,195,255,248,146,72,184,237,237,102,72,15,110,208,72,184,237,237,102, - 72,15,110,216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15, - 85,208,252,242,15,88,203,252,242,15,92,203,102,15,86,202,72,184,237,237,102, - 72,15,110,208,252,242,15,194,193,6,102,15,84,194,252,242,15,92,200,15,40, - 193,248,1,195,248,105,255,217,124,36,4,137,68,36,8,102,184,0,12,102,11,68, - 36,4,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195, - 255,248,147,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72,15,110, - 216,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,15, - 40,193,252,242,15,88,203,252,242,15,92,203,72,184,237,237,102,72,15,110,216, - 252,242,15,194,193,1,102,15,84,195,252,242,15,92,200,102,15,86,202,15,40, - 193,248,1,195,248,148,255,15,40,232,252,242,15,94,193,72,184,237,237,102, - 72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,224,102,15,84,226,102, - 15,46,220,15,134,244,247,102,15,85,208,252,242,15,88,227,252,242,15,92,227, - 102,15,86,226,72,184,237,237,102,72,15,110,208,252,242,15,194,196,1,102,15, - 84,194,252,242,15,92,224,15,40,197,252,242,15,89,204,252,242,15,92,193,195, - 248,1,252,242,15,89,200,15,40,197,252,242,15,92,193,195,255,217,193,216,252, - 241,217,124,36,4,102,184,0,4,102,11,68,36,4,102,37,252,255,252,247,102,137, - 68,36,6,217,108,36,6,217,252,252,217,108,36,4,222,201,222,252,233,195,255, - 248,89,217,252,234,222,201,248,149,217,84,36,8,129,124,36,8,0,0,128,127,15, - 132,244,247,129,124,36,8,0,0,128,252,255,15,132,244,248,248,150,217,192,217, - 252,252,220,252,233,217,201,217,252,240,217,232,222,193,217,252,253,221,217, - 248,1,195,248,2,221,216,217,252,238,195,255,248,108,255,248,151,252,242,15, - 45,193,252,242,15,42,208,102,15,46,202,15,133,244,254,15,138,244,255,248, - 152,131,252,248,1,15,142,244,252,248,1,169,1,0,0,0,15,133,244,248,252,242, - 15,89,192,209,232,252,233,244,1,248,2,209,232,15,132,244,251,15,40,200,248, - 3,252,242,15,89,192,209,232,15,132,244,250,15,131,244,3,255,252,242,15,89, - 200,252,233,244,3,248,4,252,242,15,89,193,248,5,195,248,6,15,132,244,5,15, - 130,244,253,80,72,184,237,237,102,72,15,110,200,252,242,15,94,200,88,15,40, - 193,252,247,216,131,252,248,1,15,132,244,5,252,233,244,1,248,7,72,184,237, - 237,102,72,15,110,192,195,248,8,102,72,15,126,200,72,209,224,72,193,192,12, - 72,61,252,254,15,0,0,15,132,244,248,255,102,72,15,126,192,72,209,224,15,132, - 244,250,72,193,192,12,72,61,252,254,15,0,0,15,132,244,251,252,242,15,17,76, - 36,16,252,242,15,17,68,36,8,221,68,36,16,221,68,36,8,217,252,241,217,192, - 217,252,252,220,252,233,217,201,217,252,240,217,232,222,193,217,252,253,221, - 217,221,92,36,8,252,242,15,16,68,36,8,195,248,9,72,184,237,237,102,72,15, - 110,208,102,15,46,194,15,132,244,247,15,40,193,248,1,195,248,2,72,184,237, - 237,102,72,15,110,208,102,15,84,194,72,184,237,237,102,72,15,110,208,102, - 15,46,194,15,132,244,1,102,15,80,193,15,87,192,136,196,15,146,208,48,224, - 15,133,244,1,248,3,72,184,237,237,255,102,72,15,110,192,195,248,4,102,15, - 80,193,133,192,15,133,244,3,15,87,192,195,248,5,102,15,80,193,133,192,15, - 132,244,3,15,87,192,195,248,153,255,131,252,250,1,15,130,244,83,15,132,244, - 85,131,252,250,3,15,130,244,105,15,135,244,248,252,242,15,81,192,195,248, - 2,252,242,15,17,68,36,8,221,68,36,8,131,252,250,5,15,135,244,248,88,15,132, - 244,247,232,244,89,80,252,233,244,253,248,1,232,244,149,255,80,252,233,244, - 253,248,2,131,252,250,7,15,132,244,247,15,135,244,248,217,252,237,217,201, - 217,252,241,252,233,244,253,248,1,217,232,217,201,217,252,241,252,233,244, - 253,248,2,131,252,250,9,15,132,244,247,15,135,244,248,217,252,236,217,201, - 217,252,241,252,233,244,253,248,1,255,217,252,254,252,233,244,253,248,2,131, - 252,250,11,15,132,244,247,15,135,244,255,217,252,255,252,233,244,253,248, - 1,217,252,242,221,216,248,7,221,92,36,8,252,242,15,16,68,36,8,195,255,139, - 84,36,12,221,68,36,4,131,252,250,1,15,130,244,83,15,132,244,85,131,252,250, - 3,15,130,244,105,15,135,244,248,217,252,250,195,248,2,131,252,250,5,15,130, - 244,89,15,132,244,149,131,252,250,7,15,132,244,247,15,135,244,248,217,252, - 237,217,201,217,252,241,195,248,1,217,232,217,201,217,252,241,195,248,2,131, - 252,250,9,15,132,244,247,255,15,135,244,248,217,252,236,217,201,217,252,241, - 195,248,1,217,252,254,195,248,2,131,252,250,11,15,132,244,247,15,135,244, - 255,217,252,255,195,248,1,217,252,242,221,216,195,255,248,9,204,248,154,255, - 65,131,252,248,1,15,132,244,247,15,135,244,248,252,242,15,88,193,195,248, - 1,252,242,15,92,193,195,248,2,65,131,252,248,3,15,132,244,247,15,135,244, - 248,252,242,15,89,193,195,248,1,252,242,15,94,193,195,248,2,65,131,252,248, - 5,15,130,244,148,15,132,244,108,65,131,252,248,7,15,132,244,247,15,135,244, - 248,72,184,237,237,255,102,72,15,110,200,15,87,193,195,248,1,72,184,237,237, - 102,72,15,110,200,15,84,193,195,248,2,65,131,252,248,9,15,135,244,248,252, - 242,15,17,68,36,8,252,242,15,17,76,36,16,221,68,36,8,221,68,36,16,15,132, - 244,247,217,252,243,248,7,221,92,36,8,252,242,15,16,68,36,8,195,248,1,217, - 201,217,252,253,221,217,252,233,244,7,248,2,65,131,252,248,11,15,132,244, - 247,15,135,244,255,252,242,15,93,193,195,248,1,252,242,15,95,193,195,248, - 9,204,255,139,68,36,20,221,68,36,4,221,68,36,12,131,252,248,1,15,132,244, - 247,15,135,244,248,222,193,195,248,1,222,252,233,195,248,2,131,252,248,3, - 15,132,244,247,15,135,244,248,222,201,195,248,1,222,252,249,195,248,2,131, - 252,248,5,15,130,244,148,15,132,244,108,131,252,248,7,15,132,244,247,15,135, - 244,248,255,221,216,217,224,195,248,1,221,216,217,225,195,248,2,131,252,248, - 9,15,132,244,247,15,135,244,248,217,252,243,195,248,1,217,201,217,252,253, - 221,217,195,248,2,131,252,248,11,15,132,244,247,15,135,244,255,255,219,252, - 233,219,209,221,217,195,248,1,219,252,233,218,209,221,217,195,255,221,225, - 223,224,252,246,196,1,15,132,244,248,217,201,248,2,221,216,195,248,1,221, - 225,223,224,252,246,196,1,15,133,244,248,217,201,248,2,221,216,195,255,248, - 155,137,200,86,72,137,214,83,15,162,137,6,137,94,4,137,78,8,137,86,12,91, - 94,195,255,129,124,253,202,4,239,15,135,244,43,129,124,253,194,4,239,15,135, - 244,43,255,252,242,15,16,4,194,131,198,4,102,15,46,4,202,255,221,4,202,221, - 4,194,131,198,4,255,223,252,233,221,216,255,218,252,233,223,224,158,255,15, - 134,244,248,255,15,131,244,248,255,248,1,15,183,70,252,254,141,180,253,134, - 233,248,2,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252, - 235,255,139,108,194,4,131,198,4,129,252,253,239,15,135,244,251,129,124,253, - 202,4,239,15,135,244,251,255,252,242,15,16,4,194,102,15,46,4,202,255,221, - 4,202,221,4,194,255,15,138,244,248,15,133,244,248,255,15,138,244,248,15,132, - 244,247,255,248,1,15,183,70,252,254,141,180,253,134,233,248,2,255,248,2,15, - 183,70,252,254,141,180,253,134,233,248,1,255,248,5,57,108,202,4,15,133,244, - 2,129,252,253,239,15,131,244,1,139,12,202,139,4,194,57,193,15,132,244,1,129, - 252,253,239,15,135,244,2,139,169,233,133,252,237,15,132,244,2,252,246,133, - 233,235,15,133,244,2,255,49,252,237,255,189,1,0,0,0,255,252,233,244,47,255, - 72,252,247,208,131,198,4,129,124,253,202,4,239,15,133,244,248,139,12,202, - 59,12,135,255,131,198,4,129,124,253,202,4,239,15,135,244,248,255,252,242, - 15,16,4,199,102,15,46,4,202,255,221,4,202,221,4,199,255,72,252,247,208,131, - 198,4,57,68,202,4,255,139,108,194,4,131,198,4,129,252,253,239,255,15,131, - 244,247,255,15,130,244,247,255,137,108,202,4,139,44,194,137,44,202,255,15, - 183,70,252,254,141,180,253,134,233,248,1,139,6,15,182,204,15,182,232,131, - 198,4,193,232,16,252,255,36,252,235,255,139,108,194,4,139,4,194,137,108,202, - 4,137,4,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252, - 235,255,49,252,237,129,124,253,194,4,239,129,213,239,137,108,202,4,139,6, - 15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,129,124, - 253,194,4,239,15,135,244,50,255,252,242,15,16,4,194,72,184,237,237,102,72, - 15,110,200,15,87,193,252,242,15,17,4,202,255,221,4,194,217,224,221,28,202, - 255,129,124,253,194,4,239,15,133,244,248,139,4,194,255,15,87,192,252,242, - 15,42,128,233,248,1,252,242,15,17,4,202,255,219,128,233,248,1,221,28,202, - 255,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248, - 2,129,124,253,194,4,239,15,133,244,52,139,12,194,137,213,232,251,1,18,255, - 252,242,15,42,192,137,252,234,255,15,182,78,252,253,252,233,244,1,255,15, - 182,252,236,15,182,192,255,129,124,253,252,234,4,239,15,135,244,48,255,252, - 242,15,16,4,252,234,252,242,15,88,4,199,255,221,4,252,234,220,4,199,255,129, - 124,253,252,234,4,239,15,135,244,49,255,252,242,15,16,4,199,252,242,15,88, - 4,252,234,255,221,4,199,220,4,252,234,255,129,124,253,252,234,4,239,15,135, - 244,51,129,124,253,194,4,239,15,135,244,51,255,252,242,15,16,4,252,234,252, - 242,15,88,4,194,255,221,4,252,234,220,4,194,255,252,242,15,16,4,252,234,252, - 242,15,92,4,199,255,221,4,252,234,220,36,199,255,252,242,15,16,4,199,252, - 242,15,92,4,252,234,255,221,4,199,220,36,252,234,255,252,242,15,16,4,252, - 234,252,242,15,92,4,194,255,221,4,252,234,220,36,194,255,252,242,15,16,4, - 252,234,252,242,15,89,4,199,255,221,4,252,234,220,12,199,255,252,242,15,16, - 4,199,252,242,15,89,4,252,234,255,221,4,199,220,12,252,234,255,252,242,15, - 16,4,252,234,252,242,15,89,4,194,255,221,4,252,234,220,12,194,255,252,242, - 15,16,4,252,234,252,242,15,94,4,199,255,221,4,252,234,220,52,199,255,252, - 242,15,16,4,199,252,242,15,94,4,252,234,255,221,4,199,220,52,252,234,255, - 252,242,15,16,4,252,234,252,242,15,94,4,194,255,221,4,252,234,220,52,194, - 255,252,242,15,16,4,252,234,252,242,15,16,12,199,255,221,4,252,234,221,4, - 199,255,252,242,15,16,4,199,252,242,15,16,12,252,234,255,221,4,199,221,4, - 252,234,255,252,242,15,16,4,252,234,252,242,15,16,12,194,255,221,4,252,234, - 221,4,194,255,248,156,232,244,148,255,252,233,244,156,255,232,244,108,255, - 15,182,252,236,15,182,192,139,76,36,96,137,145,233,141,20,194,65,137,192, - 65,41,232,248,35,137,205,137,116,36,100,232,251,1,21,139,149,233,133,192, - 15,133,244,44,15,182,110,252,255,15,182,78,252,253,139,68,252,234,4,139,44, - 252,234,137,68,202,4,137,44,202,139,6,15,182,204,15,182,232,131,198,4,193, - 232,16,252,255,36,252,235,255,72,252,247,208,139,4,135,199,68,202,4,237,137, - 4,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, - 255,15,191,192,252,242,15,42,192,252,242,15,17,4,202,255,223,70,252,254,221, - 28,202,255,252,242,15,16,4,199,252,242,15,17,4,202,255,221,4,199,221,28,202, - 255,72,252,247,208,137,68,202,4,139,6,15,182,204,15,182,232,131,198,4,193, - 232,16,252,255,36,252,235,255,141,76,202,12,141,68,194,4,189,237,137,105, - 252,248,248,1,137,41,131,193,8,57,193,15,134,244,1,139,6,15,182,204,15,182, - 232,131,198,4,193,232,16,252,255,36,252,235,255,139,106,252,248,139,172,253, - 133,233,139,173,233,139,69,4,139,109,0,137,68,202,4,137,44,202,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,139,106,252,248, - 139,172,253,141,233,128,189,233,0,139,173,233,139,12,194,139,68,194,4,137, - 77,0,137,69,4,15,132,244,247,252,246,133,233,235,15,133,244,248,248,1,139, - 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,2,129, - 232,239,129,252,248,239,15,134,244,1,252,246,129,233,235,15,132,244,1,135, - 213,141,139,233,255,232,251,1,22,137,252,234,252,233,244,1,255,72,252,247, - 208,139,106,252,248,139,172,253,141,233,139,12,135,139,133,233,137,8,199, - 64,4,237,252,246,133,233,235,15,133,244,248,248,1,139,6,15,182,204,15,182, - 232,131,198,4,193,232,16,252,255,36,252,235,248,2,252,246,129,233,235,15, - 132,244,1,128,189,233,0,15,132,244,1,137,213,137,194,141,139,233,232,251, - 1,22,137,252,234,252,233,244,1,255,139,106,252,248,255,252,242,15,16,4,199, - 255,139,172,253,141,233,139,141,233,255,72,252,247,208,139,106,252,248,139, - 172,253,141,233,139,141,233,137,65,4,139,6,15,182,204,15,182,232,131,198, - 4,193,232,16,252,255,36,252,235,255,141,180,253,134,233,139,108,36,96,131, - 189,233,0,15,132,244,247,137,149,233,141,20,202,137,252,233,232,251,1,23, - 139,149,233,248,1,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255, - 36,252,235,255,72,252,247,208,139,108,36,96,137,149,233,68,139,66,252,248, - 139,20,135,137,252,233,137,116,36,100,232,251,1,24,139,149,233,15,182,78, - 252,253,137,4,202,199,68,202,4,237,139,6,15,182,204,15,182,232,131,198,4, - 193,232,16,252,255,36,252,235,255,139,76,36,96,137,145,233,248,1,65,137,192, - 37,252,255,7,0,0,65,193,232,11,61,252,255,7,0,0,15,132,244,249,248,2,137, - 194,139,131,233,137,205,59,131,233,137,116,36,100,15,131,244,251,232,251, - 1,25,139,149,233,15,182,78,252,253,137,4,202,199,68,202,4,237,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,184,1,8,0,0, - 252,233,244,2,248,5,232,251,1,26,15,183,70,252,254,137,252,233,252,233,244, - 1,255,72,252,247,208,139,108,36,96,139,139,233,137,116,36,100,59,139,233, - 137,149,233,15,131,244,249,248,2,139,20,135,137,252,233,232,251,1,27,139, - 149,233,15,182,78,252,253,137,4,202,199,68,202,4,237,139,6,15,182,204,15, - 182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,137,252,233,232,251, - 1,26,15,183,70,252,254,72,252,247,208,252,233,244,2,255,72,252,247,208,139, - 106,252,248,139,173,233,139,4,135,252,233,244,157,255,72,252,247,208,139, - 106,252,248,139,173,233,139,4,135,252,233,244,158,255,15,182,252,236,15,182, - 192,129,124,253,252,234,4,239,15,133,244,38,139,44,252,234,129,124,253,194, - 4,239,15,135,244,251,255,252,242,15,16,4,194,252,242,15,45,192,252,242,15, - 42,200,102,15,46,193,255,15,133,244,38,59,133,233,15,131,244,38,193,224,3, - 3,133,233,129,120,253,4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202, + 102,15,126,197,102,15,126,201,255,211,252,237,137,193,252,233,244,125,255, + 248,133,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129, + 122,253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,72,189,237, + 237,102,72,15,110,213,252,242,15,88,194,252,242,15,88,202,137,200,102,15, + 126,197,102,15,126,201,255,211,252,253,137,193,252,233,244,125,255,248,134, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122,253, + 12,239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,72,189,237,237,102, + 72,15,110,213,252,242,15,88,194,252,242,15,88,202,137,200,102,15,126,197, + 102,15,126,201,255,211,197,137,193,252,233,244,125,255,248,135,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135, + 244,55,252,242,15,16,2,252,242,15,16,74,8,72,189,237,237,102,72,15,110,213, + 252,242,15,88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201, + 255,211,205,137,193,252,233,244,125,248,117,184,237,252,233,244,55,248,119, + 184,237,248,55,139,108,36,96,139,114,252,252,137,116,36,100,137,149,233,141, + 68,194,252,248,141,136,233,137,133,233,139,66,252,248,59,141,233,15,135,244, + 251,137,252,233,252,255,144,233,139,149,233,133,192,15,133,244,69,248,1,255, + 139,133,233,41,208,193,232,3,131,192,1,139,106,252,248,57,114,252,252,15, + 133,244,248,139,181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255, + 36,252,235,248,2,137,209,252,247,198,237,15,133,244,249,15,182,110,252,253, + 72,252,247,213,141,20,252,234,252,233,244,27,248,3,137,252,245,131,229,252, + 248,41,252,234,252,233,244,27,248,5,186,237,137,252,233,232,251,1,0,139,149, + 233,252,233,244,1,248,66,93,72,137,108,36,32,139,108,36,96,137,116,36,100, + 137,149,233,255,141,68,194,252,248,137,252,233,137,133,233,232,251,1,19,139, + 149,233,139,133,233,41,208,193,232,3,131,192,1,72,139,108,36,32,85,195,248, + 136,255,15,182,131,233,168,235,15,133,244,251,168,235,15,133,244,247,168, + 235,15,132,244,247,252,255,139,233,252,233,244,247,255,248,137,15,182,131, + 233,168,235,15,133,244,251,168,235,15,132,244,251,252,255,139,233,15,132, + 244,247,168,235,15,132,244,251,248,1,139,108,36,96,137,149,233,137,252,242, + 137,252,233,232,251,1,20,248,3,139,149,233,248,4,15,182,78,252,253,248,5, + 255,15,182,110,252,252,15,183,70,252,254,252,255,164,253,252,235,233,248, + 138,131,198,4,139,77,232,137,76,36,84,252,233,244,4,248,139,255,204,255,248, + 140,255,248,141,255,248,142,255,139,122,252,248,139,191,233,139,191,233,199, + 131,233,0,0,0,0,199,131,233,237,139,6,15,182,204,15,182,232,131,198,4,193, + 232,16,252,255,36,252,235,255,248,82,255,217,124,36,4,137,68,36,8,102,184, + 0,4,102,11,68,36,4,102,37,252,255,252,247,102,137,68,36,6,217,108,36,6,217, + 252,252,217,108,36,4,139,68,36,8,195,255,248,143,72,184,237,237,102,72,15, + 110,208,72,184,237,237,102,72,15,110,216,15,40,200,102,15,84,202,102,15,46, + 217,15,134,244,247,102,15,85,208,252,242,15,88,203,252,242,15,92,203,102, + 15,86,202,72,184,237,237,102,72,15,110,208,252,242,15,194,193,1,102,15,84, + 194,252,242,15,92,200,15,40,193,248,1,195,248,84,255,217,124,36,4,137,68, + 36,8,102,184,0,8,102,11,68,36,4,102,37,252,255,252,251,102,137,68,36,6,217, + 108,36,6,217,252,252,217,108,36,4,139,68,36,8,195,255,248,144,72,184,237, + 237,102,72,15,110,208,72,184,237,237,102,72,15,110,216,15,40,200,102,15,84, + 202,102,15,46,217,15,134,244,247,102,15,85,208,252,242,15,88,203,252,242, + 15,92,203,102,15,86,202,72,184,237,237,102,72,15,110,208,252,242,15,194,193, + 6,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248,104,255,217,124, + 36,4,137,68,36,8,102,184,0,12,102,11,68,36,4,102,137,68,36,6,217,108,36,6, + 217,252,252,217,108,36,4,139,68,36,8,195,255,248,145,72,184,237,237,102,72, + 15,110,208,72,184,237,237,102,72,15,110,216,15,40,200,102,15,84,202,102,15, + 46,217,15,134,244,247,102,15,85,208,15,40,193,252,242,15,88,203,252,242,15, + 92,203,72,184,237,237,102,72,15,110,216,252,242,15,194,193,1,102,15,84,195, + 252,242,15,92,200,102,15,86,202,15,40,193,248,1,195,248,146,255,15,40,232, + 252,242,15,94,193,72,184,237,237,102,72,15,110,208,72,184,237,237,102,72, + 15,110,216,15,40,224,102,15,84,226,102,15,46,220,15,134,244,247,102,15,85, + 208,252,242,15,88,227,252,242,15,92,227,102,15,86,226,72,184,237,237,102, + 72,15,110,208,252,242,15,194,196,1,102,15,84,194,252,242,15,92,224,15,40, + 197,252,242,15,89,204,252,242,15,92,193,195,248,1,252,242,15,89,200,15,40, + 197,252,242,15,92,193,195,255,217,193,216,252,241,217,124,36,4,102,184,0, + 4,102,11,68,36,4,102,37,252,255,252,247,102,137,68,36,6,217,108,36,6,217, + 252,252,217,108,36,4,222,201,222,252,233,195,255,248,88,217,252,234,222,201, + 248,147,217,84,36,8,129,124,36,8,0,0,128,127,15,132,244,247,129,124,36,8, + 0,0,128,252,255,15,132,244,248,248,148,217,192,217,252,252,220,252,233,217, + 201,217,252,240,217,232,222,193,217,252,253,221,217,248,1,195,248,2,221,216, + 217,252,238,195,255,248,107,255,248,149,252,242,15,45,193,252,242,15,42,208, + 102,15,46,202,15,133,244,254,15,138,244,255,248,150,131,252,248,1,15,142, + 244,252,248,1,169,1,0,0,0,15,133,244,248,252,242,15,89,192,209,232,252,233, + 244,1,248,2,209,232,15,132,244,251,15,40,200,248,3,252,242,15,89,192,209, + 232,15,132,244,250,15,131,244,3,255,252,242,15,89,200,252,233,244,3,248,4, + 252,242,15,89,193,248,5,195,248,6,15,132,244,5,15,130,244,253,80,72,184,237, + 237,102,72,15,110,200,252,242,15,94,200,88,15,40,193,252,247,216,131,252, + 248,1,15,132,244,5,252,233,244,1,248,7,72,184,237,237,102,72,15,110,192,195, + 248,8,102,72,15,126,200,72,209,224,72,193,192,12,72,61,252,254,15,0,0,15, + 132,244,248,255,102,72,15,126,192,72,209,224,15,132,244,250,72,193,192,12, + 72,61,252,254,15,0,0,15,132,244,251,252,242,15,17,76,36,16,252,242,15,17, + 68,36,8,221,68,36,16,221,68,36,8,217,252,241,217,192,217,252,252,220,252, + 233,217,201,217,252,240,217,232,222,193,217,252,253,221,217,221,92,36,8,252, + 242,15,16,68,36,8,195,248,9,72,184,237,237,102,72,15,110,208,102,15,46,194, + 15,132,244,247,15,40,193,248,1,195,248,2,72,184,237,237,102,72,15,110,208, + 102,15,84,194,72,184,237,237,102,72,15,110,208,102,15,46,194,15,132,244,1, + 102,15,80,193,15,87,192,136,196,15,146,208,48,224,15,133,244,1,248,3,72,184, + 237,237,255,102,72,15,110,192,195,248,4,102,15,80,193,133,192,15,133,244, + 3,15,87,192,195,248,5,102,15,80,193,133,192,15,132,244,3,15,87,192,195,248, + 151,255,131,252,250,1,15,130,244,82,15,132,244,84,131,252,250,3,15,130,244, + 104,15,135,244,248,252,242,15,81,192,195,248,2,252,242,15,17,68,36,8,221, + 68,36,8,131,252,250,5,15,135,244,248,88,15,132,244,247,232,244,88,80,252, + 233,244,253,248,1,232,244,147,255,80,252,233,244,253,248,2,131,252,250,7, + 15,132,244,247,15,135,244,248,217,252,237,217,201,217,252,241,252,233,244, + 253,248,1,217,232,217,201,217,252,241,252,233,244,253,248,2,131,252,250,9, + 15,132,244,247,15,135,244,248,217,252,236,217,201,217,252,241,252,233,244, + 253,248,1,255,217,252,254,252,233,244,253,248,2,131,252,250,11,15,132,244, + 247,15,135,244,255,217,252,255,252,233,244,253,248,1,217,252,242,221,216, + 248,7,221,92,36,8,252,242,15,16,68,36,8,195,255,139,84,36,12,221,68,36,4, + 131,252,250,1,15,130,244,82,15,132,244,84,131,252,250,3,15,130,244,104,15, + 135,244,248,217,252,250,195,248,2,131,252,250,5,15,130,244,88,15,132,244, + 147,131,252,250,7,15,132,244,247,15,135,244,248,217,252,237,217,201,217,252, + 241,195,248,1,217,232,217,201,217,252,241,195,248,2,131,252,250,9,15,132, + 244,247,255,15,135,244,248,217,252,236,217,201,217,252,241,195,248,1,217, + 252,254,195,248,2,131,252,250,11,15,132,244,247,15,135,244,255,217,252,255, + 195,248,1,217,252,242,221,216,195,255,248,9,204,248,152,255,65,131,252,248, + 1,15,132,244,247,15,135,244,248,252,242,15,88,193,195,248,1,252,242,15,92, + 193,195,248,2,65,131,252,248,3,15,132,244,247,15,135,244,248,252,242,15,89, + 193,195,248,1,252,242,15,94,193,195,248,2,65,131,252,248,5,15,130,244,146, + 15,132,244,107,65,131,252,248,7,15,132,244,247,15,135,244,248,72,184,237, + 237,255,102,72,15,110,200,15,87,193,195,248,1,72,184,237,237,102,72,15,110, + 200,15,84,193,195,248,2,65,131,252,248,9,15,135,244,248,252,242,15,17,68, + 36,8,252,242,15,17,76,36,16,221,68,36,8,221,68,36,16,15,132,244,247,217,252, + 243,248,7,221,92,36,8,252,242,15,16,68,36,8,195,248,1,217,201,217,252,253, + 221,217,252,233,244,7,248,2,65,131,252,248,11,15,132,244,247,15,135,244,255, + 252,242,15,93,193,195,248,1,252,242,15,95,193,195,248,9,204,255,139,68,36, + 20,221,68,36,4,221,68,36,12,131,252,248,1,15,132,244,247,15,135,244,248,222, + 193,195,248,1,222,252,233,195,248,2,131,252,248,3,15,132,244,247,15,135,244, + 248,222,201,195,248,1,222,252,249,195,248,2,131,252,248,5,15,130,244,146, + 15,132,244,107,131,252,248,7,15,132,244,247,15,135,244,248,255,221,216,217, + 224,195,248,1,221,216,217,225,195,248,2,131,252,248,9,15,132,244,247,15,135, + 244,248,217,252,243,195,248,1,217,201,217,252,253,221,217,195,248,2,131,252, + 248,11,15,132,244,247,15,135,244,255,255,219,252,233,219,209,221,217,195, + 248,1,219,252,233,218,209,221,217,195,255,221,225,223,224,252,246,196,1,15, + 132,244,248,217,201,248,2,221,216,195,248,1,221,225,223,224,252,246,196,1, + 15,133,244,248,217,201,248,2,221,216,195,255,248,153,137,200,86,72,137,214, + 83,15,162,137,6,137,94,4,137,78,8,137,86,12,91,94,195,255,249,255,129,124, + 253,202,4,239,15,135,244,41,129,124,253,194,4,239,15,135,244,41,255,252,242, + 15,16,4,194,131,198,4,102,15,46,4,202,255,221,4,202,221,4,194,131,198,4,255, + 223,252,233,221,216,255,218,252,233,223,224,158,255,15,134,244,248,255,15, + 131,244,248,255,248,1,15,183,70,252,254,141,180,253,134,233,248,2,139,6,15, + 182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,139,108,194, + 4,131,198,4,129,252,253,239,15,135,244,251,129,124,253,202,4,239,15,135,244, + 251,255,252,242,15,16,4,194,102,15,46,4,202,255,221,4,202,221,4,194,255,15, + 138,244,248,15,133,244,248,255,15,138,244,248,15,132,244,247,255,248,1,15, + 183,70,252,254,141,180,253,134,233,248,2,255,248,2,15,183,70,252,254,141, + 180,253,134,233,248,1,255,248,5,57,108,202,4,15,133,244,2,129,252,253,239, + 15,131,244,1,139,12,202,139,4,194,57,193,15,132,244,1,129,252,253,239,15, + 135,244,2,139,169,233,133,252,237,15,132,244,2,252,246,133,233,235,15,133, + 244,2,255,49,252,237,255,189,1,0,0,0,255,252,233,244,45,255,72,252,247,208, + 131,198,4,129,124,253,202,4,239,15,133,244,248,139,12,202,59,12,135,255,131, + 198,4,129,124,253,202,4,239,15,135,244,248,255,252,242,15,16,4,199,102,15, + 46,4,202,255,221,4,202,221,4,199,255,72,252,247,208,131,198,4,57,68,202,4, + 255,139,108,194,4,131,198,4,129,252,253,239,255,15,131,244,247,255,15,130, + 244,247,255,137,108,202,4,139,44,194,137,44,202,255,15,183,70,252,254,141, + 180,253,134,233,248,1,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252, + 255,36,252,235,255,139,108,194,4,139,4,194,137,108,202,4,137,4,202,139,6, + 15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,49,252, + 237,129,124,253,194,4,239,129,213,239,137,108,202,4,139,6,15,182,204,15,182, + 232,131,198,4,193,232,16,252,255,36,252,235,255,129,124,253,194,4,239,15, + 135,244,48,255,252,242,15,16,4,194,72,184,237,237,102,72,15,110,200,15,87, + 193,252,242,15,17,4,202,255,221,4,194,217,224,221,28,202,255,129,124,253, + 194,4,239,15,133,244,248,139,4,194,255,15,87,192,252,242,15,42,128,233,248, + 1,252,242,15,17,4,202,255,219,128,233,248,1,221,28,202,255,139,6,15,182,204, + 15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,2,129,124,253,194, + 4,239,15,133,244,50,139,12,194,137,213,232,251,1,18,255,252,242,15,42,192, + 137,252,234,255,15,182,78,252,253,252,233,244,1,255,15,182,252,236,15,182, + 192,255,129,124,253,252,234,4,239,15,135,244,46,255,252,242,15,16,4,252,234, + 252,242,15,88,4,199,255,221,4,252,234,220,4,199,255,129,124,253,252,234,4, + 239,15,135,244,47,255,252,242,15,16,4,199,252,242,15,88,4,252,234,255,221, + 4,199,220,4,252,234,255,129,124,253,252,234,4,239,15,135,244,49,129,124,253, + 194,4,239,15,135,244,49,255,252,242,15,16,4,252,234,252,242,15,88,4,194,255, + 221,4,252,234,220,4,194,255,252,242,15,16,4,252,234,252,242,15,92,4,199,255, + 221,4,252,234,220,36,199,255,252,242,15,16,4,199,252,242,15,92,4,252,234, + 255,221,4,199,220,36,252,234,255,252,242,15,16,4,252,234,252,242,15,92,4, + 194,255,221,4,252,234,220,36,194,255,252,242,15,16,4,252,234,252,242,15,89, + 4,199,255,221,4,252,234,220,12,199,255,252,242,15,16,4,199,252,242,15,89, + 4,252,234,255,221,4,199,220,12,252,234,255,252,242,15,16,4,252,234,252,242, + 15,89,4,194,255,221,4,252,234,220,12,194,255,252,242,15,16,4,252,234,252, + 242,15,94,4,199,255,221,4,252,234,220,52,199,255,252,242,15,16,4,199,252, + 242,15,94,4,252,234,255,221,4,199,220,52,252,234,255,252,242,15,16,4,252, + 234,252,242,15,94,4,194,255,221,4,252,234,220,52,194,255,252,242,15,16,4, + 252,234,252,242,15,16,12,199,255,221,4,252,234,221,4,199,255,252,242,15,16, + 4,199,252,242,15,16,12,252,234,255,221,4,199,221,4,252,234,255,252,242,15, + 16,4,252,234,252,242,15,16,12,194,255,221,4,252,234,221,4,194,255,248,154, + 232,244,146,255,252,233,244,154,255,232,244,107,255,15,182,252,236,15,182, + 192,139,76,36,96,137,145,233,141,20,194,65,137,192,65,41,232,248,33,137,205, + 137,116,36,100,232,251,1,21,139,149,233,133,192,15,133,244,42,15,182,110, + 252,255,15,182,78,252,253,139,68,252,234,4,139,44,252,234,137,68,202,4,137, + 44,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, + 255,72,252,247,208,139,4,135,199,68,202,4,237,137,4,202,139,6,15,182,204, + 15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,15,191,192,252,242, + 15,42,192,252,242,15,17,4,202,255,223,70,252,254,221,28,202,255,252,242,15, + 16,4,199,252,242,15,17,4,202,255,221,4,199,221,28,202,255,72,252,247,208, 137,68,202,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, - 252,235,248,2,131,189,233,0,15,132,244,1,139,141,233,252,246,129,233,235, - 15,132,244,38,15,182,78,252,253,252,233,244,1,248,5,255,129,124,253,194,4, - 239,15,133,244,38,139,4,194,252,233,244,157,255,15,182,252,236,15,182,192, - 72,252,247,208,139,4,135,129,124,253,252,234,4,239,15,133,244,36,139,44,252, - 234,248,157,139,141,233,35,136,233,105,201,239,3,141,233,248,1,129,185,233, - 239,15,133,244,250,57,129,233,15,133,244,250,129,121,253,4,239,15,132,244, - 251,15,182,70,252,253,139,41,139,73,4,137,44,194,248,2,255,137,76,194,4,139, - 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,15, - 182,70,252,253,185,237,252,233,244,2,248,4,139,137,233,133,201,15,133,244, - 1,248,5,139,141,233,133,201,15,132,244,3,252,246,129,233,235,15,133,244,3, - 252,233,244,36,255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15, - 133,244,37,139,44,252,234,59,133,233,15,131,244,37,193,224,3,3,133,233,129, - 120,253,4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137,68,202, - 4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248, - 2,131,189,233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,37, - 255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,41,139, - 44,252,234,129,124,253,194,4,239,15,135,244,251,255,15,133,244,41,59,133, - 233,15,131,244,41,193,224,3,3,133,233,129,120,253,4,239,15,132,244,249,248, - 1,252,246,133,233,235,15,133,244,253,248,2,139,108,202,4,139,12,202,137,104, - 4,137,8,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, - 248,3,131,189,233,0,15,132,244,1,139,141,233,255,252,246,129,233,235,15,132, - 244,41,15,182,78,252,253,252,233,244,1,248,5,129,124,253,194,4,239,15,133, - 244,41,139,4,194,252,233,244,158,248,7,128,165,233,235,139,139,233,137,171, - 233,137,141,233,15,182,78,252,253,252,233,244,2,255,15,182,252,236,15,182, - 192,72,252,247,208,139,4,135,129,124,253,252,234,4,239,15,133,244,39,139, - 44,252,234,248,158,139,141,233,35,136,233,105,201,239,198,133,233,0,3,141, - 233,248,1,129,185,233,239,15,133,244,251,57,129,233,15,133,244,251,129,121, - 253,4,239,15,132,244,250,248,2,255,252,246,133,233,235,15,133,244,253,248, - 3,15,182,70,252,253,139,108,194,4,139,4,194,137,105,4,137,1,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,4,131,189,233, - 0,15,132,244,2,137,76,36,80,139,141,233,252,246,129,233,235,15,132,244,39, - 139,76,36,80,252,233,244,2,248,5,139,137,233,133,201,15,133,244,1,255,139, - 141,233,133,201,15,132,244,252,252,246,129,233,235,15,132,244,39,248,6,137, - 68,36,80,199,68,36,84,237,137,108,36,32,139,76,36,96,137,145,233,76,141,68, - 36,80,137,252,234,137,205,137,116,36,100,232,251,1,28,139,149,233,139,108, - 36,32,137,193,252,233,244,2,248,7,128,165,233,235,139,131,233,137,171,233, - 137,133,233,252,233,244,3,255,15,182,252,236,15,182,192,129,124,253,252,234, - 4,239,15,133,244,40,139,44,252,234,59,133,233,15,131,244,40,193,224,3,3,133, - 233,129,120,253,4,239,15,132,244,249,248,1,252,246,133,233,235,15,133,244, - 253,248,2,139,108,202,4,139,12,202,137,104,4,137,8,139,6,15,182,204,15,182, - 232,131,198,4,193,232,16,252,255,36,252,235,248,3,131,189,233,0,15,132,244, - 1,255,139,141,233,252,246,129,233,235,15,132,244,40,15,182,78,252,253,252, - 233,244,1,248,7,128,165,233,235,139,139,233,137,171,233,137,141,233,15,182, - 78,252,253,252,233,244,2,255,137,124,36,80,255,248,1,141,12,202,139,105,252, - 248,252,246,133,233,235,15,133,244,253,248,2,139,68,36,84,255,252,242,15, - 45,252,248,255,131,232,1,15,132,244,250,1,252,248,59,133,233,15,131,244,251, - 41,252,248,193,231,3,3,189,233,248,3,139,41,137,47,139,105,4,131,193,8,137, - 111,4,131,199,8,131,232,1,15,133,244,3,248,4,139,124,36,80,139,6,15,182,204, - 15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,5,139,76,36,96,137, - 145,233,137,252,234,65,137,192,137,205,137,116,36,100,232,251,1,29,139,149, - 233,15,182,78,252,253,252,233,244,1,248,7,128,165,233,235,139,131,233,137, - 171,233,255,137,133,233,252,233,244,2,255,3,68,36,84,255,141,76,202,8,139, - 105,252,248,129,121,253,252,252,239,15,133,244,31,252,255,165,233,255,141, - 76,202,8,137,215,139,105,252,248,129,121,253,252,252,239,15,133,244,31,248, - 53,139,114,252,252,252,247,198,237,15,133,244,253,248,1,137,106,252,248,137, - 68,36,84,131,232,1,15,132,244,249,248,2,139,41,137,47,139,105,4,137,111,4, - 131,199,8,131,193,8,131,232,1,15,133,244,2,139,106,252,248,248,3,137,209, - 128,189,233,1,15,135,244,251,248,4,139,68,36,84,252,255,165,233,248,5,255, - 252,247,198,237,15,133,244,4,15,182,70,252,253,72,252,247,208,141,20,194, - 139,122,252,248,139,191,233,139,191,233,252,233,244,4,248,7,15,139,244,1, - 131,230,252,248,41,252,242,137,215,139,114,252,252,252,233,244,1,255,141, - 76,202,8,139,105,232,139,65,252,236,137,41,137,65,4,139,105,252,240,139,65, - 252,244,137,105,8,137,65,12,139,105,224,139,65,228,137,105,252,248,137,65, - 252,252,129,252,248,239,184,3,0,0,0,15,133,244,31,252,255,165,233,255,15, - 182,252,236,139,66,252,248,141,12,202,139,128,233,15,182,128,233,137,124, - 36,80,141,188,253,194,233,43,122,252,252,133,252,237,15,132,244,251,141,108, - 252,233,252,248,57,215,15,131,244,248,248,1,139,71,252,248,137,1,139,71,252, - 252,131,199,8,137,65,4,131,193,8,57,252,233,15,131,244,249,57,215,15,130, - 244,1,248,2,199,65,4,237,131,193,8,57,252,233,15,130,244,2,248,3,139,124, - 36,80,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, - 248,5,199,68,36,84,1,0,0,0,137,208,41,252,248,15,134,244,3,255,137,197,193, - 252,237,3,131,197,1,137,108,36,84,139,108,36,96,1,200,59,133,233,15,135,244, - 253,248,6,139,71,252,248,137,1,139,71,252,252,131,199,8,137,65,4,131,193, - 8,57,215,15,130,244,6,252,233,244,3,248,7,137,149,233,137,141,233,137,116, - 36,100,41,215,139,84,36,84,131,252,234,1,137,252,233,232,251,1,0,139,149, - 233,139,141,233,1,215,252,233,244,6,255,193,225,3,255,248,1,139,114,252,252, - 137,68,36,84,252,247,198,237,15,133,244,253,255,248,17,137,215,131,232,1, - 15,132,244,249,248,2,139,44,15,137,111,252,248,139,108,15,4,137,111,252,252, - 131,199,8,131,232,1,15,133,244,2,248,3,139,68,36,84,15,182,110,252,255,248, - 5,57,197,15,135,244,252,255,139,108,10,4,137,106,252,252,139,44,10,137,106, - 252,248,255,248,5,56,70,252,255,15,135,244,252,255,15,182,78,252,253,72,252, - 247,209,141,20,202,139,122,252,248,139,191,233,139,191,233,139,6,15,182,204, - 15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,6,255,199,71,252,252, - 237,131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248, - 7,15,139,244,18,131,230,252,248,41,252,242,255,1,252,241,255,137,252,245, - 209,252,237,129,229,239,102,131,172,253,43,233,1,15,132,244,141,255,141,12, - 202,255,129,121,253,4,239,15,135,244,54,129,121,253,12,239,15,135,244,54, - 255,139,105,20,255,129,252,253,239,15,135,244,54,255,252,242,15,16,1,252, - 242,15,16,73,8,255,252,242,15,88,65,16,252,242,15,17,1,133,252,237,15,136, - 244,249,255,15,140,244,249,255,102,15,46,200,248,1,252,242,15,17,65,24,255, - 221,65,8,221,1,255,220,65,16,221,17,221,81,24,133,252,237,15,136,244,247, - 255,221,81,24,15,140,244,247,255,217,201,248,1,255,15,183,70,252,254,255, - 15,131,244,248,141,180,253,134,233,255,141,180,253,134,233,15,183,70,252, - 254,15,131,245,255,15,130,244,248,141,180,253,134,233,255,248,3,102,15,46, - 193,252,233,244,1,255,141,12,202,139,105,4,129,252,253,239,15,132,244,247, - 255,137,105,252,252,139,41,137,105,252,248,252,233,245,255,141,180,253,134, - 233,139,1,137,105,252,252,137,65,252,248,255,139,139,233,139,4,129,72,139, - 128,233,139,108,36,96,137,147,233,137,171,233,252,255,224,255,141,180,253, - 134,233,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, - 255,254,0 + 252,235,255,141,76,202,12,141,68,194,4,189,237,137,105,252,248,248,1,137, + 41,131,193,8,57,193,15,134,244,1,139,6,15,182,204,15,182,232,131,198,4,193, + 232,16,252,255,36,252,235,255,139,106,252,248,139,172,253,133,233,139,173, + 233,139,69,4,139,109,0,137,68,202,4,137,44,202,139,6,15,182,204,15,182,232, + 131,198,4,193,232,16,252,255,36,252,235,255,139,106,252,248,139,172,253,141, + 233,128,189,233,0,139,173,233,139,12,194,139,68,194,4,137,77,0,137,69,4,15, + 132,244,247,252,246,133,233,235,15,133,244,248,248,1,139,6,15,182,204,15, + 182,232,131,198,4,193,232,16,252,255,36,252,235,248,2,129,232,239,129,252, + 248,239,15,134,244,1,252,246,129,233,235,15,132,244,1,135,213,141,139,233, + 255,232,251,1,22,137,252,234,252,233,244,1,255,72,252,247,208,139,106,252, + 248,139,172,253,141,233,139,12,135,139,133,233,137,8,199,64,4,237,252,246, + 133,233,235,15,133,244,248,248,1,139,6,15,182,204,15,182,232,131,198,4,193, + 232,16,252,255,36,252,235,248,2,252,246,129,233,235,15,132,244,1,128,189, + 233,0,15,132,244,1,137,213,137,194,141,139,233,232,251,1,22,137,252,234,252, + 233,244,1,255,139,106,252,248,255,252,242,15,16,4,199,255,139,172,253,141, + 233,139,141,233,255,252,242,15,17,1,255,221,25,255,72,252,247,208,139,106, + 252,248,139,172,253,141,233,139,141,233,137,65,4,139,6,15,182,204,15,182, + 232,131,198,4,193,232,16,252,255,36,252,235,255,141,180,253,134,233,139,108, + 36,96,131,189,233,0,15,132,244,247,137,149,233,141,20,202,137,252,233,232, + 251,1,23,139,149,233,248,1,139,6,15,182,204,15,182,232,131,198,4,193,232, + 16,252,255,36,252,235,255,72,252,247,208,139,108,36,96,137,149,233,68,139, + 66,252,248,139,20,135,137,252,233,137,116,36,100,232,251,1,24,139,149,233, + 15,182,78,252,253,137,4,202,199,68,202,4,237,139,6,15,182,204,15,182,232, + 131,198,4,193,232,16,252,255,36,252,235,255,139,76,36,96,137,145,233,248, + 1,65,137,192,37,252,255,7,0,0,65,193,232,11,61,252,255,7,0,0,15,132,244,249, + 248,2,137,194,139,131,233,137,205,59,131,233,137,116,36,100,15,131,244,251, + 232,251,1,25,139,149,233,15,182,78,252,253,137,4,202,199,68,202,4,237,139, + 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,184, + 1,8,0,0,252,233,244,2,248,5,232,251,1,26,15,183,70,252,254,137,252,233,252, + 233,244,1,255,72,252,247,208,139,108,36,96,139,139,233,137,116,36,100,59, + 139,233,137,149,233,15,131,244,249,248,2,139,20,135,137,252,233,232,251,1, + 27,139,149,233,15,182,78,252,253,137,4,202,199,68,202,4,237,139,6,15,182, + 204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,137,252,233, + 232,251,1,26,15,183,70,252,254,72,252,247,208,252,233,244,2,255,72,252,247, + 208,139,106,252,248,139,173,233,139,4,135,252,233,244,155,255,72,252,247, + 208,139,106,252,248,139,173,233,139,4,135,252,233,244,156,255,15,182,252, + 236,15,182,192,129,124,253,252,234,4,239,15,133,244,36,139,44,252,234,129, + 124,253,194,4,239,15,135,244,251,255,252,242,15,16,4,194,252,242,15,45,192, + 252,242,15,42,200,102,15,46,193,255,15,133,244,36,59,133,233,15,131,244,36, + 193,224,3,3,133,233,129,120,253,4,239,15,132,244,248,248,1,139,40,139,64, + 4,137,44,202,137,68,202,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16, + 252,255,36,252,235,248,2,131,189,233,0,15,132,244,1,139,141,233,252,246,129, + 233,235,15,132,244,36,15,182,78,252,253,252,233,244,1,248,5,255,129,124,253, + 194,4,239,15,133,244,36,139,4,194,252,233,244,155,255,15,182,252,236,15,182, + 192,72,252,247,208,139,4,135,129,124,253,252,234,4,239,15,133,244,34,139, + 44,252,234,248,155,139,141,233,35,136,233,105,201,239,3,141,233,248,1,129, + 185,233,239,15,133,244,250,57,129,233,15,133,244,250,129,121,253,4,239,15, + 132,244,251,15,182,70,252,253,139,41,139,73,4,137,44,194,248,2,255,137,76, + 194,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235, + 248,3,15,182,70,252,253,185,237,252,233,244,2,248,4,139,137,233,133,201,15, + 133,244,1,248,5,139,141,233,133,201,15,132,244,3,252,246,129,233,235,15,133, + 244,3,252,233,244,34,255,15,182,252,236,15,182,192,129,124,253,252,234,4, + 239,15,133,244,35,139,44,252,234,59,133,233,15,131,244,35,193,224,3,3,133, + 233,129,120,253,4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137, + 68,202,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252, + 235,248,2,131,189,233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132, + 244,35,255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244, + 39,139,44,252,234,129,124,253,194,4,239,15,135,244,251,255,15,133,244,39, + 59,133,233,15,131,244,39,193,224,3,3,133,233,129,120,253,4,239,15,132,244, + 249,248,1,252,246,133,233,235,15,133,244,253,248,2,139,108,202,4,139,12,202, + 137,104,4,137,8,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255, + 36,252,235,248,3,131,189,233,0,15,132,244,1,139,141,233,255,252,246,129,233, + 235,15,132,244,39,15,182,78,252,253,252,233,244,1,248,5,129,124,253,194,4, + 239,15,133,244,39,139,4,194,252,233,244,156,248,7,128,165,233,235,139,139, + 233,137,171,233,137,141,233,15,182,78,252,253,252,233,244,2,255,15,182,252, + 236,15,182,192,72,252,247,208,139,4,135,129,124,253,252,234,4,239,15,133, + 244,37,139,44,252,234,248,156,139,141,233,35,136,233,105,201,239,198,133, + 233,0,3,141,233,248,1,129,185,233,239,15,133,244,251,57,129,233,15,133,244, + 251,129,121,253,4,239,15,132,244,250,248,2,255,252,246,133,233,235,15,133, + 244,253,248,3,15,182,70,252,253,139,108,194,4,139,4,194,137,105,4,137,1,139, + 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,4,131, + 189,233,0,15,132,244,2,137,76,36,80,139,141,233,252,246,129,233,235,15,132, + 244,37,139,76,36,80,252,233,244,2,248,5,139,137,233,133,201,15,133,244,1, + 255,139,141,233,133,201,15,132,244,252,252,246,129,233,235,15,132,244,37, + 248,6,137,68,36,80,199,68,36,84,237,137,108,36,32,139,76,36,96,137,145,233, + 76,141,68,36,80,137,252,234,137,205,137,116,36,100,232,251,1,28,139,149,233, + 139,108,36,32,137,193,252,233,244,2,248,7,128,165,233,235,139,131,233,137, + 171,233,137,133,233,252,233,244,3,255,15,182,252,236,15,182,192,129,124,253, + 252,234,4,239,15,133,244,38,139,44,252,234,59,133,233,15,131,244,38,193,224, + 3,3,133,233,129,120,253,4,239,15,132,244,249,248,1,252,246,133,233,235,15, + 133,244,253,248,2,139,108,202,4,139,12,202,137,104,4,137,8,139,6,15,182,204, + 15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,3,131,189,233,0,15, + 132,244,1,255,139,141,233,252,246,129,233,235,15,132,244,38,15,182,78,252, + 253,252,233,244,1,248,7,128,165,233,235,139,139,233,137,171,233,137,141,233, + 15,182,78,252,253,252,233,244,2,255,137,124,36,80,255,248,1,141,12,202,139, + 105,252,248,252,246,133,233,235,15,133,244,253,248,2,139,68,36,84,255,252, + 242,15,45,252,248,255,131,232,1,15,132,244,250,1,252,248,59,133,233,15,131, + 244,251,41,252,248,193,231,3,3,189,233,248,3,139,41,137,47,139,105,4,131, + 193,8,137,111,4,131,199,8,131,232,1,15,133,244,3,248,4,139,124,36,80,139, + 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,252,235,248,5,139, + 76,36,96,137,145,233,137,252,234,65,137,192,137,205,137,116,36,100,232,251, + 1,29,139,149,233,15,182,78,252,253,252,233,244,1,248,7,128,165,233,235,139, + 131,233,137,171,233,255,137,133,233,252,233,244,2,255,3,68,36,84,255,129, + 124,253,202,4,239,139,44,202,15,133,244,51,141,84,202,8,137,114,252,252,139, + 181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255,36,252,235,255, + 141,76,202,8,137,215,139,105,252,248,129,121,253,252,252,239,15,133,244,28, + 248,52,139,114,252,252,252,247,198,237,15,133,244,253,248,1,137,106,252,248, + 137,68,36,84,131,232,1,15,132,244,249,248,2,139,41,137,47,139,105,4,137,111, + 4,131,199,8,131,193,8,131,232,1,15,133,244,2,139,106,252,248,248,3,139,68, + 36,84,128,189,233,1,15,135,244,251,248,4,139,181,233,139,14,15,182,252,233, + 15,182,205,131,198,4,252,255,36,252,235,248,5,255,252,247,198,237,15,133, + 244,4,15,182,78,252,253,72,252,247,209,141,12,202,139,121,252,248,139,191, + 233,139,191,233,252,233,244,4,248,7,15,139,244,1,131,230,252,248,41,252,242, + 137,215,139,114,252,252,252,233,244,1,255,141,76,202,8,139,105,232,139,65, + 252,236,137,41,137,65,4,139,105,252,240,139,65,252,244,137,105,8,137,65,12, + 139,105,224,139,65,228,137,105,252,248,137,65,252,252,129,252,248,239,184, + 237,15,133,244,28,137,202,137,114,252,252,139,181,233,139,14,15,182,252,233, + 15,182,205,131,198,4,252,255,36,252,235,255,15,182,252,236,139,66,252,248, + 141,12,202,139,128,233,15,182,128,233,137,124,36,80,141,188,253,194,233,43, + 122,252,252,133,252,237,15,132,244,251,141,108,252,233,252,248,57,215,15, + 131,244,248,248,1,139,71,252,248,137,1,139,71,252,252,131,199,8,137,65,4, + 131,193,8,57,252,233,15,131,244,249,57,215,15,130,244,1,248,2,199,65,4,237, + 131,193,8,57,252,233,15,130,244,2,248,3,139,124,36,80,139,6,15,182,204,15, + 182,232,131,198,4,193,232,16,252,255,36,252,235,248,5,199,68,36,84,1,0,0, + 0,137,208,41,252,248,15,134,244,3,255,137,197,193,252,237,3,131,197,1,137, + 108,36,84,139,108,36,96,1,200,59,133,233,15,135,244,253,248,6,139,71,252, + 248,137,1,139,71,252,252,131,199,8,137,65,4,131,193,8,57,215,15,130,244,6, + 252,233,244,3,248,7,137,149,233,137,141,233,137,116,36,100,41,215,139,84, + 36,84,131,252,234,1,137,252,233,232,251,1,0,139,149,233,139,141,233,1,215, + 252,233,244,6,255,193,225,3,255,248,1,139,114,252,252,137,68,36,84,252,247, + 198,237,15,133,244,253,255,248,13,137,215,131,232,1,15,132,244,249,248,2, + 139,44,15,137,111,252,248,139,108,15,4,137,111,252,252,131,199,8,131,232, + 1,15,133,244,2,248,3,139,68,36,84,15,182,110,252,255,248,5,57,197,15,135, + 244,252,255,139,108,10,4,137,106,252,252,139,44,10,137,106,252,248,255,248, + 5,56,70,252,255,15,135,244,252,255,15,182,78,252,253,72,252,247,209,141,20, + 202,139,122,252,248,139,191,233,139,191,233,139,6,15,182,204,15,182,232,131, + 198,4,193,232,16,252,255,36,252,235,248,6,255,199,71,252,252,237,131,199, + 8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248,7,15,139,244, + 14,131,230,252,248,41,252,242,255,1,252,241,255,137,252,245,209,252,237,129, + 229,239,102,131,172,253,43,233,1,15,132,244,139,255,141,12,202,255,129,121, + 253,4,239,15,135,244,53,129,121,253,12,239,15,135,244,53,255,139,105,20,255, + 129,252,253,239,15,135,244,53,255,252,242,15,16,1,252,242,15,16,73,8,255, + 252,242,15,88,65,16,252,242,15,17,1,133,252,237,15,136,244,249,255,15,140, + 244,249,255,102,15,46,200,248,1,252,242,15,17,65,24,255,221,65,8,221,1,255, + 220,65,16,221,17,221,81,24,133,252,237,15,136,244,247,255,221,81,24,15,140, + 244,247,255,217,201,248,1,255,15,183,70,252,254,255,15,131,244,248,141,180, + 253,134,233,255,141,180,253,134,233,15,183,70,252,254,15,131,245,255,15,130, + 244,248,141,180,253,134,233,255,248,3,102,15,46,193,252,233,244,1,255,141, + 12,202,139,105,4,129,252,253,239,15,132,244,247,255,137,105,252,252,139,41, + 137,105,252,248,252,233,245,255,141,180,253,134,233,139,1,137,105,252,252, + 137,65,252,248,255,139,139,233,139,4,129,72,139,128,233,139,108,36,96,137, + 147,233,137,171,233,252,255,224,255,141,180,253,134,233,139,6,15,182,204, + 15,182,232,131,198,4,193,232,16,252,255,36,252,235,255,139,190,233,139,108, + 36,96,141,12,202,59,141,233,15,135,244,23,15,182,142,233,57,200,15,134,244, + 249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,68,194,252,252, + 237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,197,237,141,4, + 194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,36,96,141,12, + 200,59,141,233,15,135,244,22,137,209,137,194,15,182,174,233,133,252,237,15, + 132,244,248,248,1,131,193,8,57,209,15,131,244,249,139,121,252,248,137,56, + 139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15,133, + 244,1,248,2,255,139,190,233,139,6,15,182,204,15,182,232,131,198,4,193,232, + 16,252,255,36,252,235,255,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133, + 244,3,252,233,244,2,255,139,106,252,248,72,139,189,233,139,108,36,96,141, + 68,194,252,248,137,149,233,141,136,233,59,141,233,137,133,233,255,137,252, + 233,255,72,137,252,250,137,252,233,255,15,135,244,21,199,131,233,237,255, + 252,255,215,255,252,255,147,233,255,199,131,233,237,139,149,233,141,12,194, + 252,247,217,3,141,233,139,114,252,252,252,233,244,12,255,254,0 }; enum { - GLOB_gate_lf, - GLOB_gate_lf_growstack, - GLOB_gate_lv, - GLOB_gate_lv_growstack, - GLOB_gate_cwrap, - GLOB_gate_c_growstack, + GLOB_vm_returnp, + GLOB_cont_dispatch, GLOB_vm_returnc, GLOB_BC_RET_Z, GLOB_vm_return, - GLOB_gate_c, - GLOB_vm_returnp, GLOB_vm_leave_cp, GLOB_vm_leave_unw, GLOB_vm_unwind_c, GLOB_vm_unwind_c_eh, GLOB_vm_unwind_ff, GLOB_vm_unwind_ff_eh, - GLOB_cont_dispatch, + GLOB_vm_growstack_c, + GLOB_vm_growstack_v, + GLOB_vm_growstack_f, GLOB_vm_resume, GLOB_vm_pcall, GLOB_vm_call, + GLOB_vm_call_dispatch, GLOB_vmeta_call, + GLOB_vm_call_dispatch_f, GLOB_vm_cpcall, GLOB_cont_cat, GLOB_cont_ra, @@ -714,6 +707,7 @@ enum { GLOB_vmeta_unm, GLOB_vmeta_arith_vv, GLOB_vmeta_len, + GLOB_vmeta_call_ra, GLOB_BC_CALLT_Z, GLOB_vmeta_for, GLOB_ff_assert, @@ -787,12 +781,11 @@ enum { GLOB_ff_table_getn, GLOB_ff_bit_tobit, GLOB_ff_bit_band, - GLOB_fff_resbit_op, + GLOB_fff_resbit, GLOB_fff_fallback_bit_op, GLOB_ff_bit_bor, GLOB_ff_bit_bxor, GLOB_ff_bit_bswap, - GLOB_fff_resbit, GLOB_ff_bit_bnot, GLOB_ff_bit_lshift, GLOB_ff_bit_rshift, @@ -823,28 +816,26 @@ enum { GLOB__MAX }; static const char *const globnames[] = { - "gate_lf", - "gate_lf_growstack", - "gate_lv", - "gate_lv_growstack", - "gate_cwrap", - "gate_c_growstack", + "vm_returnp", + "cont_dispatch", "vm_returnc", "BC_RET_Z", "vm_return", - "gate_c", - "vm_returnp", "vm_leave_cp", "vm_leave_unw", "vm_unwind_c@8", "vm_unwind_c_eh", "vm_unwind_ff@4", "vm_unwind_ff_eh", - "cont_dispatch", + "vm_growstack_c", + "vm_growstack_v", + "vm_growstack_f", "vm_resume", "vm_pcall", "vm_call", + "vm_call_dispatch", "vmeta_call", + "vm_call_dispatch_f", "vm_cpcall", "cont_cat", "cont_ra", @@ -866,6 +857,7 @@ static const char *const globnames[] = { "vmeta_unm", "vmeta_arith_vv", "vmeta_len", + "vmeta_call_ra", "BC_CALLT_Z", "vmeta_for", "ff_assert", @@ -939,12 +931,11 @@ static const char *const globnames[] = { "ff_table_getn", "ff_bit_tobit", "ff_bit_band", - "fff_resbit_op", + "fff_resbit", "fff_fallback_bit_op", "ff_bit_bor", "ff_bit_bxor", "ff_bit_bswap", - "fff_resbit", "ff_bit_bnot", "ff_bit_lshift", "ff_bit_rshift", @@ -1030,392 +1021,367 @@ static const char *const extnames[] = { static void build_subroutines(BuildCtx *ctx, int cmov, int sse) { dasm_put(Dst, 0); - dasm_put(Dst, 2, Dt7(->pc), PC2PROTO(framesize), PC2PROTO(k), Dt1(->maxstack), PC2PROTO(numparams)); -#if LJ_HASJIT -#endif - dasm_put(Dst, 47, LJ_TNIL, FRAME_VARG, -FRAME_VARG, Dt7(->pc), PC2PROTO(framesize), Dt1(->maxstack), PC2PROTO(numparams)); - dasm_put(Dst, 157, LJ_TNIL, PC2PROTO(k)); -#if LJ_HASJIT -#endif - dasm_put(Dst, 192, LJ_TNIL, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), DISPATCH_GL(vmstate), ~LJ_VMST_C, DISPATCH_GL(wrapf), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 290, Dt1(->top), FRAME_TYPE, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), DISPATCH_GL(vmstate), ~LJ_VMST_C, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 373, Dt1(->top), FRAME_TYPE, FRAME_C, DISPATCH_GL(vmstate), ~LJ_VMST_C, Dt1(->base)); - dasm_put(Dst, 478, Dt1(->top), Dt1(->cframe), Dt1(->maxstack), LJ_TNIL); - dasm_put(Dst, 565, Dt1(->top), Dt1(->top), Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); - dasm_put(Dst, 663, FRAME_P, LJ_TTRUE, LUA_MINSTACK, PC2PROTO(framesize), Dt1(->base), Dt1(->top), Dt1(->base)); - dasm_put(Dst, 754, Dt1(->top), Dt7(->gate), FRAME_CP, CFRAME_RESUME, Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE); - dasm_put(Dst, 886, FRAME_CP, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), LJ_TFUNC, Dt7(->gate)); - dasm_put(Dst, 1004, Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), FRAME_CP, LJ_TNIL, 0, Dt7(->pc), PC2PROTO(k), Dt1(->base)); - dasm_put(Dst, 1182, LJ_TSTR, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB); + dasm_put(Dst, 2, FRAME_P, LJ_TTRUE, FRAME_TYPE, FRAME_C, DISPATCH_GL(vmstate), ~LJ_VMST_C); + dasm_put(Dst, 111, Dt1(->base), Dt1(->top), Dt1(->cframe), Dt1(->maxstack), LJ_TNIL); + dasm_put(Dst, 200, Dt1(->top), Dt1(->top), Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1); + dasm_put(Dst, 293, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, LUA_MINSTACK, -4+PC2PROTO(framesize), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 359, Dt1(->base), Dt1(->top), Dt7(->pc), FRAME_CP, CFRAME_RESUME, Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE); + dasm_put(Dst, 519, FRAME_CP, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 625, LJ_TFUNC, Dt7(->pc), Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), FRAME_CP, LJ_TNIL, 0, Dt7(->pc)); + dasm_put(Dst, 783, PC2PROTO(k), Dt1(->base), LJ_TSTR, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB); if (sse) { - dasm_put(Dst, 1228); + dasm_put(Dst, 893); } else { } - dasm_put(Dst, 1241, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, Dt7(->gate), LJ_TSTR, BC_GSET, DISPATCH_GL(tmptv)); - dasm_put(Dst, 1399, LJ_TTAB); + dasm_put(Dst, 906, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 2+1, LJ_TSTR, BC_GSET); + dasm_put(Dst, 1058, DISPATCH_GL(tmptv), LJ_TTAB); if (sse) { - dasm_put(Dst, 1228); + dasm_put(Dst, 893); } else { } - dasm_put(Dst, 1419, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, Dt7(->gate), Dt1(->base), Dt1(->base)); - dasm_put(Dst, 1615, -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND, Dt1(->base)); - dasm_put(Dst, 1724, Dt1(->base), Dt1(->base), FRAME_CONT, LJ_TFUNC); - dasm_put(Dst, 1849, Dt7(->gate), Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base), Dt7(->gate), Dt1(->base), Dt1(->base), BC__MAX*8, 1+1); - dasm_put(Dst, 2005, LJ_TISTRUECOND, 1+1, ~LJ_TNUMX); + dasm_put(Dst, 1081, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 3+1, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 1264, -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND, Dt1(->base)); + dasm_put(Dst, 1364, Dt1(->base), Dt1(->base), FRAME_CONT); + dasm_put(Dst, 1489, 2+1, Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base), GG_DISP2STATIC); + dasm_put(Dst, 1667, 1+1, LJ_TISTRUECOND, 1+1, ~LJ_TNUMX); if (cmov) { - dasm_put(Dst, 2101); + dasm_put(Dst, 1769); } else { - dasm_put(Dst, 2105); + dasm_put(Dst, 1773); } - dasm_put(Dst, 2114, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(mmname)+4*MM_metatable, LJ_TTAB, Dt6(->hmask)); - dasm_put(Dst, 2202, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL); - dasm_put(Dst, 2257, LJ_TUDATA, LJ_TISNUM, LJ_TNUMX, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB); - dasm_put(Dst, 2329, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); - dasm_put(Dst, 2394, 2+1, LJ_TTAB, 1+1, LJ_TISNUM); + dasm_put(Dst, 1782, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(mmname)+4*MM_metatable, LJ_TTAB, Dt6(->hmask)); + dasm_put(Dst, 1870, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL); + dasm_put(Dst, 1925, LJ_TUDATA, LJ_TISNUM, LJ_TNUMX, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB); + dasm_put(Dst, 1993, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 2062, 2+1, LJ_TTAB, 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 2475); + dasm_put(Dst, 2139); } else { - dasm_put(Dst, 2485); + dasm_put(Dst, 2149); } - dasm_put(Dst, 2492, 1+1, LJ_TSTR, LJ_TSTR, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); - dasm_put(Dst, 2554, Dt1(->base), Dt1(->base), 1+1, LJ_TTAB, Dt1(->base)); - dasm_put(Dst, 2641, Dt1(->base), 1+2, LJ_TNIL, LJ_TNIL, 1+1, LJ_TTAB); - dasm_put(Dst, 2743, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 1+1, LJ_TTAB, LJ_TISNUM); + dasm_put(Dst, 2156, 1+1, LJ_TSTR, LJ_TSTR, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 2222, Dt1(->base), Dt1(->base), 1+1, LJ_TTAB, Dt1(->base)); + dasm_put(Dst, 2289, Dt1(->base), 1+2, LJ_TNIL, LJ_TNIL, 1+1, LJ_TTAB); + dasm_put(Dst, 2393, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 1+1, LJ_TTAB, LJ_TISNUM); if (sse) { - dasm_put(Dst, 2798, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 2456, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); } else { } - dasm_put(Dst, 2831, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0); - dasm_put(Dst, 2917, 1+1, LJ_TTAB, Dt8(->upvalue[0]), LJ_TFUNC); + dasm_put(Dst, 2489, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0); + dasm_put(Dst, 2570, 1+1, LJ_TTAB, Dt8(->upvalue[0]), LJ_TFUNC); if (sse) { - dasm_put(Dst, 2947); + dasm_put(Dst, 2608); } else { - dasm_put(Dst, 2957); + dasm_put(Dst, 2618); } - dasm_put(Dst, 2964, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE, LJ_TFUNC, Dt7(->gate)); - dasm_put(Dst, 3037, 2+1, LJ_TFUNC, LJ_TFUNC, 2*8+FRAME_PCALL, 2*8, 1+1, LJ_TTHREAD); - dasm_put(Dst, 3136, Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top)); - dasm_put(Dst, 3202, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top)); - dasm_put(Dst, 3306, Dt1(->maxstack), LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2); - dasm_put(Dst, 3428, Dt1(->top), Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base)); - dasm_put(Dst, 3511, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 3619, LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), FRAME_TYPE); - dasm_put(Dst, 3716, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status)); + dasm_put(Dst, 2625, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE_SHIFT, 2+1, LJ_TFUNC); + dasm_put(Dst, 2689, LJ_TFUNC, 16+FRAME_PCALL, 1+1, LJ_TTHREAD, Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top)); + dasm_put(Dst, 2779, Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); + dasm_put(Dst, 2873, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), LJ_TTRUE, FRAME_TYPE); + dasm_put(Dst, 2991, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2, Dt1(->top), Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe)); + dasm_put(Dst, 3089, Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 3156, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack)); + dasm_put(Dst, 3250, FRAME_TYPE, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME); + dasm_put(Dst, 3363, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status)); if (sse) { - dasm_put(Dst, 3805, 1+1, LJ_TISNUM, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); + dasm_put(Dst, 3390, 1+1, LJ_TISNUM, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); } else { - dasm_put(Dst, 3861, 1+1, LJ_TISNUM); + dasm_put(Dst, 3454, 1+1, LJ_TISNUM); } - dasm_put(Dst, 3893, 1+1, FRAME_TYPE, LJ_TNIL); + dasm_put(Dst, 3490, 1+1, FRAME_TYPE, LJ_TNIL); if (sse) { - dasm_put(Dst, 3977, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4039, 1+1, LJ_TISNUM); + dasm_put(Dst, 3584, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 3646, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4069, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4128, 1+1, LJ_TISNUM); + dasm_put(Dst, 3676, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 3735, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4155, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4224, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4281, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4344, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4434); + dasm_put(Dst, 3762, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3831, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3888, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3951, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 4041); if (sse) { - dasm_put(Dst, 4446, 1+1, LJ_TISNUM); + dasm_put(Dst, 4053, 1+1, LJ_TISNUM); } else { } - dasm_put(Dst, 4471); + dasm_put(Dst, 4078); if (sse) { - dasm_put(Dst, 4493, 1+1, LJ_TISNUM); + dasm_put(Dst, 4092, 1+1, LJ_TISNUM); } else { } - dasm_put(Dst, 4518); + dasm_put(Dst, 4117); if (sse) { - dasm_put(Dst, 4540, 1+1, LJ_TISNUM); + dasm_put(Dst, 4131, 1+1, LJ_TISNUM); } else { } - dasm_put(Dst, 4565); + dasm_put(Dst, 4156); if (sse) { - dasm_put(Dst, 4589, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); + dasm_put(Dst, 4172, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); } else { - dasm_put(Dst, 4624, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); + dasm_put(Dst, 4211, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); } - dasm_put(Dst, 4653, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM); - dasm_put(Dst, 4718, 1+1, LJ_TISNUM); + dasm_put(Dst, 4244, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4309, 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 4813); + dasm_put(Dst, 4408); } else { - dasm_put(Dst, 4819); + dasm_put(Dst, 4414); } - dasm_put(Dst, 4828); + dasm_put(Dst, 4423); if (sse) { - dasm_put(Dst, 4853); + dasm_put(Dst, 4448); } else { - dasm_put(Dst, 4859); + dasm_put(Dst, 4454); } - dasm_put(Dst, 4862, 1+2); + dasm_put(Dst, 4457, 1+2); if (sse) { - dasm_put(Dst, 4871); + dasm_put(Dst, 4466); } else { - dasm_put(Dst, 4879); + dasm_put(Dst, 4474); } - dasm_put(Dst, 475); + dasm_put(Dst, 4482); if (sse) { - dasm_put(Dst, 4887, (unsigned int)(U64x(43500000,00000000)), (unsigned int)((U64x(43500000,00000000))>>32)); + dasm_put(Dst, 4485, (unsigned int)(U64x(43500000,00000000)), (unsigned int)((U64x(43500000,00000000))>>32)); } else { - dasm_put(Dst, 4914); + dasm_put(Dst, 4512); } - dasm_put(Dst, 4933); + dasm_put(Dst, 4531); if (sse) { - dasm_put(Dst, 4949, 1+1, LJ_TISNUM); + dasm_put(Dst, 4547, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4974, 1+1, LJ_TISNUM); + dasm_put(Dst, 4572, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4996); + dasm_put(Dst, 4594); if (sse) { - dasm_put(Dst, 5014); + dasm_put(Dst, 4616); } else { - dasm_put(Dst, 5040); + dasm_put(Dst, 4642); } - dasm_put(Dst, 5057, 1+2); + dasm_put(Dst, 4659, 1+2); if (sse) { + dasm_put(Dst, 4699); + } else { + dasm_put(Dst, 4707); + } + dasm_put(Dst, 4717, 2+1, LJ_TISNUM, LJ_TISNUM); + if (sse) { + dasm_put(Dst, 4769, 1+1, LJ_TISNUM, LJ_TISNUM); + } else { + dasm_put(Dst, 4816, 2+1, LJ_TISNUM, LJ_TISNUM); + } + if (sse) { + dasm_put(Dst, 4857, 1+1, LJ_TISNUM, LJ_TISNUM); + } else { + } + if (sse) { + dasm_put(Dst, 4928, 1+1, LJ_TISNUM, LJ_TISNUM); + } else { + } + if (!sse) { + dasm_put(Dst, 4999); + } + dasm_put(Dst, 5008, 1+1, LJ_TSTR); + if (sse) { + dasm_put(Dst, 5030, Dt5(->len)); + } else { + dasm_put(Dst, 5041, Dt5(->len)); + } + dasm_put(Dst, 5049, 1+1, LJ_TSTR, Dt5(->len), Dt5([1])); + if (sse) { + dasm_put(Dst, 5087); + } else { dasm_put(Dst, 5097); - } else { - dasm_put(Dst, 5105); } - dasm_put(Dst, 5115, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5110, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 5167, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5145); } else { - dasm_put(Dst, 5214, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5165); } + dasm_put(Dst, 5185, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2, LJ_TISNUM); + dasm_put(Dst, 2134); if (sse) { - dasm_put(Dst, 5255, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5293); + } else { + dasm_put(Dst, 5304); + } + dasm_put(Dst, 5312, LJ_TSTR, LJ_TISNUM, Dt5(->len)); + if (sse) { + dasm_put(Dst, 5342); + } else { + } + dasm_put(Dst, 5349, sizeof(GCstr)-1); + dasm_put(Dst, 5424, 2+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 5483, LJ_TSTR, LJ_TISNUM); + if (sse) { + dasm_put(Dst, 5504); + } else { + dasm_put(Dst, 5511); + } + dasm_put(Dst, 5523, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(tmpbuf.buf), 1+1); + dasm_put(Dst, 5588, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 5651, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz)); + dasm_put(Dst, 5722, sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), 1+1); + dasm_put(Dst, 5807, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 5877, 1+1, LJ_TTAB); + if (sse) { + dasm_put(Dst, 5945); } else { } if (sse) { - dasm_put(Dst, 5326, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5955, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); } else { } + if (sse) { + dasm_put(Dst, 6007, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6050, LJ_TISNUM); + if (sse) { + dasm_put(Dst, 6077); + } else { + } + dasm_put(Dst, 6094); + if (sse) { + dasm_put(Dst, 6102, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6050, LJ_TISNUM); + if (sse) { + dasm_put(Dst, 6145); + } else { + } + dasm_put(Dst, 6094); + if (sse) { + dasm_put(Dst, 6162, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6050, LJ_TISNUM); + if (sse) { + dasm_put(Dst, 6205); + } else { + } + dasm_put(Dst, 6094); + if (sse) { + dasm_put(Dst, 6222, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6265); + if (sse) { + dasm_put(Dst, 6272, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6315); + if (sse) { + dasm_put(Dst, 6319); + } else { + } + dasm_put(Dst, 6331); + if (sse) { + dasm_put(Dst, 6342, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6411); + if (sse) { + dasm_put(Dst, 6420, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6489); + if (sse) { + dasm_put(Dst, 6499, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6568); + if (sse) { + dasm_put(Dst, 6578, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6647); + if (sse) { + dasm_put(Dst, 6656, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); + } else { + } + dasm_put(Dst, 6725, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base)); + dasm_put(Dst, 6803, Dt1(->top), Dt7(->pc), FRAME_TYPE, LUA_MINSTACK, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 6929, Dt1(->top), Dt1(->base), Dt1(->top)); +#if LJ_HASJIT + dasm_put(Dst, 6968, DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount)); +#endif + dasm_put(Dst, 6999, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 7065, GG_DISP2STATIC); +#if LJ_HASJIT + dasm_put(Dst, 7101); +#endif + dasm_put(Dst, 7103); +#if LJ_HASJIT + dasm_put(Dst, 7101); +#endif + dasm_put(Dst, 7106); +#if LJ_HASJIT + dasm_put(Dst, 7101); +#endif + dasm_put(Dst, 7109); +#if LJ_HASJIT + dasm_put(Dst, 7112, Dt7(->pc), PC2PROTO(k), DISPATCH_GL(jit_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); +#endif + dasm_put(Dst, 7153); if (!sse) { - dasm_put(Dst, 5397); + dasm_put(Dst, 7156); } - dasm_put(Dst, 5406, 1+1, LJ_TSTR); - if (sse) { - dasm_put(Dst, 5428, Dt5(->len)); - } else { - dasm_put(Dst, 5439, Dt5(->len)); - } - dasm_put(Dst, 5447, 1+1, LJ_TSTR, Dt5(->len), Dt5([1])); - if (sse) { - dasm_put(Dst, 5481); - } else { - dasm_put(Dst, 5491); - } - dasm_put(Dst, 5504, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 5539); - } else { - dasm_put(Dst, 5559); - } - dasm_put(Dst, 5579, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2, LJ_TISNUM); - dasm_put(Dst, 2470); - if (sse) { - dasm_put(Dst, 5695); - } else { - dasm_put(Dst, 5706); - } - dasm_put(Dst, 5714, LJ_TSTR, LJ_TISNUM, Dt5(->len)); - if (sse) { - dasm_put(Dst, 5744); - } else { - } - dasm_put(Dst, 5751, sizeof(GCstr)-1); - dasm_put(Dst, 5826, 2+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); - dasm_put(Dst, 5885, LJ_TSTR, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 5910); - } else { - dasm_put(Dst, 5917); - } - dasm_put(Dst, 5929, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(tmpbuf.buf), 1+1); - dasm_put(Dst, 5994, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); - dasm_put(Dst, 6061, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz)); - dasm_put(Dst, 6136, sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), 1+1); - dasm_put(Dst, 6221, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); - dasm_put(Dst, 6295, 1+1, LJ_TTAB); - if (sse) { - dasm_put(Dst, 6371); - } else { - } - if (sse) { - dasm_put(Dst, 6381, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - if (sse) { - dasm_put(Dst, 6433, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6476); - if (sse) { - dasm_put(Dst, 6486); - } - dasm_put(Dst, 6491, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6509); - } else { - } - dasm_put(Dst, 6526); - if (sse) { - dasm_put(Dst, 6534, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6476); - if (sse) { - dasm_put(Dst, 6486); - } - dasm_put(Dst, 6491, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6577); - } else { - } - dasm_put(Dst, 6526); - if (sse) { - dasm_put(Dst, 6594, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6476); - if (sse) { - dasm_put(Dst, 6486); - } - dasm_put(Dst, 6491, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6637); - } else { - } - dasm_put(Dst, 6526); - if (sse) { - dasm_put(Dst, 6654, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6697); - if (sse) { - dasm_put(Dst, 6704, 1+1, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6747); - if (sse) { - dasm_put(Dst, 6751); - } else { - } - dasm_put(Dst, 6778); - if (sse) { - dasm_put(Dst, 6366); - } - dasm_put(Dst, 6781); - if (sse) { - dasm_put(Dst, 6790, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6859); - if (sse) { - dasm_put(Dst, 6868, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 6937); - if (sse) { - dasm_put(Dst, 6947, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 7016); - if (sse) { - dasm_put(Dst, 7026, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 7095); - if (sse) { - dasm_put(Dst, 7104, 1+1, LJ_TISNUM, LJ_TISNUM, (unsigned int)(U64x(43380000,00000000)), (unsigned int)((U64x(43380000,00000000))>>32)); - } else { - } - dasm_put(Dst, 7173, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base)); - dasm_put(Dst, 7257, Dt1(->top), Dt7(->gate), LJ_TFUNC, Dt7(->gate), Dt1(->base), LUA_MINSTACK, Dt1(->base), Dt1(->top)); - dasm_put(Dst, 7377, Dt1(->base), Dt1(->top)); -#if LJ_HASJIT - dasm_put(Dst, 7419, DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount)); -#endif - dasm_put(Dst, 7450, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base), Dt1(->base)); - dasm_put(Dst, 7516, BC__MAX*8); -#if LJ_HASJIT - dasm_put(Dst, 7552); -#endif - dasm_put(Dst, 7554); -#if LJ_HASJIT - dasm_put(Dst, 7552); -#endif - dasm_put(Dst, 7557); -#if LJ_HASJIT - dasm_put(Dst, 7552); -#endif - dasm_put(Dst, 7560); -#if LJ_HASJIT - dasm_put(Dst, 7563, Dt7(->pc), PC2PROTO(k), DISPATCH_GL(jit_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); -#endif - dasm_put(Dst, 7604); + dasm_put(Dst, 7201, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); if (!sse) { - dasm_put(Dst, 7607); + dasm_put(Dst, 7287); } - dasm_put(Dst, 7652, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7332, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32)); if (!sse) { - dasm_put(Dst, 7738); + dasm_put(Dst, 7418); } - dasm_put(Dst, 7783, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(bff00000,00000000)), (unsigned int)((U64x(bff00000,00000000))>>32)); - if (!sse) { - dasm_put(Dst, 7869); - } - dasm_put(Dst, 7908, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7457, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); if (sse) { - dasm_put(Dst, 7997, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7546, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(43300000,00000000)), (unsigned int)((U64x(43300000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); } else { - dasm_put(Dst, 8111); + dasm_put(Dst, 7660); } - dasm_put(Dst, 8158); + dasm_put(Dst, 7707); if (!sse) { } else { - dasm_put(Dst, 8232); + dasm_put(Dst, 7781); } - dasm_put(Dst, 8235); - dasm_put(Dst, 8320, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); - dasm_put(Dst, 8421, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7ff00000,00000000)), (unsigned int)((U64x(7ff00000,00000000))>>32)); - dasm_put(Dst, 8589); + dasm_put(Dst, 7784); + dasm_put(Dst, 7869, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32)); + dasm_put(Dst, 7970, (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32), (unsigned int)(U64x(3ff00000,00000000)), (unsigned int)((U64x(3ff00000,00000000))>>32), (unsigned int)(U64x(7ff00000,00000000)), (unsigned int)((U64x(7ff00000,00000000))>>32)); + dasm_put(Dst, 8138); if (sse) { - dasm_put(Dst, 8630); - dasm_put(Dst, 8700); - dasm_put(Dst, 8773); + dasm_put(Dst, 8179); + dasm_put(Dst, 8249); + dasm_put(Dst, 8322); } else { - dasm_put(Dst, 8823); - dasm_put(Dst, 8915); + dasm_put(Dst, 8372); + dasm_put(Dst, 8464); } - dasm_put(Dst, 8961); + dasm_put(Dst, 8510); if (sse) { - dasm_put(Dst, 8967, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); - dasm_put(Dst, 9056, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); + dasm_put(Dst, 8516, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); + dasm_put(Dst, 8605, (unsigned int)(U64x(7fffffff,ffffffff)), (unsigned int)((U64x(7fffffff,ffffffff))>>32)); } else { - dasm_put(Dst, 9180); - dasm_put(Dst, 9263); + dasm_put(Dst, 8729); + dasm_put(Dst, 8812); if (cmov) { - dasm_put(Dst, 9318); + dasm_put(Dst, 8867); } else { - dasm_put(Dst, 9337); + dasm_put(Dst, 8886); } - dasm_put(Dst, 9176); + dasm_put(Dst, 8725); } - dasm_put(Dst, 9378); + dasm_put(Dst, 8927); } /* Generate the code for a single instruction. */ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) { int vk = 0; - dasm_put(Dst, 155, defop); + dasm_put(Dst, 8953, defop); switch (op) { @@ -1424,602 +1390,602 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) /* Remember: all ops branch for a true comparison, fall through otherwise. */ case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - dasm_put(Dst, 9404, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 8955, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 9425); + dasm_put(Dst, 8976); } else { - dasm_put(Dst, 9440); + dasm_put(Dst, 8991); if (cmov) { - dasm_put(Dst, 9450); + dasm_put(Dst, 9001); } else { - dasm_put(Dst, 9456); + dasm_put(Dst, 9007); } } switch (op) { case BC_ISLT: - dasm_put(Dst, 9463); + dasm_put(Dst, 9014); break; case BC_ISGE: - dasm_put(Dst, 9258); + dasm_put(Dst, 8807); break; case BC_ISLE: - dasm_put(Dst, 6290); + dasm_put(Dst, 5872); break; case BC_ISGT: - dasm_put(Dst, 9468); + dasm_put(Dst, 9019); break; default: break; /* Shut up GCC. */ } - dasm_put(Dst, 9473, -BCBIAS_J*4); + dasm_put(Dst, 9024, -BCBIAS_J*4); break; case BC_ISEQV: case BC_ISNEV: vk = op == BC_ISEQV; - dasm_put(Dst, 9507, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9058, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 9533); + dasm_put(Dst, 9084); } else { - dasm_put(Dst, 9545); + dasm_put(Dst, 9096); if (cmov) { - dasm_put(Dst, 9450); + dasm_put(Dst, 9001); } else { - dasm_put(Dst, 9456); + dasm_put(Dst, 9007); } } iseqne_fp: if (vk) { - dasm_put(Dst, 9552); + dasm_put(Dst, 9103); } else { - dasm_put(Dst, 9561); + dasm_put(Dst, 9112); } iseqne_end: if (vk) { - dasm_put(Dst, 9570, -BCBIAS_J*4); + dasm_put(Dst, 9121, -BCBIAS_J*4); } else { - dasm_put(Dst, 9585, -BCBIAS_J*4); + dasm_put(Dst, 9136, -BCBIAS_J*4); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); if (op == BC_ISEQV || op == BC_ISNEV) { - dasm_put(Dst, 9600, LJ_TISPRI, LJ_TISTABUD, Dt6(->metatable), Dt6(->nomm), 1<metatable), Dt6(->nomm), 1<>32)); + dasm_put(Dst, 9439, (unsigned int)(U64x(80000000,00000000)), (unsigned int)((U64x(80000000,00000000))>>32)); } else { - dasm_put(Dst, 9913); + dasm_put(Dst, 9464); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_LEN: - dasm_put(Dst, 9922, LJ_TSTR); + dasm_put(Dst, 9473, LJ_TSTR); if (sse) { - dasm_put(Dst, 9936, Dt5(->len)); + dasm_put(Dst, 9487, Dt5(->len)); } else { - dasm_put(Dst, 9954, Dt5(->len)); + dasm_put(Dst, 9505, Dt5(->len)); } - dasm_put(Dst, 9963, LJ_TTAB); + dasm_put(Dst, 9514, LJ_TTAB); if (sse) { - dasm_put(Dst, 10004); + dasm_put(Dst, 9555); } else { } - dasm_put(Dst, 10013); + dasm_put(Dst, 9564); break; /* -- Binary ops -------------------------------------------------------- */ case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10043); + dasm_put(Dst, 9594); } else { - dasm_put(Dst, 10057); + dasm_put(Dst, 9608); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10077); + dasm_put(Dst, 9628); } else { - dasm_put(Dst, 10091); + dasm_put(Dst, 9642); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10121); + dasm_put(Dst, 9672); } else { - dasm_put(Dst, 10135); + dasm_put(Dst, 9686); } break; } if (sse) { - dasm_put(Dst, 9906); + dasm_put(Dst, 9457); } else { - dasm_put(Dst, 9918); + dasm_put(Dst, 9469); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10143); + dasm_put(Dst, 9694); } else { - dasm_put(Dst, 10157); + dasm_put(Dst, 9708); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10165); + dasm_put(Dst, 9716); } else { - dasm_put(Dst, 10179); + dasm_put(Dst, 9730); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10187); + dasm_put(Dst, 9738); } else { - dasm_put(Dst, 10201); + dasm_put(Dst, 9752); } break; } if (sse) { - dasm_put(Dst, 9906); + dasm_put(Dst, 9457); } else { - dasm_put(Dst, 9918); + dasm_put(Dst, 9469); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_MULVN: case BC_MULNV: case BC_MULVV: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10209); + dasm_put(Dst, 9760); } else { - dasm_put(Dst, 10223); + dasm_put(Dst, 9774); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10231); + dasm_put(Dst, 9782); } else { - dasm_put(Dst, 10245); + dasm_put(Dst, 9796); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10253); + dasm_put(Dst, 9804); } else { - dasm_put(Dst, 10267); + dasm_put(Dst, 9818); } break; } if (sse) { - dasm_put(Dst, 9906); + dasm_put(Dst, 9457); } else { - dasm_put(Dst, 9918); + dasm_put(Dst, 9469); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10275); + dasm_put(Dst, 9826); } else { - dasm_put(Dst, 10289); + dasm_put(Dst, 9840); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10297); + dasm_put(Dst, 9848); } else { - dasm_put(Dst, 10311); + dasm_put(Dst, 9862); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10319); + dasm_put(Dst, 9870); } else { - dasm_put(Dst, 10333); + dasm_put(Dst, 9884); } break; } if (sse) { - dasm_put(Dst, 9906); + dasm_put(Dst, 9457); } else { - dasm_put(Dst, 9918); + dasm_put(Dst, 9469); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_MODVN: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10341); + dasm_put(Dst, 9892); } else { - dasm_put(Dst, 10355); + dasm_put(Dst, 9906); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10363); + dasm_put(Dst, 9914); } else { - dasm_put(Dst, 10377); + dasm_put(Dst, 9928); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10385); + dasm_put(Dst, 9936); } else { - dasm_put(Dst, 10399); + dasm_put(Dst, 9950); } break; } - dasm_put(Dst, 10407); + dasm_put(Dst, 9958); if (sse) { - dasm_put(Dst, 9906); + dasm_put(Dst, 9457); } else { - dasm_put(Dst, 9918); + dasm_put(Dst, 9469); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_MODNV: case BC_MODVV: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10341); + dasm_put(Dst, 9892); } else { - dasm_put(Dst, 10355); + dasm_put(Dst, 9906); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10363); + dasm_put(Dst, 9914); } else { - dasm_put(Dst, 10377); + dasm_put(Dst, 9928); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10385); + dasm_put(Dst, 9936); } else { - dasm_put(Dst, 10399); + dasm_put(Dst, 9950); } break; } - dasm_put(Dst, 10413); + dasm_put(Dst, 9964); break; case BC_POW: - dasm_put(Dst, 10023); + dasm_put(Dst, 9574); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 10031, LJ_TISNUM); + dasm_put(Dst, 9582, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10341); + dasm_put(Dst, 9892); } else { - dasm_put(Dst, 10355); + dasm_put(Dst, 9906); } break; case 1: - dasm_put(Dst, 10065, LJ_TISNUM); + dasm_put(Dst, 9616, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10363); + dasm_put(Dst, 9914); } else { - dasm_put(Dst, 10377); + dasm_put(Dst, 9928); } break; default: - dasm_put(Dst, 10099, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 9650, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 10385); + dasm_put(Dst, 9936); } else { - dasm_put(Dst, 10399); + dasm_put(Dst, 9950); } break; } - dasm_put(Dst, 10418); + dasm_put(Dst, 9969); if (sse) { - dasm_put(Dst, 9906); + dasm_put(Dst, 9457); } else { - dasm_put(Dst, 9918); + dasm_put(Dst, 9469); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_CAT: - dasm_put(Dst, 10422, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 9973, Dt1(->base), Dt1(->base)); break; /* -- Constant ops ------------------------------------------------------ */ case BC_KSTR: - dasm_put(Dst, 10512, LJ_TSTR); + dasm_put(Dst, 10063, LJ_TSTR); break; case BC_KSHORT: if (sse) { - dasm_put(Dst, 10547); + dasm_put(Dst, 10098); } else { - dasm_put(Dst, 10562); + dasm_put(Dst, 10113); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_KNUM: if (sse) { - dasm_put(Dst, 10570); + dasm_put(Dst, 10121); } else { - dasm_put(Dst, 10583); + dasm_put(Dst, 10134); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_KPRI: - dasm_put(Dst, 10590); + dasm_put(Dst, 10141); break; case BC_KNIL: - dasm_put(Dst, 10618, LJ_TNIL); + dasm_put(Dst, 10169, LJ_TNIL); break; /* -- Upvalue and function ops ------------------------------------------ */ case BC_UGET: - dasm_put(Dst, 10665, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 10216, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_USETV: #define TV2MARKOFS \ ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)) - dasm_put(Dst, 10710, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); - dasm_put(Dst, 10801); + dasm_put(Dst, 10261, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); + dasm_put(Dst, 10352); break; #undef TV2MARKOFS case BC_USETS: - dasm_put(Dst, 10813, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); + dasm_put(Dst, 10364, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); break; case BC_USETN: - dasm_put(Dst, 10906); + dasm_put(Dst, 10457); if (sse) { - dasm_put(Dst, 10911); + dasm_put(Dst, 10462); } else { - dasm_put(Dst, 9726); + dasm_put(Dst, 9277); } - dasm_put(Dst, 10918, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 10469, offsetof(GCfuncL, uvptr), DtA(->v)); if (sse) { - dasm_put(Dst, 4853); + dasm_put(Dst, 10478); } else { - dasm_put(Dst, 4859); + dasm_put(Dst, 10484); } - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_USETP: - dasm_put(Dst, 10927, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 10487, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_UCLO: - dasm_put(Dst, 10966, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); + dasm_put(Dst, 10526, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); break; case BC_FNEW: - dasm_put(Dst, 11021, Dt1(->base), Dt1(->base), LJ_TFUNC); + dasm_put(Dst, 10581, Dt1(->base), Dt1(->base), LJ_TFUNC); break; /* -- Table ops --------------------------------------------------------- */ case BC_TNEW: - dasm_put(Dst, 11087, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB); + dasm_put(Dst, 10647, Dt1(->base), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), LJ_TTAB); break; case BC_TDUP: - dasm_put(Dst, 11208, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); + dasm_put(Dst, 10768, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); break; case BC_GGET: - dasm_put(Dst, 11303, Dt7(->env)); + dasm_put(Dst, 10863, Dt7(->env)); break; case BC_GSET: - dasm_put(Dst, 11322, Dt7(->env)); + dasm_put(Dst, 10882, Dt7(->env)); break; case BC_TGETV: - dasm_put(Dst, 11341, LJ_TTAB, LJ_TISNUM); + dasm_put(Dst, 10901, LJ_TTAB, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11374); + dasm_put(Dst, 10934); } else { } - dasm_put(Dst, 11395, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); - dasm_put(Dst, 11591, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); + dasm_put(Dst, 11151, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable)); - dasm_put(Dst, 11880, Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 11356, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable)); + dasm_put(Dst, 11440, Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETS: - dasm_put(Dst, 11942, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); - dasm_put(Dst, 12018, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<next)); - dasm_put(Dst, 12111, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 11502, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); + dasm_put(Dst, 11578, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<next)); + dasm_put(Dst, 11671, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETB: - dasm_put(Dst, 12202, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); - dasm_put(Dst, 12301, Dt6(->metatable), Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 11762, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); + dasm_put(Dst, 11861, Dt6(->metatable), Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETM: - dasm_put(Dst, 12347); + dasm_put(Dst, 11907); if (sse) { - dasm_put(Dst, 10911); + dasm_put(Dst, 10462); } else { } - dasm_put(Dst, 12352, Dt6(->marked), LJ_GC_BLACK); + dasm_put(Dst, 11912, Dt6(->marked), LJ_GC_BLACK); if (sse) { - dasm_put(Dst, 12377); + dasm_put(Dst, 11937); } else { } - dasm_put(Dst, 12384, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); - dasm_put(Dst, 12510, Dt6(->gclist)); + dasm_put(Dst, 11944, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); + dasm_put(Dst, 12070, Dt6(->gclist)); break; /* -- Calls and vararg handling ----------------------------------------- */ case BC_CALL: case BC_CALLM: - dasm_put(Dst, 10027); + dasm_put(Dst, 9578); if (op == BC_CALLM) { - dasm_put(Dst, 12518); + dasm_put(Dst, 12078); } - dasm_put(Dst, 12523, LJ_TFUNC, Dt7(->gate)); + dasm_put(Dst, 12083, LJ_TFUNC, Dt7(->pc)); break; case BC_CALLMT: - dasm_put(Dst, 12518); + dasm_put(Dst, 12078); break; case BC_CALLT: - dasm_put(Dst, 12546, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->gate)); - dasm_put(Dst, 12651, FRAME_TYPE, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 12125, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc)); + dasm_put(Dst, 12244, FRAME_TYPE, Dt7(->pc), PC2PROTO(k)); break; case BC_ITERC: - dasm_put(Dst, 12709, LJ_TFUNC, Dt7(->gate)); + dasm_put(Dst, 12302, LJ_TFUNC, 2+1, Dt7(->pc)); break; case BC_VARG: - dasm_put(Dst, 12771, Dt7(->pc), PC2PROTO(numparams), (8+FRAME_VARG), LJ_TNIL); - dasm_put(Dst, 12916, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 12383, Dt7(->pc), PC2PROTO(numparams), (8+FRAME_VARG), LJ_TNIL); + dasm_put(Dst, 12528, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); break; /* -- Returns ----------------------------------------------------------- */ case BC_RETM: - dasm_put(Dst, 12518); + dasm_put(Dst, 12078); break; case BC_RET: case BC_RET0: case BC_RET1: if (op != BC_RET0) { - dasm_put(Dst, 13015); + dasm_put(Dst, 12627); } - dasm_put(Dst, 13019, FRAME_TYPE); + dasm_put(Dst, 12631, FRAME_TYPE); switch (op) { case BC_RET: - dasm_put(Dst, 13038); + dasm_put(Dst, 12650); break; case BC_RET1: - dasm_put(Dst, 13096); + dasm_put(Dst, 12708); /* fallthrough */ case BC_RET0: - dasm_put(Dst, 13112); + dasm_put(Dst, 12724); default: break; } - dasm_put(Dst, 13123, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 12735, Dt7(->pc), PC2PROTO(k)); if (op == BC_RET) { - dasm_put(Dst, 13167, LJ_TNIL); + dasm_put(Dst, 12779, LJ_TNIL); } else { - dasm_put(Dst, 13176, LJ_TNIL); + dasm_put(Dst, 12788, LJ_TNIL); } - dasm_put(Dst, 13183); + dasm_put(Dst, 12795); if (op != BC_RET0) { - dasm_put(Dst, 13204); + dasm_put(Dst, 12816); } - dasm_put(Dst, 4944); + dasm_put(Dst, 4542); break; /* -- Loops and branches ------------------------------------------------ */ @@ -2027,7 +1993,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FORL: #if LJ_HASJIT - dasm_put(Dst, 13208, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 12820, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; @@ -2039,57 +2005,57 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FORI: case BC_IFORL: vk = (op == BC_IFORL || op == BC_JFORL); - dasm_put(Dst, 13229); + dasm_put(Dst, 12841); if (!vk) { - dasm_put(Dst, 13233, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 12845, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 13252); + dasm_put(Dst, 12864); if (!vk) { - dasm_put(Dst, 13256, LJ_TISNUM); + dasm_put(Dst, 12868, LJ_TISNUM); } if (sse) { - dasm_put(Dst, 13265); + dasm_put(Dst, 12877); if (vk) { - dasm_put(Dst, 13277); + dasm_put(Dst, 12889); } else { - dasm_put(Dst, 13296); + dasm_put(Dst, 12908); } - dasm_put(Dst, 13301); + dasm_put(Dst, 12913); } else { - dasm_put(Dst, 13314); + dasm_put(Dst, 12926); if (vk) { - dasm_put(Dst, 13320); + dasm_put(Dst, 12932); } else { - dasm_put(Dst, 13336); + dasm_put(Dst, 12948); } - dasm_put(Dst, 13344); + dasm_put(Dst, 12956); if (cmov) { - dasm_put(Dst, 9450); + dasm_put(Dst, 9001); } else { - dasm_put(Dst, 9456); + dasm_put(Dst, 9007); } if (!cmov) { - dasm_put(Dst, 13349); + dasm_put(Dst, 12961); } } if (op == BC_FORI) { - dasm_put(Dst, 13355, -BCBIAS_J*4); + dasm_put(Dst, 12967, -BCBIAS_J*4); } else if (op == BC_JFORI) { - dasm_put(Dst, 13365, -BCBIAS_J*4, BC_JLOOP); + dasm_put(Dst, 12977, -BCBIAS_J*4, BC_JLOOP); } else if (op == BC_IFORL) { - dasm_put(Dst, 13379, -BCBIAS_J*4); + dasm_put(Dst, 12991, -BCBIAS_J*4); } else { - dasm_put(Dst, 13375, BC_JLOOP); + dasm_put(Dst, 12987, BC_JLOOP); } - dasm_put(Dst, 9485); + dasm_put(Dst, 9036); if (sse) { - dasm_put(Dst, 13389); + dasm_put(Dst, 13001); } break; case BC_ITERL: #if LJ_HASJIT - dasm_put(Dst, 13208, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 12820, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; @@ -2098,33 +2064,96 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; #endif case BC_IITERL: - dasm_put(Dst, 13400, LJ_TNIL); + dasm_put(Dst, 13012, LJ_TNIL); if (op == BC_JITERL) { - dasm_put(Dst, 13415, BC_JLOOP); + dasm_put(Dst, 13027, BC_JLOOP); } else { - dasm_put(Dst, 13429, -BCBIAS_J*4); + dasm_put(Dst, 13041, -BCBIAS_J*4); } - dasm_put(Dst, 9785); + dasm_put(Dst, 9336); break; case BC_LOOP: #if LJ_HASJIT - dasm_put(Dst, 13208, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 12820, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; case BC_ILOOP: - dasm_put(Dst, 7584); + dasm_put(Dst, 7133); break; case BC_JLOOP: #if LJ_HASJIT - dasm_put(Dst, 13445, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); + dasm_put(Dst, 13057, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); #endif break; case BC_JMP: - dasm_put(Dst, 13469, -BCBIAS_J*4); + dasm_put(Dst, 13081, -BCBIAS_J*4); + break; + + /* -- Function headers -------------------------------------------------- */ + + /* + ** Reminder: A function may be called with func/args above L->maxstack, + ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot, + ** too. This means all FUNC* ops (including fast functions) must check + ** for stack overflow _before_ adding more slots! + */ + + case BC_FUNCF: +#if LJ_HASJIT +#endif + case BC_FUNCV: /* NYI: compiled vararg functions. */ + break; + + case BC_JFUNCF: +#if !LJ_HASJIT + break; +#endif + case BC_IFUNCF: + dasm_put(Dst, 13106, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); + if (op == BC_JFUNCF) { + dasm_put(Dst, 13136, BC_JLOOP); + } else { + dasm_put(Dst, 7133); + } + dasm_put(Dst, 13145, LJ_TNIL); + break; + + case BC_JFUNCV: +#if !LJ_HASJIT + break; +#endif + dasm_put(Dst, 7101); + break; /* NYI: compiled vararg functions. */ + + case BC_IFUNCV: + dasm_put(Dst, 13167, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); + if (op == BC_JFUNCV) { + dasm_put(Dst, 13136, BC_JLOOP); + } else { + dasm_put(Dst, 13258, -4+PC2PROTO(k)); + } + dasm_put(Dst, 13281, LJ_TNIL); + break; + + case BC_FUNCC: + case BC_FUNCCW: + dasm_put(Dst, 13303, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); + if (op == BC_FUNCC) { + dasm_put(Dst, 13333); + } else { + dasm_put(Dst, 13337); + } + dasm_put(Dst, 13345, DISPATCH_GL(vmstate), ~LJ_VMST_C); + if (op == BC_FUNCC) { + dasm_put(Dst, 13354); + } else { + dasm_put(Dst, 13358, DISPATCH_GL(wrapf)); + } + dasm_put(Dst, 13363, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); break; /* ---------------------------------------------------------------------- */ @@ -2152,7 +2181,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx, cmov, sse); - dasm_put(Dst, 13494); + dasm_put(Dst, 13388); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op, cmov, sse); diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index fdbefb83..b970278e 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc @@ -40,6 +40,7 @@ |.endif | |.define RA, ecx +|.define RAH, ch |.define RAL, cl |.define RB, ebp // Must be ebp (C callee-save). |.define RC, eax // Must be eax (fcomparepp and others). @@ -282,6 +283,27 @@ | .endmacro |.endif | +|// Call decode and dispatch. +|.macro ins_callt +| // BASE = new base, RB = LFUNC, RD = nargs+1, [BASE-4] = PC +| mov PC, LFUNC:RB->pc +| mov RA, [PC] +| movzx OP, RAL +| movzx RA, RAH +| add PC, 4 +|.if X64 +| jmp aword [DISPATCH+OP*8] +|.else +| jmp aword [DISPATCH+OP*4] +|.endif +|.endmacro +| +|.macro ins_call +| // BASE = new base, RB = LFUNC, RD = nargs+1 +| mov [BASE-4], PC +| ins_callt +|.endmacro +| |//----------------------------------------------------------------------- | |// Macros to test operand types. @@ -394,156 +416,26 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.code_sub | |//----------------------------------------------------------------------- - |//-- Call and return handling ------------------------------------------- + |//-- Return handling ---------------------------------------------------- |//----------------------------------------------------------------------- | - |// Reminder: A call gate may be called with func/args above L->maxstack, - |// i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot, - |// too. This means all call gates (L*, C and fast functions) must check - |// for stack overflow _before_ adding more slots! + |->vm_returnp: + | test PC, FRAME_P + | jz ->cont_dispatch | - |//-- Call gates --------------------------------------------------------- + | // Return from pcall or xpcall fast func. + | and PC, -8 + | sub BASE, PC // Restore caller base. + | lea RAa, [RA+PC-8] // Rebase RA and prepend one result. + | mov PC, [BASE-4] // Fetch PC of previous frame. + | // Prepending may overwrite the pcall frame, so do it at the end. + | mov dword [BASE+RA+4], LJ_TTRUE // Prepend true to results. | - |->gate_lf: // Call gate for fixarg Lua functions. - | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = old base), PC = return - | // DISPATCH initialized - | mov BASE, RA - | mov [BASE-4], PC // Store caller PC. - | mov PC, LFUNC:RB->pc - | movzx RA, byte [PC+PC2PROTO(framesize)] - | mov KBASE, [PC+PC2PROTO(k)] - | mov L:RB, SAVE_L - | lea RA, [BASE+RA*8] // Top of frame. - | cmp RA, L:RB->maxstack - | ja ->gate_lf_growstack - | movzx RA, byte [PC+PC2PROTO(numparams)] - | cmp NARGS:RC, RA // Check for missing parameters. - | jbe >3 - |2: -#if LJ_HASJIT - | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. - | // hotcall RB -#endif - | ins_next - | - |3: // Clear missing parameters. - | mov dword [BASE+NARGS:RC*8-4], LJ_TNIL - | add NARGS:RC, 1 - | cmp NARGS:RC, RA // Check for missing parameters. - | jbe <3 - | jmp <2 - | - |->gate_lv: // Call gate for vararg Lua functions. - | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = old base), PC = return - | // DISPATCH initialized - | mov [RA-4], PC // Store caller PC. - | lea PC, [NARGS:RC*8+FRAME_VARG] - | lea BASE, [RA+PC-FRAME_VARG] - | mov [BASE-8], LFUNC:RB // Store copy of LFUNC. - | mov [BASE-4], PC // Store delta + FRAME_VARG. - | mov PC, LFUNC:RB->pc - | movzx RB, byte [PC+PC2PROTO(framesize)] - | lea KBASE, [BASE+RB*8] - | mov L:RB, SAVE_L - | cmp KBASE, L:RB->maxstack - | ja ->gate_lv_growstack // Need to grow stack. - | mov RC, BASE - | movzx RB, byte [PC+PC2PROTO(numparams)] - | test RB, RB - | jz >2 - |1: // Copy fixarg slots up to new frame. - | add RA, 8 - | cmp RA, BASE - | jnb >3 // Less args than parameters? - | mov KBASE, [RA-8] - | mov [RC], KBASE - | mov KBASE, [RA-4] - | mov [RC+4], KBASE - | add RC, 8 - | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). - | sub RB, 1 - | jnz <1 - |2: - | mov KBASE, [PC+PC2PROTO(k)] -#if LJ_HASJIT - | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. - | // hotcall RB -#endif - | ins_next - | - |3: // Clear missing parameters. - | mov dword [RC+4], LJ_TNIL - | add RC, 8 - | sub RB, 1 - | jnz <3 - | jmp <2 - | - |->gate_cwrap: // Call gate for wrapped C functions. - | // RA = new base, RB = CFUNC, RC = nargs+1, (BASE = old base), PC = return - | mov [RA-4], PC - | mov KBASEa, CFUNC:RB->f - | mov L:RB, SAVE_L - | lea RC, [RA+NARGS:RC*8-8] - | mov L:RB->base, RA - | lea RA, [RC+8*LUA_MINSTACK] - | mov L:RB->top, RC - | cmp RA, L:RB->maxstack - |.if X64 - | mov CARG2, KBASEa - | mov CARG1d, L:RB // Caveat: CARG1d may be RA. - |.else - | mov ARG2, KBASEa - | mov ARG1, L:RB - |.endif - | ja ->gate_c_growstack // Need to grow stack. - | set_vmstate C - | // (lua_State *L, lua_CFunction f) - | call aword [DISPATCH+DISPATCH_GL(wrapf)] - | set_vmstate INTERP - | // nresults returned in eax (RD). - | mov BASE, L:RB->base - | lea RA, [BASE+RD*8] - | neg RA - | add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 |->vm_returnc: | add RD, 1 // RD = nresults+1 | mov MULTRES, RD | test PC, FRAME_TYPE | jz ->BC_RET_Z // Handle regular return to Lua. - | jmp ->vm_return - | - |->gate_c: // Call gate for C functions. - | // RA = new base, RB = CFUNC, RC = nargs+1, (BASE = old base), PC = return - | mov [RA-4], PC - | mov KBASEa, CFUNC:RB->f - | mov L:RB, SAVE_L - | lea RC, [RA+NARGS:RC*8-8] - | mov L:RB->base, RA - | lea RA, [RC+8*LUA_MINSTACK] - | mov L:RB->top, RC - | cmp RA, L:RB->maxstack - |.if X64 - | mov CARG1d, L:RB // Caveat: CARG1d may be RA. - |.else - | mov ARG1, L:RB - |.endif - | ja ->gate_c_growstack // Need to grow stack. - | set_vmstate C - | call KBASEa // (lua_State *L) - | set_vmstate INTERP - | // nresults returned in eax (RD). - | mov BASE, L:RB->base - | lea RA, [BASE+RD*8] - | neg RA - | add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 - |->vm_returnc: - | add RD, 1 // RD = nresults+1 - | mov MULTRES, RD - | test PC, FRAME_TYPE - | jz ->BC_RET_Z // Handle regular return to Lua. - | // Fallthrough. - | - |//-- Return handling (non-inline) --------------------------------------- | |->vm_return: | // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return @@ -654,51 +546,41 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | set_vmstate INTERP | jmp ->vm_returnc // Increments RD/MULTRES and returns. | - |->vm_returnp: - | test PC, FRAME_P - | jz ->cont_dispatch + |//----------------------------------------------------------------------- + |//-- Grow stack for calls ----------------------------------------------- + |//----------------------------------------------------------------------- | - | // Return from pcall or xpcall fast func. - | and PC, -8 - | sub BASE, PC // Restore caller base. - | lea RAa, [RA+PC-8] // Rebase RA and prepend one result. - | mov PC, [BASE-4] // Fetch PC of previous frame. - | // Prepending may overwrite the pcall frame, so do it at the end. - | mov dword [BASE+RA+4], LJ_TTRUE // Prepend true to results. - | jmp ->vm_returnc // Increments RD/MULTRES and returns. - | - |//-- Grow stack on-demand ----------------------------------------------- - | - |->gate_c_growstack: // Grow stack for C function. + |->vm_growstack_c: // Grow stack for C function. | mov FCARG2, LUA_MINSTACK + | jmp >2 + | + |->vm_growstack_v: // Grow stack for vararg Lua function. + | sub RD, 8 | jmp >1 | - |->gate_lv_growstack: // Grow stack for vararg Lua function. - | mov BASE, RA // Drop vararg frame again. - | - |->gate_lf_growstack: // Grow stack for fixarg Lua function. - | // BASE = new base, RC = nargs+1, RB = L, PC = first PC - | lea RC, [BASE+NARGS:RC*8-8] - | movzx RA, byte [PC+PC2PROTO(framesize)] + |->vm_growstack_f: // Grow stack for fixarg Lua function. + | // BASE = new base, RD = nargs+1, RB = L, PC = first PC + | lea RD, [BASE+NARGS:RD*8-8] + |1: + | movzx RA, byte [PC-4+PC2PROTO(framesize)] | add PC, 4 // Must point after first instruction. | mov L:RB->base, BASE - | mov L:RB->top, RC + | mov L:RB->top, RD | mov SAVE_PC, PC | mov FCARG2, RA - |1: + |2: + | // RB = L, L->base = new base, L->top = top | mov FCARG1, L:RB - | // L:RB = L, L->base = new base, L->top = top - | // SAVE_PC = initial PC+1 (undefined for C functions) | call extern lj_state_growstack@8 // (lua_State *L, int n) - | mov RA, L:RB->base - | mov RC, L:RB->top - | mov LFUNC:RB, [RA-8] - | mov PC, [RA-4] - | sub RC, RA - | shr RC, 3 - | add NARGS:RC, 1 - | // RA = new base, RB = LFUNC, RC = nargs+1, (BASE = invalid), PC restored. - | jmp aword LFUNC:RB->gate // Just retry call. + | mov BASE, L:RB->base + | mov RD, L:RB->top + | mov LFUNC:RB, [BASE-8] + | mov PC, [BASE-4] + | sub RD, BASE + | shr RD, 3 + | add NARGS:RD, 1 + | // BASE = new base, RB = LFUNC, RD = nargs+1, PC restored. + | ins_callt // Just retry the call. | |//----------------------------------------------------------------------- |//-- Entry points into the assembler VM --------------------------------- @@ -789,16 +671,20 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | add PC, RA | sub PC, BASE // PC = frame delta + frame type | - | mov RC, L:RB->top - | sub RC, RA - | shr NARGS:RC, 3 - | add NARGS:RC, 1 // RC = nargs+1 + | mov RD, L:RB->top + | sub RD, RA + | shr NARGS:RD, 3 + | add NARGS:RD, 1 // RD = nargs+1 | + |->vm_call_dispatch: | mov LFUNC:RB, [RA-8] | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call // Ensure KBASE defined and != BASE. - | jmp aword LFUNC:RB->gate - | // RA = new base, RB = LFUNC/CFUNC, RC = nargs+1. + | jne ->vmeta_call // Ensure KBASE defined and != BASE. + | + |->vm_call_dispatch_f: + | mov BASE, RA + | ins_call + | // BASE = new base, RD = nargs+1 | |->vm_cpcall: // Setup protected C frame, call C. | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) @@ -979,8 +865,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | lea PC, [RA+FRAME_CONT] | sub PC, BASE | mov LFUNC:RB, [RA-8] // Guaranteed to be a function here. - | mov NARGS:RC, 3 // 2+1 args for func(t, k). - | jmp aword LFUNC:RB->gate + | mov NARGS:RD, 2+1 // 2 args for func(t, k). + | jmp ->vm_call_dispatch_f | |//----------------------------------------------------------------------- | @@ -1058,8 +944,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | lea PC, [RA+FRAME_CONT] | sub PC, BASE | mov LFUNC:RB, [RA-8] // Guaranteed to be a function here. - | mov NARGS:RC, 4 // 3+1 args for func(t, k, v). - | jmp aword LFUNC:RB->gate + | mov NARGS:RD, 3+1 // 3 args for func(t, k, v). + | jmp ->vm_call_dispatch_f | |//-- Comparison metamethods --------------------------------------------- | @@ -1206,11 +1092,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | sub RC, BASE | mov [RA-12], PC // [cont|PC] | lea PC, [RC+FRAME_CONT] - | mov LFUNC:RB, [RA-8] - | mov NARGS:RC, 3 // 2+1 args for func(o1, o2). - | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call - | jmp aword LFUNC:RB->gate + | mov NARGS:RD, 2+1 // 2 args for func(o1, o2). + | jmp ->vm_call_dispatch | |->vmeta_len: | mov L:RB, SAVE_L @@ -1225,19 +1108,21 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |//-- Call metamethod ---------------------------------------------------- | + |->vmeta_call_ra: + | lea RA, [BASE+RA*8+8] |->vmeta_call: // Resolve and call __call metamethod. - | // RA = new base, RC = nargs+1, BASE = old base, PC = return + | // BASE = old base, RA = new base, RC = nargs+1, PC = return | mov TMP2, RA // Save RA, RC for us. - | mov TMP1, NARGS:RC + | mov TMP1, NARGS:RD | sub RA, 8 |.if X64 | mov L:RB, SAVE_L | mov L:RB->base, BASE // Caveat: CARG2d/CARG3d may be BASE. | mov CARG2d, RA - | lea CARG3d, [RA+NARGS:RC*8] + | lea CARG3d, [RA+NARGS:RD*8] | mov CARG1d, L:RB // Caveat: CARG1d may be RA. |.else - | lea RC, [RA+NARGS:RC*8] + | lea RC, [RA+NARGS:RD*8] | mov L:RB, SAVE_L | mov ARG2, RA | mov ARG3, RC @@ -1248,13 +1133,14 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | call extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) | mov BASE, L:RB->base | mov RA, TMP2 - | mov NARGS:RC, TMP1 + | mov NARGS:RD, TMP1 | mov LFUNC:RB, [RA-8] - | add NARGS:RC, 1 + | add NARGS:RD, 1 | // This is fragile. L->base must not move, KBASE must always be defined. | cmp KBASE, BASE // Continue with CALLT if flag set. | je ->BC_CALLT_Z - | jmp aword LFUNC:RB->gate // Otherwise call resolved metamethod. + | mov BASE, RA + | ins_call // Otherwise call resolved metamethod. | |//-- Argument coercion for 'for' statement ------------------------------ | @@ -1271,9 +1157,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | movzx OP, RCL | shr RC, 16 |.if X64 - | jmp aword [DISPATCH+OP*8+BC__MAX*8] // Retry FORI or JFORI. + | jmp aword [DISPATCH+OP*8+GG_DISP2STATIC] // Retry FORI or JFORI. |.else - | jmp aword [DISPATCH+OP*4+BC__MAX*4] // Retry FORI or JFORI. + | jmp aword [DISPATCH+OP*4+GG_DISP2STATIC] // Retry FORI or JFORI. |.endif | |//----------------------------------------------------------------------- @@ -1286,31 +1172,31 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.macro .ffunc_1, name |->ff_ .. name: - | cmp NARGS:RC, 1+1; jb ->fff_fallback + | cmp NARGS:RD, 1+1; jb ->fff_fallback |.endmacro | |.macro .ffunc_2, name |->ff_ .. name: - | cmp NARGS:RC, 2+1; jb ->fff_fallback + | cmp NARGS:RD, 2+1; jb ->fff_fallback |.endmacro | |.macro .ffunc_n, name | .ffunc_1 name - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback - | fld qword [RA] + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback + | fld qword [BASE] |.endmacro | |.macro .ffunc_n, name, op | .ffunc_1 name - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback | op - | fld qword [RA] + | fld qword [BASE] |.endmacro | |.macro .ffunc_nsse, name, op | .ffunc_1 name - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback - | op xmm0, qword [RA] + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback + | op xmm0, qword [BASE] |.endmacro | |.macro .ffunc_nsse, name @@ -1319,26 +1205,26 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.macro .ffunc_nn, name | .ffunc_2 name - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback - | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback - | fld qword [RA] - | fld qword [RA+8] + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+12], LJ_TISNUM; ja ->fff_fallback + | fld qword [BASE] + | fld qword [BASE+8] |.endmacro | |.macro .ffunc_nnsse, name | .ffunc_1 name - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback - | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback - | movsd xmm0, qword [RA] - | movsd xmm1, qword [RA+8] + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+12], LJ_TISNUM; ja ->fff_fallback + | movsd xmm0, qword [BASE] + | movsd xmm1, qword [BASE+8] |.endmacro | |.macro .ffunc_nnr, name | .ffunc_2 name - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback - | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback - | fld qword [RA+8] - | fld qword [RA] + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+12], LJ_TISNUM; ja ->fff_fallback + | fld qword [BASE+8] + | fld qword [BASE] |.endmacro | |// Inlined GC threshold check. Caveat: uses label 1. @@ -1353,15 +1239,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |//-- Base library: checks ----------------------------------------------- | |.ffunc_1 assert - | mov RB, [RA+4] + | mov RB, [BASE+4] | cmp RB, LJ_TISTRUECOND; jae ->fff_fallback + | mov PC, [BASE-4] | mov MULTRES, RD - | mov [RA-4], RB - | mov RB, [RA] - | mov [RA-8], RB + | mov [BASE-4], RB + | mov RB, [BASE] + | mov [BASE-8], RB | sub RD, 2 | jz >2 - | mov TMP1, RA + | mov RA, BASE |1: | add RA, 8 | mov RB, [RA+4] @@ -1370,13 +1257,12 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | mov [RA-8], RB | sub RD, 1 | jnz <1 - | mov RA, TMP1 |2: | mov RD, MULTRES | jmp ->fff_res_ | |.ffunc_1 type - | mov RB, [RA+4] + | mov RB, [BASE+4] | mov RC, ~LJ_TNUMX | not RB | cmp RC, RB @@ -1385,29 +1271,29 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) ||} else { | jbe >1; mov RC, RB; 1: ||} - | mov CFUNC:RB, [RA-8] + | mov CFUNC:RB, [BASE-8] | mov STR:RC, [CFUNC:RB+RC*8+((char *)(&((GCfuncC *)0)->upvalue))] - | mov dword [RA-4], LJ_TSTR - | mov [RA-8], STR:RC + | mov PC, [BASE-4] + | mov dword [BASE-4], LJ_TSTR + | mov [BASE-8], STR:RC | jmp ->fff_res1 | |//-- Base library: getters and setters --------------------------------- | |.ffunc_1 getmetatable - | mov RB, [RA+4] + | mov RB, [BASE+4] + | mov PC, [BASE-4] | cmp RB, LJ_TTAB; jne >6 |1: // Field metatable must be at same offset for GCtab and GCudata! - | mov TAB:RB, [RA] + | mov TAB:RB, [BASE] | mov TAB:RB, TAB:RB->metatable |2: | test TAB:RB, TAB:RB - | mov dword [RA-4], LJ_TNIL + | mov dword [BASE-4], LJ_TNIL | jz ->fff_res1 - | mov CFUNC:RC, [RA-8] | mov STR:RC, [DISPATCH+DISPATCH_GL(mmname)+4*MM_metatable] - | mov dword [RA-4], LJ_TTAB // Store metatable as default result. - | mov [RA-8], TAB:RB - | mov TMP1, RA // Save result pointer. + | mov dword [BASE-4], LJ_TTAB // Store metatable as default result. + | mov [BASE-8], TAB:RB | mov RA, TAB:RB->hmask | and RA, STR:RC->hash | imul RA, #NODE @@ -1424,11 +1310,10 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | jmp ->fff_res1 // Not found, keep default result. |5: | mov RB, [RA+4] - | cmp RB, LJ_TNIL; je ->fff_res1 // Dito for nil value. + | cmp RB, LJ_TNIL; je ->fff_res1 // Ditto for nil value. | mov RC, [RA] - | mov RA, TMP1 // Restore result pointer. - | mov [RA-4], RB // Return value of mt.__metatable. - | mov [RA-8], RC + | mov [BASE-4], RB // Return value of mt.__metatable. + | mov [BASE-8], RC | jmp ->fff_res1 | |6: @@ -1441,15 +1326,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | jmp <2 | |.ffunc_2 setmetatable - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback | // Fast path: no mt for table yet and not clearing the mt. - | mov TAB:RB, [RA] + | mov TAB:RB, [BASE] | cmp dword TAB:RB->metatable, 0; jne ->fff_fallback - | cmp dword [RA+12], LJ_TTAB; jne ->fff_fallback - | mov TAB:RC, [RA+8] + | cmp dword [BASE+12], LJ_TTAB; jne ->fff_fallback + | mov TAB:RC, [BASE+8] | mov TAB:RB->metatable, TAB:RC - | mov dword [RA-4], LJ_TTAB // Return original table. - | mov [RA-8], TAB:RB + | mov PC, [BASE-4] + | mov dword [BASE-4], LJ_TTAB // Return original table. + | mov [BASE-8], TAB:RB | test byte TAB:RB->marked, LJ_GC_BLACK // isblack(table) | jz >1 | // Possible write barrier. Table is black, but skip iswhite(mt) check. @@ -1458,70 +1344,73 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | jmp ->fff_res1 | |.ffunc_2 rawget - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback - |.if X64 - | mov TMP1, BASE // Save BASE and RA. - | mov RB, RA - | mov CARG2d, [RA] - | lea CARG3d, [RA+8] - | mov CARG1d, SAVE_L // Caveat: CARG1d may be RA. + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback + |.if X64WIN + | mov RB, BASE // Save BASE. + | lea CARG3d, [BASE+8] + | mov CARG2d, [BASE] // Caveat: CARG2d == BASE. + | mov CARG1d, SAVE_L + |.elif X64 + | mov RB, BASE // Save BASE. + | mov CARG2d, [BASE] + | lea CARG3d, [BASE+8] // Caveat: CARG3d == BASE. + | mov CARG1d, SAVE_L |.else - | mov TAB:RC, [RA] + | mov TAB:RD, [BASE] | mov L:RB, SAVE_L - | mov ARG2, TAB:RC + | mov ARG2, TAB:RD | mov ARG1, L:RB - | mov RB, RA - | mov TMP1, BASE // Save BASE and RA. - | add RA, 8 - | mov ARG3, RA + | mov RB, BASE // Save BASE. + | add BASE, 8 + | mov ARG3, BASE |.endif | call extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) - | // cTValue * returned in eax (RC). - | mov RA, RB - | mov BASE, TMP1 - | mov RB, [RC] // Copy table slot. - | mov RC, [RC+4] - | mov [RA-8], RB - | mov [RA-4], RC + | // cTValue * returned in eax (RD). + | mov BASE, RB // Restore BASE. + | mov RB, [RD] // Copy table slot. + | mov RD, [RD+4] + | mov PC, [BASE-4] + | mov [BASE-8], RB + | mov [BASE-4], RD | jmp ->fff_res1 | |//-- Base library: conversions ------------------------------------------ | |.ffunc tonumber | // Only handles the number case inline (without a base argument). - | cmp NARGS:RC, 1+1; jne ->fff_fallback // Exactly one argument. - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback + | cmp NARGS:RD, 1+1; jne ->fff_fallback // Exactly one argument. + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback if (sse) { - | movsd xmm0, qword [RA]; jmp ->fff_resxmm0 + | movsd xmm0, qword [BASE]; jmp ->fff_resxmm0 } else { - | fld qword [RA]; jmp ->fff_resn + | fld qword [BASE]; jmp ->fff_resn } | |.ffunc_1 tostring | // Only handles the string or number case inline. - | cmp dword [RA+4], LJ_TSTR; jne >3 + | mov PC, [BASE-4] + | cmp dword [BASE+4], LJ_TSTR; jne >3 | // A __tostring method in the string base metatable is ignored. - | mov STR:RC, [RA] + | mov STR:RD, [BASE] |2: - | mov dword [RA-4], LJ_TSTR - | mov [RA-8], STR:RC + | mov dword [BASE-4], LJ_TSTR + | mov [BASE-8], STR:RD | jmp ->fff_res1 |3: // Handle numbers inline, unless a number base metatable is present. - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback | cmp dword [DISPATCH+DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])], 0 | jne ->fff_fallback | ffgccheck // Caveat: uses label 1. | mov L:RB, SAVE_L - | mov L:RB->base, RA // Add frame since C call can throw. - | mov [RA-4], PC + | mov L:RB->base, BASE // Add frame since C call can throw. | mov SAVE_PC, PC // Redundant (but a defined value). - | mov TMP1, BASE // Save BASE. - | mov FCARG2, RA // Caveat: FCARG2 == BASE - | mov L:FCARG1, L:RB // Caveat: FCARG1 == RA + |.if X64 and not X64WIN + | mov FCARG2, BASE // Otherwise: FCARG2 == BASE + |.endif + | mov L:FCARG1, L:RB | call extern lj_str_fromnum@8 // (lua_State *L, lua_Number *np) - | // GCstr returned in eax (RC). - | mov RA, L:RB->base - | mov BASE, TMP1 + | // GCstr returned in eax (RD). + | mov BASE, L:RB->base | jmp <2 | |//-- Base library: iterators ------------------------------------------- @@ -1529,120 +1418,117 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.ffunc_1 next | je >2 // Missing 2nd arg? |1: - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback - |.if X64 - | mov TMP1, BASE // Save BASE. - | mov CARG2d, [RA] + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback | mov L:RB, SAVE_L - | mov L:RB->base, RA // Add frame since C call can throw. - | mov [RA-4], PC - | lea CARG3d, [RA+8] - | mov CARG1d, L:RB // Caveat: CARG1d may be RA. + | mov L:RB->base, BASE // Add frame since C call can throw. + | mov PC, [BASE-4] + |.if X64WIN + | lea CARG3d, [BASE+8] + | mov CARG2d, [BASE] // Caveat: CARG2d == BASE. + | mov CARG1d, L:RB + |.elif X64 + | mov CARG2d, [BASE] + | lea CARG3d, [BASE+8] // Caveat: CARG3d == BASE. + | mov CARG1d, L:RB |.else - | mov TAB:RB, [RA] - | mov ARG2, TAB:RB - | mov L:RB, SAVE_L + | mov TAB:RD, [BASE] + | mov ARG2, TAB:RD | mov ARG1, L:RB - | mov L:RB->base, RA // Add frame since C call can throw. - | mov [RA-4], PC - | mov TMP1, BASE // Save BASE. - | add RA, 8 - | mov ARG3, RA + | add BASE, 8 + | mov ARG3, BASE |.endif | mov SAVE_PC, PC // Redundant (but a defined value). | call extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) - | // Flag returned in eax (RC). - | mov RA, L:RB->base - | mov BASE, TMP1 - | test RC, RC; jz >3 // End of traversal? - | mov RB, [RA+8] // Copy key and value to results. - | mov RC, [RA+12] - | mov [RA-8], RB - | mov [RA-4], RC - | mov RB, [RA+16] - | mov RC, [RA+20] - | mov [RA], RB - | mov [RA+4], RC + | // Flag returned in eax (RD). + | mov BASE, L:RB->base + | test RD, RD; jz >3 // End of traversal? + | mov RB, [BASE+8] // Copy key and value to results. + | mov RD, [BASE+12] + | mov [BASE-8], RB + | mov [BASE-4], RD + | mov RB, [BASE+16] + | mov RD, [BASE+20] + | mov [BASE], RB + | mov [BASE+4], RD |->fff_res2: | mov RD, 1+2 | jmp ->fff_res |2: // Set missing 2nd arg to nil. - | mov dword [RA+12], LJ_TNIL + | mov dword [BASE+12], LJ_TNIL | jmp <1 |3: // End of traversal: return nil. - | mov dword [RA-4], LJ_TNIL + | mov dword [BASE-4], LJ_TNIL | jmp ->fff_res1 | |.ffunc_1 pairs - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback - | mov CFUNC:RC, CFUNC:RB->upvalue[0] - | mov dword [RA-4], LJ_TFUNC - | mov [RA-8], CFUNC:RC - | mov dword [RA+12], LJ_TNIL + | mov CFUNC:RB, [BASE-8] + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback + | mov CFUNC:RD, CFUNC:RB->upvalue[0] + | mov PC, [BASE-4] + | mov dword [BASE-4], LJ_TFUNC + | mov [BASE-8], CFUNC:RD + | mov dword [BASE+12], LJ_TNIL | mov RD, 1+3 | jmp ->fff_res | |.ffunc_1 ipairs_aux - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback - | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback + | cmp dword [BASE+12], LJ_TISNUM; ja ->fff_fallback + | mov PC, [BASE-4] if (sse) { - | movsd xmm0, qword [RA+8] + | movsd xmm0, qword [BASE+8] | sseconst_1 xmm1, RBa | addsd xmm0, xmm1 - | cvtsd2si RC, xmm0 - | movsd qword [RA-8], xmm0 + | cvtsd2si RD, xmm0 + | movsd qword [BASE-8], xmm0 } else { |.if not X64 - | fld qword [RA+8] + | fld qword [BASE+8] | fld1 | faddp st1 | fist ARG1 - | fstp qword [RA-8] - | mov RC, ARG1 + | fstp qword [BASE-8] + | mov RD, ARG1 |.endif } - | mov TAB:RB, [RA] - | cmp RC, TAB:RB->asize; jae >2 // Not in array part? - | shl RC, 3 - | add RC, TAB:RB->array + | mov TAB:RB, [BASE] + | cmp RD, TAB:RB->asize; jae >2 // Not in array part? + | shl RD, 3 + | add RD, TAB:RB->array |1: - | cmp dword [RC+4], LJ_TNIL; je ->fff_res0 - | mov RB, [RC] // Copy array slot. - | mov RC, [RC+4] - | mov [RA], RB - | mov [RA+4], RC + | cmp dword [RD+4], LJ_TNIL; je ->fff_res0 + | mov RB, [RD] // Copy array slot. + | mov RD, [RD+4] + | mov [BASE], RB + | mov [BASE+4], RD | jmp ->fff_res2 |2: // Check for empty hash part first. Otherwise call C function. | cmp dword TAB:RB->hmask, 0; je ->fff_res0 - | mov TMP1, BASE // Save BASE and RA. - |.if X64 and not X64WIN | mov FCARG1, TAB:RB - | mov RB, RA - |.else - | xchg FCARG1, TAB:RB // Caveat: FCARG1 == RA - |.endif - | mov FCARG2, RC + | mov RB, BASE // Save BASE. + | mov FCARG2, RD // Caveat: FCARG2 == BASE | call extern lj_tab_getinth@8 // (GCtab *t, int32_t key) - | // cTValue * or NULL returned in eax (RC). - | mov RA, RB - | mov BASE, TMP1 - | test RC, RC + | // cTValue * or NULL returned in eax (RD). + | mov BASE, RB + | test RD, RD | jnz <1 |->fff_res0: | mov RD, 1+0 | jmp ->fff_res | |.ffunc_1 ipairs - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback - | mov CFUNC:RC, CFUNC:RB->upvalue[0] - | mov dword [RA-4], LJ_TFUNC - | mov [RA-8], CFUNC:RC + | mov CFUNC:RB, [BASE-8] + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback + | mov CFUNC:RD, CFUNC:RB->upvalue[0] + | mov PC, [BASE-4] + | mov dword [BASE-4], LJ_TFUNC + | mov [BASE-8], CFUNC:RD if (sse) { | xorps xmm0, xmm0 - | movsd qword [RA+8], xmm0 + | movsd qword [BASE+8], xmm0 } else { | fldz - | fstp qword [RA+8] + | fstp qword [BASE+8] } | mov RD, 1+3 | jmp ->fff_res @@ -1650,54 +1536,42 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |//-- Base library: catch errors ---------------------------------------- | |.ffunc_1 pcall - | mov [RA-4], PC + | lea RA, [BASE+8] + | sub NARGS:RD, 1 | mov PC, 8+FRAME_PCALL - | mov BASE, RA - | add RA, 8 - | sub NARGS:RC, 1 - | mov LFUNC:RB, [RA-8] |1: - | test byte [DISPATCH+DISPATCH_GL(hookmask)], HOOK_ACTIVE - | jnz >3 // Hook active before pcall? - |2: - | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call // Ensure KBASE defined and != BASE. - | jmp aword LFUNC:RB->gate - |3: - | add PC, 1 // Use FRAME_PCALLH if hook was active. - | jmp <2 + | movzx RB, byte [DISPATCH+DISPATCH_GL(hookmask)] + | shr RB, HOOK_ACTIVE_SHIFT + | and RB, 1 + | add PC, RB // Remember active hook before pcall. + | jmp ->vm_call_dispatch | |.ffunc_2 xpcall - | cmp dword [RA+12], LJ_TFUNC; jne ->fff_fallback - | mov [RA-4], PC - | mov RB, [RA+4] // Swap function and traceback. - | mov [RA+12], RB - | mov dword [RA+4], LJ_TFUNC - | mov LFUNC:RB, [RA] - | mov PC, [RA+8] - | mov [RA+8], LFUNC:RB - | mov [RA], PC - | mov PC, 2*8+FRAME_PCALL - | mov BASE, RA - | add RA, 2*8 - | sub NARGS:RC, 2 + | cmp dword [BASE+12], LJ_TFUNC; jne ->fff_fallback + | mov RB, [BASE+4] // Swap function and traceback. + | mov [BASE+12], RB + | mov dword [BASE+4], LJ_TFUNC + | mov LFUNC:RB, [BASE] + | mov PC, [BASE+8] + | mov [BASE+8], LFUNC:RB + | mov [BASE], PC + | lea RA, [BASE+16] + | sub NARGS:RD, 2 + | mov PC, 16+FRAME_PCALL | jmp <1 | |//-- Coroutine library -------------------------------------------------- | |.macro coroutine_resume_wrap, resume - |9: // Need to restore PC for fallback handler. - | mov PC, SAVE_PC - | jmp ->fff_fallback - | |.if resume |.ffunc_1 coroutine_resume - | mov L:RB, [RA] + | mov L:RB, [BASE] |.else |.ffunc coroutine_wrap_aux + | mov CFUNC:RB, [BASE-8] | mov L:RB, CFUNC:RB->upvalue[0].gcr |.endif - | mov [RA-4], PC + | mov PC, [BASE-4] | mov SAVE_PC, PC |.if X64 | mov TMP1, L:RB @@ -1705,60 +1579,52 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | mov ARG1, L:RB |.endif |.if resume - | cmp dword [RA+4], LJ_TTHREAD; jne <9 - |.endif - | cmp aword L:RB->cframe, 0; jne <9 - | cmp byte L:RB->status, LUA_YIELD; ja <9 - | mov PC, L:RB->top - |.if X64 - | mov TMP2, PC - |.else - | mov ARG2, PC + | cmp dword [BASE+4], LJ_TTHREAD; jne ->fff_fallback |.endif + | cmp aword L:RB->cframe, 0; jne ->fff_fallback + | cmp byte L:RB->status, LUA_YIELD; ja ->fff_fallback + | mov RA, L:RB->top | je >1 // Status != LUA_YIELD (i.e. 0)? - | cmp PC, L:RB->base; je <9 // Check for presence of initial func. + | cmp RA, L:RB->base // Check for presence of initial func. + | je ->fff_fallback |1: |.if resume - | lea PC, [PC+NARGS:RC*8-16] // Check stack space (-1-thread). + | lea PC, [RA+NARGS:RD*8-16] // Check stack space (-1-thread). |.else - | lea PC, [PC+NARGS:RC*8-8] // Check stack space (-1). + | lea PC, [RA+NARGS:RD*8-8] // Check stack space (-1). |.endif - | cmp PC, L:RB->maxstack; ja <9 + | cmp PC, L:RB->maxstack; ja ->fff_fallback | mov L:RB->top, PC | | mov L:RB, SAVE_L - | mov L:RB->base, RA + | mov L:RB->base, BASE |.if resume - | add RA, 8 // Keep resumed thread in stack for GC. - |.endif - | mov L:RB->top, RA - |.if X64 - | mov RB, TMP2 - |.else - | mov RB, ARG2 + | add BASE, 8 // Keep resumed thread in stack for GC. |.endif + | mov L:RB->top, BASE |.if resume - | lea RA, [RA+NARGS:RC*8-24] // RA = end of source for stack move. + | lea RB, [BASE+NARGS:RD*8-24] // RB = end of source for stack move. |.else - | lea RA, [RA+NARGS:RC*8-16] // RA = end of source for stack move. + | lea RB, [BASE+NARGS:RD*8-16] // RB = end of source for stack move. |.endif - | sub RAa, PCa // Relative to PC. + | sub RBa, PCa // Relative to PC. | - | cmp PC, RB + | cmp PC, RA | je >3 |2: // Move args to coroutine. - | mov RC, [PC+RA+4] + | mov RC, [PC+RB+4] | mov [PC-4], RC - | mov RC, [PC+RA] + | mov RC, [PC+RB] | mov [PC-8], RC | sub PC, 8 - | cmp PC, RB + | cmp PC, RA | jne <2 |3: |.if X64 + | mov CARG2d, RA | mov CARG1d, TMP1 - | mov CARG2d, TMP2 |.else + | mov ARG2, RA | xor RA, RA | mov ARG4, RA | mov ARG3, RA @@ -1854,12 +1720,11 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.ffunc coroutine_yield | mov L:RB, SAVE_L - | mov [RA-4], PC | test aword L:RB->cframe, CFRAME_RESUME | jz ->fff_fallback - | mov L:RB->base, RA - | lea RC, [RA+NARGS:RC*8-8] - | mov L:RB->top, RC + | mov L:RB->base, BASE + | lea RD, [BASE+NARGS:RD*8-8] + | mov L:RB->top, RD | xor RD, RD | mov aword L:RB->cframe, RDa | mov al, LUA_YIELD @@ -1870,14 +1735,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | if (sse) { |->fff_resn: - | fstp qword [RA-8] + | mov PC, [BASE-4] + | fstp qword [BASE-8] | jmp ->fff_res1 | |.ffunc_nsse math_abs | sseconst_abs xmm1, RDa | andps xmm0, xmm1 |->fff_resxmm0: - | movsd qword [RA-8], xmm0 + | mov PC, [BASE-4] + | movsd qword [BASE-8], xmm0 | // fallthrough } else { |.ffunc_n math_abs @@ -1885,7 +1752,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | // fallthrough |->fff_resxmm0: // Dummy. |->fff_resn: - | fstp qword [RA-8] + | mov PC, [BASE-4] + | fstp qword [BASE-8] } |->fff_res1: | mov RD, 1+1 @@ -1897,16 +1765,18 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |5: | cmp PC_RB, RDL // More results expected? | ja >6 - | // BASE and KBASE are assumed to be set for the calling frame. + | // Adjust BASE. KBASE is assumed to be set for the calling frame. + | movzx RA, PC_RA + | not RAa // Note: ~RA = -(RA+1) + | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8 | ins_next | |6: // Fill up results with nil. - | mov dword [RA+RD*8-12], LJ_TNIL + | mov dword [BASE+RD*8-12], LJ_TNIL | add RD, 1 | jmp <5 | |7: // Non-standard return case. - | mov BASE, RA | mov RAa, -8 // Results start at BASE+RA = BASE-8. | jmp ->vm_return | @@ -1948,10 +1818,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | fstp FPARG1 | .endif ||} - | mov TMP1, RA | mov RB, BASE | call extern lj_wrapper_ .. func - | mov RA, TMP1 | mov BASE, RB | .if X64 | jmp ->fff_resxmm0 @@ -1967,10 +1835,12 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |->ff_math_deg: if (sse) { |.ffunc_nsse math_rad + | mov CFUNC:RB, [BASE-8] | mulsd xmm0, qword CFUNC:RB->upvalue[0] | jmp ->fff_resxmm0 } else { |.ffunc_n math_rad + | mov CFUNC:RB, [BASE-8] | fmul qword CFUNC:RB->upvalue[0] | jmp ->fff_resn } @@ -1979,10 +1849,11 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.ffunc_nnr math_ldexp; fscale; fpop1; jmp ->fff_resn | |.ffunc_1 math_frexp - | mov RB, [RA+4] + | mov RB, [BASE+4] | cmp RB, LJ_TISNUM; ja ->fff_fallback - | mov RC, [RA] - | mov [RA-4], RB; mov [RA-8], RC + | mov PC, [BASE-4] + | mov RC, [BASE] + | mov [BASE-4], RB; mov [BASE-8], RC | shl RB, 1; cmp RB, 0xffe00000; jae >3 | or RC, RB; jz >3 | mov RC, 1022 @@ -1994,15 +1865,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) } else { | mov TMP1, RB; fild TMP1 } - | mov RB, [RA-4] + | mov RB, [BASE-4] | and RB, 0x800fffff // Mask off exponent. | or RB, 0x3fe00000 // Put mantissa in range [0.5,1) or 0. - | mov [RA-4], RB + | mov [BASE-4], RB |2: if (sse) { - | movsd qword [RA], xmm0 + | movsd qword [BASE], xmm0 } else { - | fstp qword [RA] + | fstp qword [BASE] } | mov RD, 1+2 | jmp ->fff_res @@ -2014,46 +1885,48 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) } |4: // Handle denormals by multiplying with 2^54 and adjusting the bias. if (sse) { - | movsd xmm0, qword [RA] + | movsd xmm0, qword [BASE] | sseconst_hi xmm1, RBa, 43500000 // 2^54. | mulsd xmm0, xmm1 - | movsd qword [RA-8], xmm0 + | movsd qword [BASE-8], xmm0 } else { - | fld qword [RA] + | fld qword [BASE] | mov TMP1, 0x5a800000; fmul TMP1 // x = x*2^54 - | fstp qword [RA-8] + | fstp qword [BASE-8] } - | mov RB, [RA-4]; mov RC, 1076; shl RB, 1; jmp <1 + | mov RB, [BASE-4]; mov RC, 1076; shl RB, 1; jmp <1 | if (sse) { |.ffunc_nsse math_modf } else { |.ffunc_n math_modf } - | mov RB, [RA+4] + | mov RB, [BASE+4] + | mov PC, [BASE-4] | shl RB, 1; cmp RB, 0xffe00000; je >4 // +-Inf? if (sse) { | movaps xmm4, xmm0 | call ->vm_trunc | subsd xmm4, xmm0 |1: - | movsd qword [RA-8], xmm0 - | movsd qword [RA], xmm4 + | movsd qword [BASE-8], xmm0 + | movsd qword [BASE], xmm4 } else { | fdup | call ->vm_trunc | fsub st1, st0 |1: - | fstp qword [RA-8] - | fstp qword [RA] + | fstp qword [BASE-8] + | fstp qword [BASE] } - | mov RC, [RA-4]; mov RB, [RA+4] + | mov RC, [BASE-4]; mov RB, [BASE+4] | xor RC, RB; js >3 // Need to adjust sign? |2: | mov RD, 1+2 | jmp ->fff_res |3: - | xor RB, 0x80000000; mov [RA+4], RB; jmp <2 // Flip sign of fraction. + | xor RB, 0x80000000; mov [BASE+4], RB // Flip sign of fraction. + | jmp <2 |4: if (sse) { | xorps xmm4, xmm4; jmp <1 // Return +-Inf and +-0. @@ -2079,8 +1952,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |1: | cmp RB, RD | jae ->fff_resxmm0 - | cmp dword [RA+RB*8-4], LJ_TISNUM; ja ->fff_fallback - | movsd xmm1, qword [RA+RB*8-8] + | cmp dword [BASE+RB*8-4], LJ_TISNUM; ja ->fff_fallback + | movsd xmm1, qword [BASE+RB*8-8] | sseop xmm0, xmm1 | add RB, 1 | jmp <1 @@ -2091,8 +1964,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |1: | cmp RB, RD | jae ->fff_resn - | cmp dword [RA+RB*8-4], LJ_TISNUM; ja >5 - | fld qword [RA+RB*8-8] + | cmp dword [BASE+RB*8-4], LJ_TISNUM; ja >5 + | fld qword [BASE+RB*8-8] ||if (cmov) { | fucomi st1; cmovop st1; fpop1 ||} else { @@ -2116,8 +1989,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |//-- String library ----------------------------------------------------- | |.ffunc_1 string_len - | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [RA] + | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback + | mov STR:RB, [BASE] if (sse) { | cvtsi2sd xmm0, dword STR:RB->len; jmp ->fff_resxmm0 } else { @@ -2125,9 +1998,10 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) } | |.ffunc string_byte // Only handle the 1-arg case here. - | cmp NARGS:RC, 1+1; jne ->fff_fallback - | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [RA] + | cmp NARGS:RD, 1+1; jne ->fff_fallback + | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback + | mov STR:RB, [BASE] + | mov PC, [BASE-4] | cmp dword STR:RB->len, 1 | jb ->fff_res0 // Return no results for empty string. | movzx RB, byte STR:RB[1] @@ -2139,14 +2013,14 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.ffunc string_char // Only handle the 1-arg case here. | ffgccheck - | cmp NARGS:RC, 1+1; jne ->fff_fallback // *Exactly* 1 arg. - | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback + | cmp NARGS:RD, 1+1; jne ->fff_fallback // *Exactly* 1 arg. + | cmp dword [BASE+4], LJ_TISNUM; ja ->fff_fallback if (sse) { - | cvtsd2si RC, qword [RA] + | cvtsd2si RC, qword [BASE] | cmp RC, 255; ja ->fff_fallback | mov TMP2, RC } else { - | fld qword [RA] + | fld qword [BASE] | fistp TMP2 | cmp TMP2, 255; ja ->fff_fallback } @@ -2156,7 +2030,6 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | mov ARG3, 1 |.endif | lea RDa, TMP2 // Points to stack. Little-endian. - | mov TMP1, RA // Save RA. |->fff_newstr: | mov L:RB, SAVE_L | mov L:RB->base, BASE @@ -2170,38 +2043,37 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.endif | mov SAVE_PC, PC | call extern lj_str_new // (lua_State *L, char *str, size_t l) - | // GCstr * returned in eax (RC). - | mov RA, TMP1 + | // GCstr * returned in eax (RD). | mov BASE, L:RB->base - | mov dword [RA-4], LJ_TSTR - | mov [RA-8], STR:RC + | mov PC, [BASE-4] + | mov dword [BASE-4], LJ_TSTR + | mov [BASE-8], STR:RD | jmp ->fff_res1 | |.ffunc string_sub | ffgccheck - | mov TMP1, RA // Save RA. | mov TMP2, -1 - | cmp NARGS:RC, 1+2; jb ->fff_fallback + | cmp NARGS:RD, 1+2; jb ->fff_fallback | jna >1 - | cmp dword [RA+20], LJ_TISNUM; ja ->fff_fallback + | cmp dword [BASE+20], LJ_TISNUM; ja ->fff_fallback if (sse) { - | cvtsd2si RB, qword [RA+16] + | cvtsd2si RB, qword [BASE+16] | mov TMP2, RB } else { - | fld qword [RA+16] + | fld qword [BASE+16] | fistp TMP2 } |1: - | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback - | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback - | mov STR:RB, [RA] + | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback + | cmp dword [BASE+12], LJ_TISNUM; ja ->fff_fallback + | mov STR:RB, [BASE] | mov TMP3, STR:RB | mov RB, STR:RB->len if (sse) { - | cvtsd2si RA, qword [RA+8] + | cvtsd2si RA, qword [BASE+8] } else { |.if not X64 - | fld qword [RA+8] + | fld qword [BASE+8] | fistp ARG3 | mov RA, ARG3 |.endif @@ -2250,14 +2122,13 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.ffunc_2 string_rep // Only handle the 1-char case inline. | ffgccheck - | mov TMP1, RA // Save RA. - | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback - | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback - | mov STR:RB, [RA] + | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback + | cmp dword [BASE+12], LJ_TISNUM; ja ->fff_fallback + | mov STR:RB, [BASE] if (sse) { - | cvtsd2si RC, qword [RA+8] + | cvtsd2si RC, qword [BASE+8] } else { - | fld qword [RA+8] + | fld qword [BASE+8] | fistp TMP2 | mov RC, TMP2 } @@ -2284,9 +2155,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.ffunc_1 string_reverse | ffgccheck - | mov TMP1, RA // Save RA. - | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [RA] + | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback + | mov STR:RB, [BASE] | mov RC, STR:RB->len | test RC, RC | jz ->fff_emptystr // Zero length string? @@ -2312,9 +2182,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.macro ffstring_case, name, lo, hi | .ffunc_1 name | ffgccheck - | mov TMP1, RA // Save RA. - | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback - | mov STR:RB, [RA] + | cmp dword [BASE+4], LJ_TSTR; jne ->fff_fallback + | mov STR:RB, [BASE] | mov RC, STR:RB->len | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 | add RB, #STR @@ -2349,19 +2218,17 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |//-- Table library ------------------------------------------------------ | |.ffunc_1 table_getn - | cmp dword [RA+4], LJ_TTAB; jne ->fff_fallback - | mov TMP1, BASE // Save RA and BASE. - | mov RB, RA - | mov TAB:FCARG1, [RA] // Caveat: FCARG1 == RA + | cmp dword [BASE+4], LJ_TTAB; jne ->fff_fallback + | mov RB, BASE // Save BASE. + | mov TAB:FCARG1, [BASE] | call extern lj_tab_len@4 // LJ_FASTCALL (GCtab *t) - | // Length of table returned in eax (RC). - | mov RA, RB // Restore RA and BASE. - | mov BASE, TMP1 + | // Length of table returned in eax (RD). + | mov BASE, RB // Restore BASE. if (sse) { - | cvtsi2sd xmm0, RC; jmp ->fff_resxmm0 + | cvtsi2sd xmm0, RD; jmp ->fff_resxmm0 } else { |.if not X64 - | mov ARG1, RC; fild ARG1; jmp ->fff_resn + | mov ARG1, RD; fild ARG1; jmp ->fff_resn |.endif } | @@ -2406,29 +2273,26 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |.macro .ffunc_bit_op, name, ins | .ffunc_bit name - | mov TMP2, NARGS:RC // Save for fallback. - | lea RC, [RA+NARGS:RC*8-16] - ||if (sse) { - | mov TMP1, BASE // Need BASE as a scratch register. - ||} + | mov TMP2, NARGS:RD // Save for fallback. + | lea RD, [BASE+NARGS:RD*8-16] |1: - | cmp RC, RA - | jbe ->fff_resbit_op - | cmp dword [RC+4], LJ_TISNUM; ja ->fff_fallback_bit_op + | cmp RD, BASE + | jbe ->fff_resbit + | cmp dword [RD+4], LJ_TISNUM; ja ->fff_fallback_bit_op ||if (sse) { - | movsd xmm0, qword [RC] + | movsd xmm0, qword [RD] | addsd xmm0, xmm1 - | movd BASE, xmm0 - | ins RB, BASE + | movd RA, xmm0 + | ins RB, RA ||} else { |.if not X64 - | fld qword [RC] + | fld qword [RD] | fadd TMP1 | fstp FPARG1 | ins RB, ARG1 |.endif ||} - | sub RC, 8 + | sub RD, 8 | jmp <1 |.endmacro | @@ -2446,14 +2310,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |->fff_resbit: | cvtsi2sd xmm0, RB | jmp ->fff_resxmm0 - |->fff_resbit_op: - | cvtsi2sd xmm0, RB - | mov BASE, TMP1 - | jmp ->fff_resxmm0 } else { |.if not X64 |->fff_resbit: - |->fff_resbit_op: | mov ARG1, RB | fild ARG1 | jmp ->fff_resn @@ -2461,10 +2320,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) } | |->fff_fallback_bit_op: - if (sse) { - | mov BASE, TMP1 - } - | mov NARGS:RC, TMP2 // Restore for fallback + | mov NARGS:RD, TMP2 // Restore for fallback | jmp ->fff_fallback | |.macro .ffunc_bit_sh, name, ins @@ -2503,86 +2359,80 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |//----------------------------------------------------------------------- | |->fff_fallback_2: - | mov NARGS:RC, 1+2 // Other args are ignored, anyway. + | mov NARGS:RD, 1+2 // Other args are ignored, anyway. | jmp ->fff_fallback |->fff_fallback_1: - | mov NARGS:RC, 1+1 // Other args are ignored, anyway. + | mov NARGS:RD, 1+1 // Other args are ignored, anyway. |->fff_fallback: // Call fast function fallback handler. - | // RA = new base, RC = nargs+1 + | // BASE = new base, RD = nargs+1 | mov L:RB, SAVE_L - | sub BASE, RA - | mov [RA-4], PC + | mov PC, [BASE-4] // Fallback may overwrite PC. | mov SAVE_PC, PC // Redundant (but a defined value). - | mov TMP1, BASE // Save old BASE (relative). - | mov L:RB->base, RA - | lea RC, [RA+NARGS:RC*8-8] - | lea BASE, [RC+8*LUA_MINSTACK] // Ensure enough space for handler. - | mov L:RB->top, RC - | mov CFUNC:RC, [RA-8] - | cmp BASE, L:RB->maxstack + | mov L:RB->base, BASE + | lea RD, [BASE+NARGS:RD*8-8] + | lea RA, [RD+8*LUA_MINSTACK] // Ensure enough space for handler. + | mov L:RB->top, RD + | mov CFUNC:RD, [BASE-8] + | cmp RA, L:RB->maxstack | ja >5 // Need to grow stack. |.if X64 | mov CARG1d, L:RB |.else | mov ARG1, L:RB |.endif - | call aword CFUNC:RC->f // (lua_State *L) + | call aword CFUNC:RD->f // (lua_State *L) + | mov BASE, L:RB->base | // Either throws an error or recovers and returns 0 or MULTRES (+1). - | test RC, RC; jnz >3 + | test RD, RD; jnz ->fff_res // Returned MULTRES (already in RD). |1: // Returned 0: retry fast path. - | mov RA, L:RB->base - | mov RC, L:RB->top - | sub RC, RA - | shr RC, 3 - | add NARGS:RC, 1 - | mov LFUNC:RB, [RA-8] - | mov BASE, TMP1 // Restore old BASE. - | add BASE, RA - | cmp [RA-4], PC; jne >2 // Callable modified by handler? - | jmp aword LFUNC:RB->gate // Retry the call. + | mov RD, L:RB->top + | sub RD, BASE + | shr RD, 3 + | add NARGS:RD, 1 + | mov LFUNC:RB, [BASE-8] + | cmp dword [BASE-4], PC + | jne >2 // Tailcalled? + | ins_callt // Retry the call. | - |2: // Run modified callable. - | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call - | jmp aword LFUNC:RB->gate // Retry the call. - | - |3: // Returned MULTRES (already in RC/RD). - | mov RA, L:RB->base - | mov BASE, TMP1 // Restore old BASE. - | add BASE, RA - | jmp ->fff_res + |2: // Reconstruct previous base for vmeta_call. + | mov RA, BASE + | test PC, FRAME_TYPE + | jnz >3 + | movzx RB, PC_RA + | not RBa // Note: ~RB = -(RB+1) + | lea BASE, [BASE+RB*8] // base = base - (RB+1)*8 + | jmp ->vm_call_dispatch // Resolve again. + |3: + | mov RB, PC + | and RB, -8 + | sub BASE, RB + | jmp ->vm_call_dispatch // Resolve again. | |5: // Grow stack for fallback handler. | mov FCARG2, LUA_MINSTACK | mov FCARG1, L:RB | call extern lj_state_growstack@8 // (lua_State *L, int n) + | mov BASE, L:RB->base | jmp <1 // Dumb retry (goes through ff first). | |->fff_gcstep: // Call GC step function. - | // RA = new base, RC = nargs+1 + | // BASE = new base, RD = nargs+1 | pop RBa // Must keep stack at same level. | mov TMPa, RBa // Save return address | mov L:RB, SAVE_L - | sub BASE, RA - | mov TMP2, BASE // Save old BASE (relative). - | mov [RA-4], PC | mov SAVE_PC, PC // Redundant (but a defined value). - | mov L:RB->base, RA - | lea RC, [RA+NARGS:RC*8-8] + | mov L:RB->base, BASE + | lea RD, [BASE+NARGS:RD*8-8] | mov FCARG1, L:RB - | mov L:RB->top, RC + | mov L:RB->top, RD | call extern lj_gc_step@4 // (lua_State *L) - | mov RA, L:RB->base - | mov RC, L:RB->top - | sub RC, RA - | shr RC, 3 - | add NARGS:RC, 1 - | mov PC, [RA-4] - | mov BASE, TMP2 // Restore old BASE. - | add BASE, RA + | mov BASE, L:RB->base + | mov RD, L:RB->top + | sub RD, BASE + | shr RD, 3 + | add NARGS:RD, 1 | mov RBa, TMPa | push RBa // Restore return address. - | mov LFUNC:RB, [RA-8] | ret | |//----------------------------------------------------------------------- @@ -2629,9 +2479,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | movzx OP, PC_OP | movzx RD, PC_RD |.if X64 - | jmp aword [DISPATCH+OP*8+BC__MAX*8] // Re-dispatch to static ins. + | jmp aword [DISPATCH+OP*8+GG_DISP2STATIC] // Re-dispatch to static ins. |.else - | jmp aword [DISPATCH+OP*4+BC__MAX*4] // Re-dispatch to static ins. + | jmp aword [DISPATCH+OP*4+GG_DISP2STATIC] // Re-dispatch to static ins. |.endif | |->cont_hook: // Continue from hook yield. @@ -2645,8 +2495,13 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.if X64 | int3 // NYI |.else + | mov LFUNC:RB, [BASE-8] // Same as curr_topL(L). + | mov RB, LFUNC:RB->pc + | movzx RD, byte [RB+PC2PROTO(framesize)] + | lea RD, [BASE+RD*8] | mov L:RB, SAVE_L | mov L:RB->base, BASE + | mov L:RB->top, RD | mov FCARG2, PC | lea FCARG1, [DISPATCH+GG_DISP2J] | mov [DISPATCH+DISPATCH_J(L)], L:RB @@ -2661,16 +2516,22 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) |.if X64 | int3 // NYI |.else + | lea RD, [BASE+NARGS:RD*8-8] | mov L:RB, SAVE_L | mov L:RB->base, BASE + | mov L:RB->top, RD | mov FCARG2, PC | lea FCARG1, [DISPATCH+GG_DISP2J] | mov [DISPATCH+DISPATCH_J(L)], L:RB | mov SAVE_PC, PC | call extern lj_trace_hot@8 // (jit_State *J, const BCIns *pc) | mov BASE, L:RB->base - | // Dispatch the first instruction and optionally record it. - | ins_next + | mov RD, L:RB->top + | sub RD, BASE + | shr RD, 3 + | add NARGS:RD, 1 + | mov LFUNC:RB, [BASE-8] + | ins_callt |.endif #endif | @@ -4403,13 +4264,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_CALL: case BC_CALLM: | ins_A_C // RA = base, (RB = nresults+1,) RC = nargs+1 | extra_nargs if (op == BC_CALLM) { - | add NARGS:RC, MULTRES + | add NARGS:RD, MULTRES } - | lea RA, [BASE+RA*8+8] - | mov LFUNC:RB, [RA-8] - | cmp dword [RA-4], LJ_TFUNC - | jne ->vmeta_call - | jmp aword LFUNC:RB->gate + | cmp dword [BASE+RA*8+4], LJ_TFUNC + | mov LFUNC:RB, [BASE+RA*8] + | jne ->vmeta_call_ra + | lea BASE, [BASE+RA*8+8] + | ins_call break; case BC_CALLMT: @@ -4445,20 +4306,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | | mov LFUNC:RB, [BASE-8] |3: - | mov RA, BASE // BASE is ignored, except when ... + | mov NARGS:RD, MULTRES | cmp byte LFUNC:RB->ffid, 1 // (> FF_C) Calling a fast function? | ja >5 |4: - | mov NARGS:RD, MULTRES - | jmp aword LFUNC:RB->gate + | ins_callt | |5: // Tailcall to a fast function. | test PC, FRAME_TYPE // Lua frame below? | jnz <4 - | movzx RD, PC_RA // Need to prepare BASE/KBASE. - | not RDa - | lea BASE, [BASE+RD*8] - | mov LFUNC:KBASE, [BASE-8] + | movzx RA, PC_RA + | not RAa + | lea RA, [BASE+RA*8] + | mov LFUNC:KBASE, [RA-8] // Need to prepare KBASE. | mov KBASE, LFUNC:KBASE->pc | mov KBASE, [KBASE+PC2PROTO(k)] | jmp <4 @@ -4488,9 +4348,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | mov [RA-8], LFUNC:RB | mov [RA-4], RC | cmp RC, LJ_TFUNC // Handle like a regular 2-arg call. - | mov NARGS:RC, 3 + | mov NARGS:RD, 2+1 | jne ->vmeta_call - | jmp aword LFUNC:RB->gate + | mov BASE, RA + | ins_call break; case BC_VARG: @@ -4799,6 +4660,150 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | ins_next break; + /* -- Function headers -------------------------------------------------- */ + + /* + ** Reminder: A function may be called with func/args above L->maxstack, + ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot, + ** too. This means all FUNC* ops (including fast functions) must check + ** for stack overflow _before_ adding more slots! + */ + + case BC_FUNCF: +#if LJ_HASJIT + | // NYI: Disabled, until the tracer supports recursion/upcalls/leaves. + | // hotcall RB +#endif + case BC_FUNCV: /* NYI: compiled vararg functions. */ + | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow and ins_AD is a no-op. + break; + + case BC_JFUNCF: +#if !LJ_HASJIT + break; +#endif + case BC_IFUNCF: + | ins_AD // BASE = new base, RA = framesize, RD = nargs+1 + | mov KBASE, [PC-4+PC2PROTO(k)] + | mov L:RB, SAVE_L + | lea RA, [BASE+RA*8] // Top of frame. + | cmp RA, L:RB->maxstack + | ja ->vm_growstack_f + | movzx RA, byte [PC-4+PC2PROTO(numparams)] + | cmp NARGS:RD, RA // Check for missing parameters. + | jbe >3 + |2: + if (op == BC_JFUNCF) { + | movzx RD, PC_RD + | jmp =>BC_JLOOP + } else { + | ins_next + } + | + |3: // Clear missing parameters. + | mov dword [BASE+NARGS:RD*8-4], LJ_TNIL + | add NARGS:RD, 1 + | cmp NARGS:RD, RA + | jbe <3 + | jmp <2 + break; + + case BC_JFUNCV: +#if !LJ_HASJIT + break; +#endif + | int3 // NYI: compiled vararg functions + break; /* NYI: compiled vararg functions. */ + + case BC_IFUNCV: + | ins_AD // BASE = new base, RA = framesize, RD = nargs+1 + | lea RB, [NARGS:RD*8+FRAME_VARG] + | lea RD, [BASE+NARGS:RD*8] + | mov LFUNC:KBASE, [BASE-8] + | mov [RD-4], RB // Store delta + FRAME_VARG. + | mov [RD-8], LFUNC:KBASE // Store copy of LFUNC. + | mov L:RB, SAVE_L + | lea RA, [RD+RA*8] + | cmp RA, L:RB->maxstack + | ja ->vm_growstack_v // Need to grow stack. + | mov RA, BASE + | mov BASE, RD + | movzx RB, byte [PC-4+PC2PROTO(numparams)] + | test RB, RB + | jz >2 + |1: // Copy fixarg slots up to new frame. + | add RA, 8 + | cmp RA, BASE + | jnb >3 // Less args than parameters? + | mov KBASE, [RA-8] + | mov [RD], KBASE + | mov KBASE, [RA-4] + | mov [RD+4], KBASE + | add RD, 8 + | mov dword [RA-4], LJ_TNIL // Clear old fixarg slot (help the GC). + | sub RB, 1 + | jnz <1 + |2: + if (op == BC_JFUNCV) { + | movzx RD, PC_RD + | jmp =>BC_JLOOP + } else { + | mov KBASE, [PC-4+PC2PROTO(k)] + | ins_next + } + | + |3: // Clear missing parameters. + | mov dword [RD+4], LJ_TNIL + | add RD, 8 + | sub RB, 1 + | jnz <3 + | jmp <2 + break; + + case BC_FUNCC: + case BC_FUNCCW: + | ins_AD // BASE = new base, RA = ins RA|RD (unused), RD = nargs+1 + | mov CFUNC:RB, [BASE-8] + | mov KBASEa, CFUNC:RB->f + | mov L:RB, SAVE_L + | lea RD, [BASE+NARGS:RD*8-8] + | mov L:RB->base, BASE + | lea RA, [RD+8*LUA_MINSTACK] + | cmp RA, L:RB->maxstack + | mov L:RB->top, RD + if (op == BC_FUNCC) { + |.if X64 + | mov CARG1d, L:RB // Caveat: CARG1d may be RA. + |.else + | mov ARG1, L:RB + |.endif + } else { + |.if X64 + | mov CARG2, KBASEa + | mov CARG1d, L:RB // Caveat: CARG1d may be RA. + |.else + | mov ARG2, KBASEa + | mov ARG1, L:RB + |.endif + } + | ja ->vm_growstack_c // Need to grow stack. + | set_vmstate C + if (op == BC_FUNCC) { + | call KBASEa // (lua_State *L) + } else { + | // (lua_State *L, lua_CFunction f) + | call aword [DISPATCH+DISPATCH_GL(wrapf)] + } + | set_vmstate INTERP + | // nresults returned in eax (RD). + | mov BASE, L:RB->base + | lea RA, [BASE+RD*8] + | neg RA + | add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 + | mov PC, [BASE-4] // Fetch PC of caller. + | jmp ->vm_returnc + break; + /* ---------------------------------------------------------------------- */ default: diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h index 6fd8eb00..f50d16b8 100644 --- a/src/buildvm_x86.h +++ b/src/buildvm_x86.h @@ -12,575 +12,557 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned char build_actionlist[15199] = { - 254,1,248,10,137,202,137,114,252,252,139,181,233,15,182,142,233,139,190,233, - 139,108,36,48,141,12,202,59,141,233,15,135,244,11,15,182,142,233,57,200,15, - 134,244,249,248,2,255,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252, - 255,36,171,248,3,199,68,194,252,252,237,131,192,1,57,200,15,134,244,3,252, - 233,244,2,248,12,137,113,252,252,141,52,197,237,141,148,253,49,233,137,106, - 252,248,137,114,252,252,139,181,233,15,182,174,233,141,60,252,234,139,108, - 36,48,59,189,233,15,135,244,13,137,208,15,182,174,233,133,252,237,15,132, - 244,248,248,1,131,193,8,57,209,15,131,244,249,255,139,121,252,248,137,56, - 139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15,133, - 244,1,248,2,139,190,233,255,139,6,15,182,204,15,182,232,131,198,4,193,232, - 16,252,255,36,171,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244,3, - 252,233,244,2,248,14,137,113,252,252,139,189,233,139,108,36,48,141,68,193, - 252,248,137,141,233,141,136,233,137,133,233,59,141,233,137,124,36,4,137,44, - 36,15,135,244,15,199,131,233,237,252,255,147,233,199,131,233,237,139,149, - 233,255,141,12,194,252,247,217,3,141,233,248,16,131,192,1,137,68,36,20,252, - 247,198,237,15,132,244,17,252,233,244,18,248,19,137,113,252,252,139,189,233, - 139,108,36,48,141,68,193,252,248,137,141,233,141,136,233,137,133,233,59,141, - 233,137,44,36,15,135,244,15,199,131,233,237,252,255,215,199,131,233,237,139, - 149,233,255,141,12,194,252,247,217,3,141,233,248,16,131,192,1,137,68,36,20, - 252,247,198,237,15,132,244,17,248,18,252,247,198,237,15,132,244,20,199,131, - 233,237,131,230,252,248,41,214,252,247,222,131,232,1,15,132,244,248,248,1, - 139,44,10,137,106,252,248,139,108,10,4,137,106,252,252,131,194,8,131,232, - 1,15,133,244,1,248,2,139,108,36,48,137,181,233,248,3,139,68,36,20,139,76, - 36,56,248,4,255,57,193,15,133,244,252,248,5,131,252,234,8,137,149,233,248, - 21,139,76,36,52,137,141,233,49,192,248,22,131,196,28,91,94,95,93,195,248, +static const unsigned char build_actionlist[15137] = { + 254,1,248,10,252,247,198,237,15,132,244,11,131,230,252,248,41,252,242,141, + 76,49,252,248,139,114,252,252,199,68,10,4,237,248,12,131,192,1,137,68,36, + 20,252,247,198,237,15,132,244,13,248,14,252,247,198,237,15,132,244,10,199, + 131,233,237,131,230,252,248,41,214,252,247,222,131,232,1,15,132,244,248,248, + 1,139,44,10,137,106,252,248,139,108,10,4,137,106,252,252,131,194,8,131,232, + 1,15,133,244,1,248,2,255,139,108,36,48,137,181,233,248,3,139,68,36,20,139, + 76,36,56,248,4,57,193,15,133,244,252,248,5,131,252,234,8,137,149,233,248, + 15,139,76,36,52,137,141,233,49,192,248,16,131,196,28,91,94,95,93,195,248, 6,15,130,244,253,59,149,233,15,135,244,254,199,66,252,252,237,131,194,8,131, - 192,1,252,233,244,4,248,7,133,201,15,132,244,5,41,193,141,20,202,252,233, - 244,5,248,8,255,137,149,233,137,68,36,20,137,202,137,252,233,232,251,1,0, - 139,149,233,252,233,244,3,248,23,137,208,137,204,248,24,139,108,36,48,139, - 173,233,199,133,233,237,252,233,244,22,248,25,129,225,239,137,204,248,26, - 139,108,36,48,185,252,248,252,255,252,255,252,255,184,237,139,149,233,139, - 157,233,129,195,239,139,114,252,252,199,66,252,252,237,199,131,233,237,255, - 252,233,244,16,248,20,252,247,198,237,15,132,244,27,131,230,252,248,41,252, - 242,141,76,49,252,248,139,114,252,252,199,68,10,4,237,252,233,244,16,248, - 15,186,237,252,233,244,247,248,13,137,202,248,11,141,68,194,252,248,15,182, - 142,233,131,198,4,137,149,233,137,133,233,137,116,36,24,137,202,248,1,137, - 252,233,232,251,1,0,139,141,233,255,139,133,233,139,105,252,248,139,113,252, - 252,41,200,193,232,3,131,192,1,252,255,165,233,248,28,85,87,86,83,131,252, - 236,28,139,108,36,48,139,76,36,52,190,237,49,192,141,188,253,36,233,139,157, - 233,129,195,239,137,189,233,137,68,36,24,137,68,36,52,56,133,233,15,132,244, - 249,199,131,233,237,136,133,233,139,149,233,139,133,233,41,200,193,232,3, - 131,192,1,41,209,139,114,252,252,137,68,36,20,252,247,198,237,15,132,244, - 17,252,233,244,18,248,29,255,85,87,86,83,131,252,236,28,190,237,252,233,244, - 247,248,30,85,87,86,83,131,252,236,28,190,237,248,1,139,108,36,48,139,76, - 36,52,248,2,139,189,233,137,124,36,52,137,108,36,24,137,165,233,139,157,233, - 129,195,239,248,3,199,131,233,237,139,149,233,1,206,41,214,139,133,233,41, - 200,193,232,3,131,192,1,139,105,252,248,129,121,253,252,252,239,15,133,244, - 31,252,255,165,233,248,32,255,85,87,86,83,131,252,236,28,139,108,36,48,139, - 68,36,56,139,76,36,52,139,84,36,60,137,108,36,24,139,189,233,43,189,233,199, - 68,36,60,0,0,0,0,137,124,36,56,137,68,36,8,137,76,36,4,137,44,36,139,189, - 233,137,124,36,52,137,165,233,252,255,210,133,192,15,132,244,21,137,193,190, - 237,252,233,244,2,248,27,1,209,131,230,252,248,137,213,41,252,242,199,68, - 193,252,252,237,137,200,139,117,252,244,139,77,252,240,139,122,252,248,139, - 191,233,139,191,233,252,255,225,248,33,15,182,78,252,255,131,252,237,16,141, - 12,202,41,252,233,15,132,244,34,252,247,217,193,252,233,3,137,76,36,8,139, - 72,4,139,0,137,77,4,137,69,0,137,108,36,4,252,233,244,35,248,36,137,68,36, - 16,199,68,36,20,237,255,141,68,36,16,128,126,252,252,235,15,133,244,247,141, - 139,233,137,41,199,65,4,237,137,205,252,233,244,248,248,37,15,182,70,252, - 254,255,252,242,15,42,192,252,242,15,17,68,36,16,255,137,68,36,12,219,68, - 36,12,221,92,36,16,255,141,68,36,16,252,233,244,247,248,38,15,182,70,252, - 254,141,4,194,248,1,15,182,110,252,255,141,44,252,234,248,2,137,108,36,4, - 139,108,36,48,137,68,36,8,137,44,36,137,149,233,137,116,36,24,232,251,1,1, - 139,149,233,133,192,15,132,244,249,248,34,15,182,78,252,253,139,104,4,139, - 0,137,108,202,4,137,4,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16, - 252,255,36,171,248,3,139,141,233,137,113,252,244,141,177,233,41,214,139,105, - 252,248,184,3,0,0,0,252,255,165,233,248,39,137,68,36,16,199,68,36,20,237, - 141,68,36,16,128,126,252,252,235,15,133,244,247,141,139,233,255,137,41,199, - 65,4,237,137,205,252,233,244,248,248,40,15,182,70,252,254,255,141,68,36,16, - 252,233,244,247,248,41,15,182,70,252,254,141,4,194,248,1,15,182,110,252,255, - 141,44,252,234,248,2,137,108,36,4,139,108,36,48,137,68,36,8,137,44,36,137, - 149,233,137,116,36,24,232,251,1,2,139,149,233,133,192,15,132,244,249,15,182, - 78,252,253,139,108,202,4,139,12,202,137,104,4,137,8,248,42,139,6,15,182,204, - 15,182,232,131,198,4,193,232,16,252,255,36,171,248,3,139,141,233,137,113, - 252,244,15,182,70,252,253,139,108,194,4,139,4,194,137,105,20,137,65,16,141, - 177,233,41,214,139,105,252,248,184,4,0,0,0,252,255,165,233,248,43,15,182, - 110,252,252,141,4,194,141,12,202,137,108,36,12,139,108,36,48,137,68,36,8, - 137,76,36,4,137,44,36,137,149,233,137,116,36,24,232,251,1,3,248,3,139,149, - 233,131,252,248,1,15,135,244,44,248,4,255,141,118,4,15,130,244,252,248,5, - 15,183,70,252,254,141,180,253,134,233,248,6,139,6,15,182,204,15,182,232,131, - 198,4,193,232,16,252,255,36,171,248,45,131,198,4,129,120,253,4,239,15,130, - 244,5,252,233,244,6,248,46,129,120,253,4,239,252,233,244,4,248,47,131,252, - 238,4,137,108,36,12,139,108,36,48,137,68,36,8,137,76,36,4,137,44,36,137,149, - 233,137,116,36,24,232,251,1,4,252,233,244,3,248,48,255,141,4,199,252,233, - 244,247,248,49,141,4,199,141,44,252,234,149,252,233,244,248,248,50,141,4, - 194,137,197,252,233,244,248,248,51,141,4,194,248,1,141,44,252,234,248,2,141, - 12,202,137,108,36,8,139,108,36,48,137,68,36,12,15,182,70,252,252,137,76,36, - 4,137,68,36,16,137,44,36,137,149,233,137,116,36,24,232,251,1,5,139,149,233, - 133,192,15,132,244,42,248,44,137,193,41,208,137,113,252,244,141,176,233,139, - 105,252,248,184,3,0,0,0,129,121,253,252,252,239,15,133,244,31,255,252,255, - 165,233,248,52,139,108,36,48,137,149,233,141,20,194,137,252,233,137,116,36, - 24,232,251,1,6,139,149,233,252,233,244,44,248,31,137,76,36,20,137,68,36,16, - 131,252,233,8,141,4,193,139,108,36,48,137,76,36,4,137,68,36,8,137,44,36,137, - 149,233,137,116,36,24,232,251,1,7,139,149,233,139,76,36,20,139,68,36,16,139, - 105,252,248,131,192,1,57,215,15,132,244,53,252,255,165,233,248,54,139,108, - 36,48,137,149,233,137,202,137,252,233,137,116,36,24,232,251,1,8,139,149,233, - 139,70,252,252,15,182,204,15,182,232,193,232,16,252,255,164,253,171,233,248, - 55,129,252,248,239,15,130,244,56,255,139,105,4,129,252,253,239,15,131,244, - 56,137,68,36,20,137,105,252,252,139,41,137,105,252,248,131,232,2,15,132,244, - 248,137,76,36,16,248,1,131,193,8,139,105,4,137,105,252,252,139,41,137,105, - 252,248,131,232,1,15,133,244,1,139,76,36,16,248,2,139,68,36,20,252,233,244, - 57,248,58,129,252,248,239,15,130,244,56,139,105,4,184,237,252,247,213,57, - 232,255,15,71,197,255,15,134,244,247,137,232,248,1,255,139,105,252,248,139, - 132,253,197,233,199,65,252,252,237,137,65,252,248,252,233,244,59,248,60,129, - 252,248,239,15,130,244,56,139,105,4,129,252,253,239,15,133,244,252,248,1, - 139,41,139,173,233,248,2,133,252,237,199,65,252,252,237,15,132,244,59,139, - 65,252,248,139,131,233,199,65,252,252,237,137,105,252,248,137,76,36,16,139, - 141,233,255,35,136,233,105,201,239,3,141,233,248,3,129,185,233,239,15,133, - 244,250,57,129,233,15,132,244,251,248,4,139,137,233,133,201,15,133,244,3, - 252,233,244,59,248,5,139,105,4,129,252,253,239,15,132,244,59,255,139,1,139, - 76,36,16,137,105,252,252,137,65,252,248,252,233,244,59,248,6,129,252,253, - 239,15,132,244,1,129,252,253,239,15,135,244,253,189,237,248,7,252,247,213, - 139,172,253,171,233,252,233,244,2,248,61,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,133,244,56,255,139,41,131,189,233,0,15,133,244,56,129,121, - 253,12,239,15,133,244,56,139,65,8,137,133,233,199,65,252,252,237,137,105, - 252,248,252,246,133,233,235,15,132,244,247,128,165,233,235,139,131,233,137, - 171,233,137,133,233,248,1,252,233,244,59,248,62,255,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,133,244,56,139,1,139,108,36,48,137,68,36,4,137, - 44,36,137,205,137,84,36,16,131,193,8,137,76,36,8,232,251,1,9,137,252,233, - 139,84,36,16,139,40,139,64,4,137,105,252,248,137,65,252,252,252,233,244,59, - 248,63,129,252,248,239,15,133,244,56,129,121,253,4,239,15,135,244,56,255, - 252,242,15,16,1,252,233,244,64,255,221,1,252,233,244,65,255,248,66,129,252, - 248,239,15,130,244,56,129,121,253,4,239,15,133,244,249,139,1,248,2,199,65, - 252,252,237,137,65,252,248,252,233,244,59,248,3,129,121,253,4,239,15,135, - 244,56,131,187,233,0,15,133,244,56,139,171,233,59,171,233,255,15,130,244, - 247,232,244,67,248,1,139,108,36,48,137,141,233,137,113,252,252,137,116,36, - 24,137,84,36,16,137,202,137,252,233,232,251,1,10,139,141,233,139,84,36,16, - 252,233,244,2,248,68,129,252,248,239,15,130,244,56,15,132,244,248,248,1,129, - 121,253,4,239,15,133,244,56,139,41,137,108,36,4,139,108,36,48,137,44,36,137, - 141,233,255,137,113,252,252,137,84,36,16,131,193,8,137,76,36,8,137,116,36, - 24,232,251,1,11,139,141,233,139,84,36,16,133,192,15,132,244,249,139,105,8, - 139,65,12,137,105,252,248,137,65,252,252,139,105,16,139,65,20,137,41,137, - 65,4,248,69,184,237,252,233,244,70,248,2,199,65,12,237,252,233,244,1,248, - 3,199,65,252,252,237,252,233,244,59,248,71,129,252,248,239,15,130,244,56, - 129,121,253,4,239,255,15,133,244,56,139,133,233,199,65,252,252,237,137,65, - 252,248,199,65,12,237,184,237,252,233,244,70,248,72,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,133,244,56,129,121,253,12,239,15,135,244,56,255, - 252,242,15,16,65,8,189,0,0,252,240,63,102,15,110,205,102,15,112,201,81,252, - 242,15,88,193,252,242,15,45,192,252,242,15,17,65,252,248,255,221,65,8,217, - 232,222,193,219,20,36,221,89,252,248,139,4,36,255,139,41,59,133,233,15,131, - 244,248,193,224,3,3,133,233,248,1,129,120,253,4,239,15,132,244,73,139,40, - 139,64,4,137,41,137,65,4,252,233,244,69,248,2,131,189,233,0,15,132,244,73, - 137,84,36,16,135,205,137,194,232,251,1,12,137,252,233,139,84,36,16,133,192, - 15,133,244,1,248,73,184,237,252,233,244,70,248,74,255,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,133,244,56,139,133,233,199,65,252,252,237, - 137,65,252,248,255,15,87,192,252,242,15,17,65,8,255,217,252,238,221,89,8, - 255,184,237,252,233,244,70,248,75,129,252,248,239,15,130,244,56,137,113,252, - 252,190,237,137,202,131,193,8,131,232,1,139,105,252,248,248,1,252,246,131, - 233,235,15,133,244,249,248,2,129,121,253,252,252,239,15,133,244,31,252,255, - 165,233,248,3,131,198,1,252,233,244,2,248,76,255,129,252,248,239,15,130,244, - 56,129,121,253,12,239,15,133,244,56,137,113,252,252,139,105,4,137,105,12, - 199,65,4,237,139,41,139,113,8,137,105,8,137,49,190,237,137,202,129,193,239, - 131,232,2,252,233,244,1,248,9,139,116,36,24,252,233,244,56,248,77,129,252, - 248,239,15,130,244,56,139,41,137,113,252,252,137,116,36,24,137,44,36,129, - 121,253,4,239,15,133,244,9,255,131,189,233,0,15,133,244,9,128,189,233,235, - 15,135,244,9,139,181,233,137,116,36,4,15,132,244,247,59,181,233,15,132,244, - 9,248,1,141,116,198,252,240,59,181,233,15,135,244,9,137,181,233,139,108,36, - 48,137,141,233,131,193,8,137,141,233,255,139,108,36,4,141,76,193,232,41,252, - 241,57,252,238,15,132,244,249,248,2,139,68,14,4,137,70,252,252,139,4,14,137, - 70,252,248,131,252,238,8,57,252,238,15,133,244,2,248,3,49,201,137,76,36,12, - 137,76,36,8,232,244,28,199,131,233,237,139,108,36,48,139,52,36,139,149,233, - 129,252,248,239,15,135,244,254,248,4,139,142,233,139,190,233,137,142,233, - 137,252,254,41,206,15,132,244,252,255,141,4,50,193,252,238,3,59,133,233,15, - 135,244,255,137,213,41,205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131, - 193,8,57,252,249,15,133,244,5,248,6,141,70,2,199,66,252,252,237,248,7,139, - 116,36,24,137,68,36,20,185,252,248,252,255,252,255,252,255,252,247,198,237, - 15,132,244,17,252,233,244,18,248,8,199,66,252,252,237,139,142,233,131,252, - 233,8,137,142,233,139,1,137,2,139,65,4,137,66,4,184,237,252,233,244,7,248, - 9,255,139,12,36,137,185,233,137,252,242,137,252,233,232,251,1,0,139,149,233, - 252,233,244,4,248,9,139,116,36,24,252,233,244,56,248,78,139,173,233,137,113, - 252,252,137,116,36,24,137,44,36,131,189,233,0,15,133,244,9,128,189,233,235, - 15,135,244,9,139,181,233,137,116,36,4,15,132,244,247,59,181,233,255,15,132, - 244,9,248,1,141,116,198,252,248,59,181,233,15,135,244,9,137,181,233,139,108, - 36,48,137,141,233,137,141,233,139,108,36,4,141,76,193,252,240,41,252,241, - 57,252,238,15,132,244,249,248,2,139,68,14,4,137,70,252,252,139,4,14,137,70, - 252,248,131,252,238,8,57,252,238,15,133,244,2,248,3,49,201,137,76,36,12,137, - 76,36,8,232,244,28,199,131,233,237,139,108,36,48,139,52,36,139,149,233,255, - 129,252,248,239,15,135,244,254,248,4,139,142,233,139,190,233,137,142,233, - 137,252,254,41,206,15,132,244,252,141,4,50,193,252,238,3,59,133,233,15,135, - 244,255,137,213,41,205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131,193, - 8,57,252,249,15,133,244,5,248,6,141,70,1,248,7,139,116,36,24,137,68,36,20, - 49,201,252,247,198,237,15,132,244,17,255,252,233,244,18,248,8,137,252,242, - 137,252,233,232,251,1,13,248,9,139,12,36,137,185,233,137,252,242,137,252, - 233,232,251,1,0,139,149,233,252,233,244,4,248,79,139,108,36,48,137,113,252, - 252,252,247,133,233,237,15,132,244,56,137,141,233,141,68,193,252,248,137, - 133,233,49,192,137,133,233,176,235,136,133,233,252,233,244,22,255,248,65, - 221,89,252,248,252,233,244,59,248,80,129,252,248,239,15,130,244,56,129,121, - 253,4,239,15,135,244,56,252,242,15,16,1,102,15,252,239,201,102,15,118,201, - 102,15,115,209,1,15,84,193,248,64,252,242,15,17,65,252,248,255,248,80,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,225,248, - 64,248,65,221,89,252,248,255,248,59,184,237,248,70,137,68,36,20,248,57,252, - 247,198,237,15,133,244,253,248,5,56,70,252,255,15,135,244,252,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,6,199,68,193,252,244, - 237,131,192,1,252,233,244,5,248,7,137,202,185,252,248,252,255,252,255,252, - 255,252,233,244,18,255,248,81,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,135,244,56,252,242,15,81,1,252,233,244,64,248,82,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,232,244,83,252, - 233,244,64,248,84,255,129,252,248,239,15,130,244,56,129,121,253,4,239,15, - 135,244,56,252,242,15,16,1,232,244,85,252,233,244,64,255,248,81,129,252,248, - 239,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,252,250,252,233, - 244,65,248,82,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,221,1,232,244,83,252,233,244,65,248,84,255,129,252,248,239,15,130,244, - 56,129,121,253,4,239,15,135,244,56,221,1,232,244,85,252,233,244,65,255,248, - 86,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,217,252, - 237,221,1,217,252,241,252,233,244,65,248,87,129,252,248,239,15,130,244,56, - 129,121,253,4,239,15,135,244,56,217,252,236,221,1,217,252,241,252,233,244, - 65,248,88,129,252,248,239,255,15,130,244,56,129,121,253,4,239,15,135,244, - 56,221,1,232,244,89,252,233,244,65,248,90,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,135,244,56,221,1,217,252,254,252,233,244,65,248,91,129,252, - 248,239,255,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,252,255, - 252,233,244,65,248,92,129,252,248,239,15,130,244,56,129,121,253,4,239,15, - 135,244,56,221,1,217,252,242,221,216,252,233,244,65,248,93,129,252,248,239, - 15,130,244,56,255,129,121,253,4,239,15,135,244,56,221,1,217,192,216,200,217, - 232,222,225,217,252,250,217,252,243,252,233,244,65,248,94,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,217,192,216,200,217,232, - 222,225,217,252,250,217,201,217,252,243,252,233,244,65,248,95,129,252,248, - 239,15,130,244,56,129,121,253,4,239,15,135,244,56,255,221,1,217,232,217,252, - 243,252,233,244,65,255,248,96,129,252,248,239,15,130,244,56,129,121,253,4, - 239,15,135,244,56,252,242,15,16,1,252,242,15,17,4,36,255,248,96,129,252,248, - 239,15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,221,28,36,255,137, - 76,36,16,137,213,232,251,1,14,139,76,36,16,137,252,234,252,233,244,65,255, - 248,97,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252, - 242,15,16,1,252,242,15,17,4,36,255,248,97,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,135,244,56,221,1,221,28,36,255,137,76,36,16,137,213,232, - 251,1,15,139,76,36,16,137,252,234,252,233,244,65,255,248,98,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,252,242,15, - 17,4,36,255,248,98,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135, - 244,56,221,1,221,28,36,255,137,76,36,16,137,213,232,251,1,16,139,76,36,16, - 137,252,234,252,233,244,65,248,99,255,248,100,129,252,248,239,15,130,244, - 56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,252,242,15,89,133,233, - 252,233,244,64,255,248,100,129,252,248,239,15,130,244,56,129,121,253,4,239, - 15,135,244,56,221,1,220,141,233,252,233,244,65,255,248,101,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244, - 56,221,1,221,65,8,217,252,243,252,233,244,65,248,102,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,255,15,135,244, - 56,221,65,8,221,1,217,252,253,221,217,252,233,244,65,248,103,129,252,248, - 239,15,130,244,56,139,105,4,129,252,253,239,15,135,244,56,139,1,137,105,252, - 252,137,65,252,248,209,229,129,252,253,0,0,224,252,255,15,131,244,249,9,232, - 15,132,244,249,184,252,254,3,0,0,129,252,253,0,0,32,0,15,130,244,250,248, - 1,193,252,237,21,41,197,255,252,242,15,42,197,255,137,108,36,16,219,68,36, - 16,255,139,105,252,252,129,229,252,255,252,255,15,128,129,205,0,0,224,63, - 137,105,252,252,248,2,255,252,242,15,17,1,255,221,25,255,184,237,252,233, - 244,70,248,3,255,15,87,192,252,233,244,2,255,217,252,238,252,233,244,2,255, - 252,242,15,16,1,189,0,0,80,67,102,15,110,205,102,15,112,201,81,252,242,15, - 89,193,252,242,15,17,65,252,248,255,221,1,199,68,36,16,0,0,128,90,216,76, - 36,16,221,89,252,248,255,139,105,252,252,184,52,4,0,0,209,229,252,233,244, - 1,255,248,104,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,252,242,15,16,1,255,248,104,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,221,1,255,139,105,4,209,229,129,252,253,0,0,224,252,255, - 15,132,244,250,255,15,40,224,232,244,105,252,242,15,92,224,248,1,252,242, - 15,17,65,252,248,252,242,15,17,33,255,217,192,232,244,105,220,252,233,248, - 1,221,89,252,248,221,25,255,139,65,252,252,139,105,4,49,232,15,136,244,249, - 248,2,184,237,252,233,244,70,248,3,129,252,245,0,0,0,128,137,105,4,252,233, - 244,2,248,4,255,15,87,228,252,233,244,1,255,217,252,238,217,201,252,233,244, - 1,255,248,106,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,221,65,8,221,1,248,1,217,252,248,223, - 224,158,15,138,244,1,221,217,252,233,244,65,255,248,107,129,252,248,239,15, - 130,244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244, - 56,252,242,15,16,1,252,242,15,16,73,8,232,244,108,252,233,244,64,255,248, - 107,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121, - 253,12,239,15,135,244,56,221,1,221,65,8,232,244,108,252,233,244,65,255,248, - 109,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242, - 15,16,1,189,2,0,0,0,248,1,57,197,15,131,244,64,129,124,253,252,233,252,252, - 239,15,135,244,56,252,242,15,16,76,252,233,252,248,252,242,15,93,193,131, - 197,1,252,233,244,1,255,248,109,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,221,1,189,2,0,0,0,248,1,57,197,15,131,244,65,129,124, - 253,252,233,252,252,239,15,135,244,251,221,68,252,233,252,248,255,219,252, - 233,219,209,221,217,255,80,221,225,223,224,252,246,196,1,15,132,244,248,217, - 201,248,2,221,216,88,255,248,110,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,189,2,0,0,0,248,1,57,197,15,131,244,64, - 129,124,253,252,233,252,252,239,15,135,244,56,252,242,15,16,76,252,233,252, - 248,252,242,15,95,193,131,197,1,252,233,244,1,255,248,110,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,189,2,0,0,0,248,1,57, - 197,15,131,244,65,129,124,253,252,233,252,252,239,15,135,244,251,221,68,252, - 233,252,248,255,219,252,233,218,209,221,217,255,80,221,225,223,224,252,246, - 196,1,15,133,244,248,217,201,248,2,221,216,88,255,248,5,221,216,252,233,244, - 56,255,248,111,129,252,248,239,15,130,244,56,129,121,253,4,239,15,133,244, - 56,139,41,255,252,242,15,42,133,233,252,233,244,64,255,219,133,233,252,233, - 244,65,255,248,112,129,252,248,239,15,133,244,56,129,121,253,4,239,15,133, - 244,56,139,41,131,189,233,1,15,130,244,73,15,182,173,233,255,252,242,15,42, - 197,252,233,244,64,255,137,108,36,16,219,68,36,16,252,233,244,65,255,248, - 113,139,171,233,59,171,233,15,130,244,247,232,244,67,248,1,129,252,248,239, - 15,133,244,56,129,121,253,4,239,15,135,244,56,255,252,242,15,45,1,61,252, - 255,0,0,0,15,135,244,56,137,68,36,20,255,221,1,219,92,36,20,129,124,36,20, - 252,255,0,0,0,15,135,244,56,255,199,68,36,8,1,0,0,0,141,68,36,20,137,76,36, - 16,248,114,139,108,36,48,137,149,233,137,68,36,4,137,44,36,137,116,36,24, - 232,251,1,17,139,76,36,16,139,149,233,199,65,252,252,237,137,65,252,248,252, - 233,244,59,248,115,139,171,233,59,171,233,15,130,244,247,232,244,67,248,1, - 137,76,36,16,199,68,36,20,252,255,252,255,252,255,252,255,129,252,248,239, - 15,130,244,56,15,134,244,247,129,121,253,20,239,255,252,242,15,45,105,16, - 137,108,36,20,255,221,65,16,219,92,36,20,255,248,1,129,121,253,4,239,15,133, - 244,56,129,121,253,12,239,15,135,244,56,139,41,137,108,36,12,139,173,233, - 255,252,242,15,45,73,8,255,221,65,8,219,92,36,8,139,76,36,8,255,139,68,36, - 20,57,197,15,130,244,251,248,2,133,201,15,142,244,253,248,3,139,108,36,12, - 41,200,15,140,244,116,141,172,253,13,233,131,192,1,248,4,137,68,36,8,137, - 232,252,233,244,114,248,5,15,140,244,252,141,68,40,1,252,233,244,2,248,6, - 137,232,252,233,244,2,248,7,255,15,132,244,254,1,252,233,131,193,1,15,143, - 244,3,248,8,185,1,0,0,0,252,233,244,3,248,116,49,192,252,233,244,4,248,117, - 129,252,248,239,15,130,244,56,139,171,233,59,171,233,15,130,244,247,232,244, - 67,248,1,255,137,76,36,16,129,121,253,4,239,15,133,244,56,129,121,253,12, - 239,15,135,244,56,139,41,255,252,242,15,45,65,8,255,221,65,8,219,92,36,20, - 139,68,36,20,255,133,192,15,142,244,116,131,189,233,1,15,130,244,116,15,133, - 244,118,57,131,233,15,130,244,118,15,182,141,233,139,171,233,137,68,36,8, - 248,1,136,77,0,131,197,1,131,232,1,15,133,244,1,139,131,233,252,233,244,114, - 248,119,129,252,248,239,255,15,130,244,56,139,171,233,59,171,233,15,130,244, - 247,232,244,67,248,1,137,76,36,16,129,121,253,4,239,15,133,244,56,139,41, - 139,133,233,133,192,15,132,244,116,57,131,233,15,130,244,120,129,197,239, - 137,116,36,20,137,68,36,8,139,179,233,248,1,255,15,182,77,0,131,197,1,131, - 232,1,136,12,6,15,133,244,1,137,252,240,139,116,36,20,252,233,244,114,248, - 121,129,252,248,239,15,130,244,56,139,171,233,59,171,233,15,130,244,247,232, - 244,67,248,1,137,76,36,16,129,121,253,4,239,15,133,244,56,139,41,139,133, - 233,57,131,233,255,15,130,244,120,129,197,239,137,116,36,20,137,68,36,8,139, - 179,233,252,233,244,249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248, - 131,252,249,90,15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232, - 1,15,137,244,1,137,252,240,139,116,36,20,252,233,244,114,248,122,129,252, - 248,239,15,130,244,56,255,139,171,233,59,171,233,15,130,244,247,232,244,67, - 248,1,137,76,36,16,129,121,253,4,239,15,133,244,56,139,41,139,133,233,57, - 131,233,15,130,244,120,129,197,239,137,116,36,20,137,68,36,8,139,179,233, - 252,233,244,249,248,1,15,182,76,5,0,131,252,249,97,15,130,244,248,255,131, - 252,249,122,15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1, - 15,137,244,1,137,252,240,139,116,36,20,252,233,244,114,248,123,129,252,248, - 239,15,130,244,56,129,121,253,4,239,15,133,244,56,137,84,36,16,137,205,139, - 9,232,251,1,18,137,252,233,139,84,36,16,255,252,242,15,42,192,252,233,244, - 64,255,137,4,36,219,4,36,252,233,244,65,255,248,124,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1,189,0,0,56,67,102, - 15,110,205,102,15,112,201,81,252,242,15,88,193,102,15,126,197,252,242,15, - 42,197,252,233,244,64,255,248,124,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,221,1,199,68,36,16,0,0,192,89,216,68,36,16,221,28,36, - 219,4,36,252,233,244,65,255,248,125,129,252,248,239,15,130,244,56,129,121, - 253,4,239,15,135,244,56,252,242,15,16,1,189,0,0,56,67,102,15,110,205,102, - 15,112,201,81,252,242,15,88,193,102,15,126,197,255,248,125,129,252,248,239, - 15,130,244,56,129,121,253,4,239,15,135,244,56,221,1,199,68,36,16,0,0,192, - 89,216,68,36,16,221,28,36,139,44,36,255,137,68,36,20,141,68,193,252,240,255, - 137,84,36,16,255,248,1,57,200,15,134,244,126,129,120,253,4,239,15,135,244, - 127,255,252,242,15,16,0,252,242,15,88,193,102,15,126,194,33,213,255,221,0, - 216,68,36,16,221,28,36,35,44,36,255,131,232,8,252,233,244,1,255,248,128,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1, + 192,1,252,233,244,4,248,7,255,133,201,15,132,244,5,41,193,141,20,202,252, + 233,244,5,248,8,137,149,233,137,68,36,20,137,202,137,252,233,232,251,1,0, + 139,149,233,252,233,244,3,248,17,137,208,137,204,248,18,139,108,36,48,139, + 173,233,199,133,233,237,252,233,244,16,248,19,129,225,239,137,204,248,20, + 139,108,36,48,185,252,248,252,255,252,255,252,255,184,237,255,139,149,233, + 139,157,233,129,195,239,139,114,252,252,199,66,252,252,237,199,131,233,237, + 252,233,244,12,248,21,186,237,252,233,244,248,248,22,131,232,8,252,233,244, + 247,248,23,141,68,194,252,248,248,1,15,182,142,233,131,198,4,137,149,233, + 137,133,233,255,137,116,36,24,137,202,248,2,137,252,233,232,251,1,0,139,149, + 233,139,133,233,139,106,252,248,139,114,252,252,41,208,193,232,3,131,192, + 1,139,181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255,36,171,248, + 24,85,87,86,83,131,252,236,28,139,108,36,48,139,76,36,52,190,237,49,192,141, + 188,253,36,233,139,157,233,129,195,239,137,189,233,137,68,36,24,137,68,36, + 52,56,133,233,15,132,244,249,199,131,233,237,136,133,233,139,149,233,139, + 133,233,41,200,193,232,3,131,192,1,41,209,139,114,252,252,137,68,36,20,252, + 247,198,237,15,132,244,13,255,252,233,244,14,248,25,85,87,86,83,131,252,236, + 28,190,237,252,233,244,247,248,26,85,87,86,83,131,252,236,28,190,237,248, + 1,139,108,36,48,139,76,36,52,248,2,139,189,233,137,124,36,52,137,108,36,24, + 137,165,233,139,157,233,129,195,239,248,3,199,131,233,237,139,149,233,1,206, + 41,214,139,133,233,41,200,193,232,3,131,192,1,248,27,255,139,105,252,248, + 129,121,253,252,252,239,15,133,244,28,248,29,137,202,137,114,252,252,139, + 181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255,36,171,248,30, + 85,87,86,83,131,252,236,28,139,108,36,48,139,68,36,56,139,76,36,52,139,84, + 36,60,137,108,36,24,139,189,233,43,189,233,199,68,36,60,0,0,0,0,137,124,36, + 56,137,68,36,8,137,76,36,4,137,44,36,139,189,233,137,124,36,52,137,165,233, + 252,255,210,133,192,15,132,244,15,137,193,190,237,252,233,244,2,248,11,1, + 209,131,230,252,248,137,213,41,252,242,199,68,193,252,252,237,137,200,139, + 117,252,244,139,77,252,240,139,122,252,248,139,191,233,139,191,233,252,255, + 225,248,31,255,15,182,78,252,255,131,252,237,16,141,12,202,41,252,233,15, + 132,244,32,252,247,217,193,252,233,3,137,76,36,8,139,72,4,139,0,137,77,4, + 137,69,0,137,108,36,4,252,233,244,33,248,34,137,68,36,16,199,68,36,20,237, + 141,68,36,16,128,126,252,252,235,15,133,244,247,141,139,233,137,41,199,65, + 4,237,137,205,252,233,244,248,248,35,15,182,70,252,254,255,252,242,15,42, + 192,252,242,15,17,68,36,16,255,137,68,36,12,219,68,36,12,221,92,36,16,255, + 141,68,36,16,252,233,244,247,248,36,15,182,70,252,254,141,4,194,248,1,15, + 182,110,252,255,141,44,252,234,248,2,137,108,36,4,139,108,36,48,137,68,36, + 8,137,44,36,137,149,233,137,116,36,24,232,251,1,1,139,149,233,133,192,15, + 132,244,249,248,32,15,182,78,252,253,139,104,4,139,0,137,108,202,4,137,4, + 202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,3, + 139,141,233,137,113,252,244,141,177,233,41,214,139,105,252,248,184,237,252, + 233,244,29,248,37,137,68,36,16,199,68,36,20,237,141,68,36,16,128,126,252, + 252,235,15,133,244,247,255,141,139,233,137,41,199,65,4,237,137,205,252,233, + 244,248,248,38,15,182,70,252,254,255,141,68,36,16,252,233,244,247,248,39, + 15,182,70,252,254,141,4,194,248,1,15,182,110,252,255,141,44,252,234,248,2, + 137,108,36,4,139,108,36,48,137,68,36,8,137,44,36,137,149,233,137,116,36,24, + 232,251,1,2,139,149,233,133,192,15,132,244,249,15,182,78,252,253,139,108, + 202,4,139,12,202,137,104,4,137,8,248,40,139,6,15,182,204,15,182,232,131,198, + 4,193,232,16,252,255,36,171,248,3,139,141,233,137,113,252,244,15,182,70,252, + 253,139,108,194,4,139,4,194,137,105,20,137,65,16,141,177,233,41,214,139,105, + 252,248,184,237,252,233,244,29,248,41,15,182,110,252,252,141,4,194,141,12, + 202,137,108,36,12,139,108,36,48,137,68,36,8,137,76,36,4,137,44,36,137,149, + 233,137,116,36,24,232,251,1,3,248,3,139,149,233,255,131,252,248,1,15,135, + 244,42,248,4,141,118,4,15,130,244,252,248,5,15,183,70,252,254,141,180,253, + 134,233,248,6,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, + 171,248,43,131,198,4,129,120,253,4,239,15,130,244,5,252,233,244,6,248,44, + 129,120,253,4,239,252,233,244,4,248,45,131,252,238,4,137,108,36,12,139,108, + 36,48,137,68,36,8,137,76,36,4,137,44,36,137,149,233,255,137,116,36,24,232, + 251,1,4,252,233,244,3,248,46,141,4,199,252,233,244,247,248,47,141,4,199,141, + 44,252,234,149,252,233,244,248,248,48,141,4,194,137,197,252,233,244,248,248, + 49,141,4,194,248,1,141,44,252,234,248,2,141,12,202,137,108,36,8,139,108,36, + 48,137,68,36,12,15,182,70,252,252,137,76,36,4,137,68,36,16,137,44,36,137, + 149,233,137,116,36,24,232,251,1,5,139,149,233,133,192,15,132,244,40,248,42, + 137,193,41,208,137,113,252,244,141,176,233,255,184,237,252,233,244,27,248, + 50,139,108,36,48,137,149,233,141,20,194,137,252,233,137,116,36,24,232,251, + 1,6,139,149,233,252,233,244,42,248,51,141,76,202,8,248,28,137,76,36,20,137, + 68,36,16,131,252,233,8,141,4,193,139,108,36,48,137,76,36,4,137,68,36,8,137, + 44,36,137,149,233,137,116,36,24,232,251,1,7,139,149,233,139,76,36,20,139, + 68,36,16,139,105,252,248,131,192,1,57,215,15,132,244,52,137,202,137,114,252, + 252,139,181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255,36,171, + 248,53,139,108,36,48,137,149,233,137,202,137,252,233,137,116,36,24,232,251, + 1,8,139,149,233,139,70,252,252,15,182,204,15,182,232,193,232,16,252,255,164, + 253,171,233,248,54,255,129,252,248,239,15,130,244,55,139,106,4,129,252,253, + 239,15,131,244,55,139,114,252,252,137,68,36,20,137,106,252,252,139,42,137, + 106,252,248,131,232,2,15,132,244,248,137,209,248,1,131,193,8,139,105,4,137, + 105,252,252,139,41,137,105,252,248,131,232,1,15,133,244,1,248,2,139,68,36, + 20,252,233,244,56,248,57,129,252,248,239,15,130,244,55,139,106,4,184,237, + 252,247,213,57,232,255,15,71,197,255,15,134,244,247,137,232,248,1,255,139, + 106,252,248,139,132,253,197,233,139,114,252,252,199,66,252,252,237,137,66, + 252,248,252,233,244,58,248,59,129,252,248,239,15,130,244,55,139,106,4,139, + 114,252,252,129,252,253,239,15,133,244,252,248,1,139,42,139,173,233,248,2, + 133,252,237,199,66,252,252,237,15,132,244,58,139,131,233,199,66,252,252,237, + 137,106,252,248,139,141,233,255,35,136,233,105,201,239,3,141,233,248,3,129, + 185,233,239,15,133,244,250,57,129,233,15,132,244,251,248,4,139,137,233,133, + 201,15,133,244,3,252,233,244,58,248,5,139,105,4,129,252,253,239,15,132,244, + 58,255,139,1,137,106,252,252,137,66,252,248,252,233,244,58,248,6,129,252, + 253,239,15,132,244,1,129,252,253,239,15,135,244,253,189,237,248,7,252,247, + 213,139,172,253,171,233,252,233,244,2,248,60,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,133,244,55,255,139,42,131,189,233,0,15,133,244,55,129, + 122,253,12,239,15,133,244,55,139,66,8,137,133,233,139,114,252,252,199,66, + 252,252,237,137,106,252,248,252,246,133,233,235,15,132,244,247,128,165,233, + 235,139,131,233,137,171,233,137,133,233,248,1,252,233,244,58,248,61,255,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,133,244,55,139,2,139,108,36, + 48,137,68,36,4,137,44,36,137,213,131,194,8,137,84,36,8,232,251,1,9,137,252, + 234,139,40,139,64,4,139,114,252,252,137,106,252,248,137,66,252,252,252,233, + 244,58,248,62,129,252,248,239,15,133,244,55,129,122,253,4,239,15,135,244, + 55,255,252,242,15,16,2,252,233,244,63,255,221,2,252,233,244,64,255,248,65, + 129,252,248,239,15,130,244,55,139,114,252,252,129,122,253,4,239,15,133,244, + 249,139,2,248,2,199,66,252,252,237,137,66,252,248,252,233,244,58,248,3,129, + 122,253,4,239,15,135,244,55,131,187,233,0,15,133,244,55,139,171,233,59,171, + 233,255,15,130,244,247,232,244,66,248,1,139,108,36,48,137,149,233,137,116, + 36,24,137,252,233,232,251,1,10,139,149,233,252,233,244,2,248,67,129,252,248, + 239,15,130,244,55,15,132,244,248,248,1,129,122,253,4,239,15,133,244,55,139, + 108,36,48,137,149,233,255,139,114,252,252,139,2,137,68,36,4,137,44,36,131, + 194,8,137,84,36,8,137,116,36,24,232,251,1,11,139,149,233,133,192,15,132,244, + 249,139,106,8,139,66,12,137,106,252,248,137,66,252,252,139,106,16,139,66, + 20,137,42,137,66,4,248,68,184,237,252,233,244,69,248,2,199,66,12,237,252, + 233,244,1,248,3,199,66,252,252,237,252,233,244,58,248,70,129,252,248,239, + 15,130,244,55,139,106,252,248,129,122,253,4,239,255,15,133,244,55,139,133, + 233,139,114,252,252,199,66,252,252,237,137,66,252,248,199,66,12,237,184,237, + 252,233,244,69,248,71,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 133,244,55,129,122,253,12,239,15,135,244,55,139,114,252,252,255,252,242,15, + 16,66,8,189,0,0,252,240,63,102,15,110,205,102,15,112,201,81,252,242,15,88, + 193,252,242,15,45,192,252,242,15,17,66,252,248,255,221,66,8,217,232,222,193, + 219,20,36,221,90,252,248,139,4,36,255,139,42,59,133,233,15,131,244,248,193, + 224,3,3,133,233,248,1,129,120,253,4,239,15,132,244,72,139,40,139,64,4,137, + 42,137,66,4,252,233,244,68,248,2,131,189,233,0,15,132,244,72,137,252,233, + 137,213,137,194,232,251,1,12,137,252,234,133,192,15,133,244,1,248,72,184, + 237,252,233,244,69,248,73,255,129,252,248,239,15,130,244,55,139,106,252,248, + 129,122,253,4,239,15,133,244,55,139,133,233,139,114,252,252,199,66,252,252, + 237,137,66,252,248,255,15,87,192,252,242,15,17,66,8,255,217,252,238,221,90, + 8,255,184,237,252,233,244,69,248,74,129,252,248,239,15,130,244,55,141,74, + 8,131,232,1,190,237,248,1,15,182,171,233,193,252,237,235,131,229,1,1,252, + 238,252,233,244,27,248,75,129,252,248,239,15,130,244,55,129,122,253,12,239, + 15,133,244,55,255,139,106,4,137,106,12,199,66,4,237,139,42,139,114,8,137, + 106,8,137,50,141,74,16,131,232,2,190,237,252,233,244,1,248,76,129,252,248, + 239,15,130,244,55,139,42,139,114,252,252,137,116,36,24,137,44,36,129,122, + 253,4,239,15,133,244,55,131,189,233,0,15,133,244,55,128,189,233,235,15,135, + 244,55,139,141,233,15,132,244,247,255,59,141,233,15,132,244,55,248,1,141, + 116,193,252,240,59,181,233,15,135,244,55,137,181,233,139,108,36,48,137,149, + 233,131,194,8,137,149,233,141,108,194,232,41,252,245,57,206,15,132,244,249, + 248,2,139,68,46,4,137,70,252,252,139,4,46,137,70,252,248,131,252,238,8,57, + 206,15,133,244,2,248,3,137,76,36,4,49,201,137,76,36,12,137,76,36,8,232,244, + 24,199,131,233,237,255,139,108,36,48,139,52,36,139,149,233,129,252,248,239, + 15,135,244,254,248,4,139,142,233,139,190,233,137,142,233,137,252,254,41,206, + 15,132,244,252,141,4,50,193,252,238,3,59,133,233,15,135,244,255,137,213,41, + 205,248,5,139,1,137,4,41,139,65,4,137,68,41,4,131,193,8,57,252,249,15,133, + 244,5,248,6,141,70,2,199,66,252,252,237,248,7,139,116,36,24,137,68,36,20, + 185,252,248,252,255,252,255,252,255,252,247,198,237,255,15,132,244,13,252, + 233,244,14,248,8,199,66,252,252,237,139,142,233,131,252,233,8,137,142,233, + 139,1,137,2,139,65,4,137,66,4,184,237,252,233,244,7,248,9,139,12,36,137,185, + 233,137,252,242,137,252,233,232,251,1,0,139,149,233,252,233,244,4,248,77, + 139,106,252,248,139,173,233,139,114,252,252,137,116,36,24,137,44,36,131,189, + 233,0,15,133,244,55,255,128,189,233,235,15,135,244,55,139,141,233,15,132, + 244,247,59,141,233,15,132,244,55,248,1,141,116,193,252,248,59,181,233,15, + 135,244,55,137,181,233,139,108,36,48,137,149,233,137,149,233,141,108,194, + 252,240,41,252,245,57,206,15,132,244,249,248,2,255,139,68,46,4,137,70,252, + 252,139,4,46,137,70,252,248,131,252,238,8,57,206,15,133,244,2,248,3,137,76, + 36,4,49,201,137,76,36,12,137,76,36,8,232,244,24,199,131,233,237,139,108,36, + 48,139,52,36,139,149,233,129,252,248,239,15,135,244,254,248,4,139,142,233, + 139,190,233,137,142,233,137,252,254,41,206,15,132,244,252,141,4,50,193,252, + 238,3,59,133,233,15,135,244,255,255,137,213,41,205,248,5,139,1,137,4,41,139, + 65,4,137,68,41,4,131,193,8,57,252,249,15,133,244,5,248,6,141,70,1,248,7,139, + 116,36,24,137,68,36,20,49,201,252,247,198,237,15,132,244,13,252,233,244,14, + 248,8,137,252,242,137,252,233,232,251,1,13,248,9,139,12,36,137,185,233,137, + 252,242,137,252,233,232,251,1,0,139,149,233,252,233,244,4,248,78,139,108, + 36,48,252,247,133,233,237,15,132,244,55,255,137,149,233,141,68,194,252,248, + 137,133,233,49,192,137,133,233,176,235,136,133,233,252,233,244,16,255,248, + 64,139,114,252,252,221,90,252,248,252,233,244,58,248,79,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,102,15,252,239, + 201,102,15,118,201,102,15,115,209,1,15,84,193,248,63,139,114,252,252,252, + 242,15,17,66,252,248,255,248,79,129,252,248,239,15,130,244,55,129,122,253, + 4,239,15,135,244,55,221,2,217,225,248,63,248,64,139,114,252,252,221,90,252, + 248,255,248,58,184,237,248,69,137,68,36,20,248,56,252,247,198,237,15,133, + 244,253,248,5,56,70,252,255,15,135,244,252,15,182,78,252,253,252,247,209, + 141,20,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171, + 248,6,199,68,194,252,244,237,131,192,1,252,233,244,5,248,7,185,252,248,252, + 255,252,255,252,255,252,233,244,14,255,248,80,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,252,242,15,81,2,252,233,244,63,248,81, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15, + 16,2,232,244,82,252,233,244,63,248,83,255,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,252,242,15,16,2,232,244,84,252,233,244,63,255, + 248,80,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,217,252,250,252,233,244,64,248,81,129,252,248,239,15,130,244,55,129,122, + 253,4,239,15,135,244,55,221,2,232,244,82,252,233,244,64,248,83,255,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,232,244,84,252, + 233,244,64,255,248,85,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,217,252,237,221,2,217,252,241,252,233,244,64,248,86,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,135,244,55,217,252,236,221,2,217,252, + 241,252,233,244,64,248,87,129,252,248,239,255,15,130,244,55,129,122,253,4, + 239,15,135,244,55,221,2,232,244,88,252,233,244,64,248,89,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,217,252,254,252,233,244, + 64,248,90,129,252,248,239,255,15,130,244,55,129,122,253,4,239,15,135,244, + 55,221,2,217,252,255,252,233,244,64,248,91,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,221,2,217,252,242,221,216,252,233,244,64, + 248,92,129,252,248,239,15,130,244,55,255,129,122,253,4,239,15,135,244,55, + 221,2,217,192,216,200,217,232,222,225,217,252,250,217,252,243,252,233,244, + 64,248,93,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,217,192,216,200,217,232,222,225,217,252,250,217,201,217,252,243,252,233, + 244,64,248,94,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,255,221,2,217,232,217,252,243,252,233,244,64,255,248,95,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,252,242,15, + 17,4,36,255,248,95,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135, + 244,55,221,2,221,28,36,255,137,213,232,251,1,14,137,252,234,252,233,244,64, + 255,248,96,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55, + 252,242,15,16,2,252,242,15,17,4,36,255,248,96,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,221,2,221,28,36,255,137,213,232,251,1, + 15,137,252,234,252,233,244,64,255,248,97,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,252,242,15,16,2,252,242,15,17,4,36,255,248,97, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,221,28, + 36,255,137,213,232,251,1,16,137,252,234,252,233,244,64,248,98,255,248,99, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15, + 16,2,139,106,252,248,252,242,15,89,133,233,252,233,244,63,255,248,99,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,139,106,252, + 248,220,141,233,252,233,244,64,255,248,100,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,221,2,221, + 66,8,217,252,243,252,233,244,64,248,101,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,129,122,253,12,239,255,15,135,244,55,221,66,8, + 221,2,217,252,253,221,217,252,233,244,64,248,102,129,252,248,239,15,130,244, + 55,139,106,4,129,252,253,239,15,135,244,55,139,114,252,252,139,2,137,106, + 252,252,137,66,252,248,209,229,129,252,253,0,0,224,252,255,15,131,244,249, + 9,232,15,132,244,249,184,252,254,3,0,0,129,252,253,0,0,32,0,15,130,244,250, + 248,1,193,252,237,21,41,197,255,252,242,15,42,197,255,137,108,36,16,219,68, + 36,16,255,139,106,252,252,129,229,252,255,252,255,15,128,129,205,0,0,224, + 63,137,106,252,252,248,2,255,252,242,15,17,2,255,221,26,255,184,237,252,233, + 244,69,248,3,255,15,87,192,252,233,244,2,255,217,252,238,252,233,244,2,255, + 248,4,255,252,242,15,16,2,189,0,0,80,67,102,15,110,205,102,15,112,201,81, + 252,242,15,89,193,252,242,15,17,66,252,248,255,221,2,199,68,36,16,0,0,128, + 90,216,76,36,16,221,90,252,248,255,139,106,252,252,184,52,4,0,0,209,229,252, + 233,244,1,255,248,103,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,252,242,15,16,2,255,248,103,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,221,2,255,139,106,4,139,114,252,252,209,229,129, + 252,253,0,0,224,252,255,15,132,244,250,255,15,40,224,232,244,104,252,242, + 15,92,224,248,1,252,242,15,17,66,252,248,252,242,15,17,34,255,217,192,232, + 244,104,220,252,233,248,1,221,90,252,248,221,26,255,139,66,252,252,139,106, + 4,49,232,15,136,244,249,248,2,184,237,252,233,244,69,248,3,129,252,245,0, + 0,0,128,137,106,4,252,233,244,2,248,4,255,15,87,228,252,233,244,1,255,217, + 252,238,217,201,252,233,244,1,255,248,105,129,252,248,239,15,130,244,55,129, + 122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,221,66,8,221, + 2,248,1,217,252,248,223,224,158,15,138,244,1,221,217,252,233,244,64,255,248, + 106,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122, + 253,12,239,15,135,244,55,252,242,15,16,2,252,242,15,16,74,8,232,244,107,252, + 233,244,63,255,248,106,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,129,122,253,12,239,15,135,244,55,221,2,221,66,8,232,244,107,252, + 233,244,64,255,248,108,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,252,242,15,16,2,189,2,0,0,0,248,1,57,197,15,131,244,63,129,124, + 253,252,234,252,252,239,15,135,244,55,252,242,15,16,76,252,234,252,248,252, + 242,15,93,193,131,197,1,252,233,244,1,255,248,108,129,252,248,239,15,130, + 244,55,129,122,253,4,239,15,135,244,55,221,2,189,2,0,0,0,248,1,57,197,15, + 131,244,64,129,124,253,252,234,252,252,239,15,135,244,251,221,68,252,234, + 252,248,255,219,252,233,219,209,221,217,255,80,221,225,223,224,252,246,196, + 1,15,132,244,248,217,201,248,2,221,216,88,255,248,109,129,252,248,239,15, + 130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,189,2,0,0,0,248, + 1,57,197,15,131,244,63,129,124,253,252,234,252,252,239,15,135,244,55,252, + 242,15,16,76,252,234,252,248,252,242,15,95,193,131,197,1,252,233,244,1,255, + 248,109,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,189,2,0,0,0,248,1,57,197,15,131,244,64,129,124,253,252,234,252,252,239, + 15,135,244,251,221,68,252,234,252,248,255,219,252,233,218,209,221,217,255, + 80,221,225,223,224,252,246,196,1,15,133,244,248,217,201,248,2,221,216,88, + 255,248,5,221,216,252,233,244,55,255,248,110,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,133,244,55,139,42,255,252,242,15,42,133,233,252,233, + 244,63,255,219,133,233,252,233,244,64,255,248,111,129,252,248,239,15,133, + 244,55,129,122,253,4,239,15,133,244,55,139,42,139,114,252,252,131,189,233, + 1,15,130,244,72,15,182,173,233,255,252,242,15,42,197,252,233,244,63,255,137, + 108,36,16,219,68,36,16,252,233,244,64,255,248,112,139,171,233,59,171,233, + 15,130,244,247,232,244,66,248,1,129,252,248,239,15,133,244,55,129,122,253, + 4,239,15,135,244,55,255,252,242,15,45,2,61,252,255,0,0,0,15,135,244,55,137, + 68,36,20,255,221,2,219,92,36,20,129,124,36,20,252,255,0,0,0,15,135,244,55, + 255,199,68,36,8,1,0,0,0,141,68,36,20,248,113,139,108,36,48,137,149,233,137, + 68,36,4,137,44,36,137,116,36,24,232,251,1,17,139,149,233,139,114,252,252, + 199,66,252,252,237,137,66,252,248,252,233,244,58,248,114,139,171,233,59,171, + 233,15,130,244,247,232,244,66,248,1,199,68,36,20,252,255,252,255,252,255, + 252,255,129,252,248,239,15,130,244,55,15,134,244,247,129,122,253,20,239,255, + 252,242,15,45,106,16,137,108,36,20,255,221,66,16,219,92,36,20,255,248,1,129, + 122,253,4,239,15,133,244,55,129,122,253,12,239,15,135,244,55,139,42,137,108, + 36,12,139,173,233,255,252,242,15,45,74,8,255,221,66,8,219,92,36,8,139,76, + 36,8,255,139,68,36,20,57,197,15,130,244,251,248,2,133,201,15,142,244,253, + 248,3,139,108,36,12,41,200,15,140,244,115,141,172,253,13,233,131,192,1,248, + 4,137,68,36,8,137,232,252,233,244,113,248,5,15,140,244,252,141,68,40,1,252, + 233,244,2,248,6,137,232,252,233,244,2,248,7,255,15,132,244,254,1,252,233, + 131,193,1,15,143,244,3,248,8,185,1,0,0,0,252,233,244,3,248,115,49,192,252, + 233,244,4,248,116,129,252,248,239,15,130,244,55,139,171,233,59,171,233,15, + 130,244,247,232,244,66,248,1,255,129,122,253,4,239,15,133,244,55,129,122, + 253,12,239,15,135,244,55,139,42,255,252,242,15,45,66,8,255,221,66,8,219,92, + 36,20,139,68,36,20,255,133,192,15,142,244,115,131,189,233,1,15,130,244,115, + 15,133,244,117,57,131,233,15,130,244,117,15,182,141,233,139,171,233,137,68, + 36,8,248,1,136,77,0,131,197,1,131,232,1,15,133,244,1,139,131,233,252,233, + 244,113,248,118,129,252,248,239,255,15,130,244,55,139,171,233,59,171,233, + 15,130,244,247,232,244,66,248,1,129,122,253,4,239,15,133,244,55,139,42,139, + 133,233,133,192,15,132,244,115,57,131,233,15,130,244,119,129,197,239,137, + 116,36,20,137,68,36,8,139,179,233,248,1,255,15,182,77,0,131,197,1,131,232, + 1,136,12,6,15,133,244,1,137,252,240,139,116,36,20,252,233,244,113,248,120, + 129,252,248,239,15,130,244,55,139,171,233,59,171,233,15,130,244,247,232,244, + 66,248,1,129,122,253,4,239,15,133,244,55,139,42,139,133,233,57,131,233,255, + 15,130,244,119,129,197,239,137,116,36,20,137,68,36,8,139,179,233,252,233, + 244,249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248,131,252,249,90, + 15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1, + 137,252,240,139,116,36,20,252,233,244,113,248,121,129,252,248,239,15,130, + 244,55,255,139,171,233,59,171,233,15,130,244,247,232,244,66,248,1,129,122, + 253,4,239,15,133,244,55,139,42,139,133,233,57,131,233,15,130,244,119,129, + 197,239,137,116,36,20,137,68,36,8,139,179,233,252,233,244,249,248,1,15,182, + 76,5,0,131,252,249,97,15,130,244,248,255,131,252,249,122,15,135,244,248,131, + 252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1,137,252,240,139,116, + 36,20,252,233,244,113,248,122,129,252,248,239,15,130,244,55,129,122,253,4, + 239,15,133,244,55,137,213,139,10,232,251,1,18,137,252,234,255,252,242,15, + 42,192,252,233,244,63,255,137,4,36,219,4,36,252,233,244,64,255,248,123,129, + 252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2, 189,0,0,56,67,102,15,110,205,102,15,112,201,81,252,242,15,88,193,102,15,126, - 197,255,248,128,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,221,1,199,68,36,16,0,0,192,89,216,68,36,16,221,28,36,139,44,36,255,252, - 242,15,16,0,252,242,15,88,193,102,15,126,194,9,213,255,221,0,216,68,36,16, - 221,28,36,11,44,36,255,248,129,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,189,0,0,56,67,102,15,110,205,102,15,112, - 201,81,252,242,15,88,193,102,15,126,197,255,248,129,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,221,1,199,68,36,16,0,0,192,89,216, - 68,36,16,221,28,36,139,44,36,255,252,242,15,16,0,252,242,15,88,193,102,15, - 126,194,49,213,255,221,0,216,68,36,16,221,28,36,51,44,36,255,248,130,129, - 252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,252,242,15,16,1, - 189,0,0,56,67,102,15,110,205,102,15,112,201,81,252,242,15,88,193,102,15,126, - 197,255,248,130,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,221,1,199,68,36,16,0,0,192,89,216,68,36,16,221,28,36,139,44,36,255,15, - 205,252,233,244,131,255,248,132,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,252,242,15,16,1,189,0,0,56,67,102,15,110,205,102,15,112, - 201,81,252,242,15,88,193,102,15,126,197,255,248,132,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,221,1,199,68,36,16,0,0,192,89,216, - 68,36,16,221,28,36,139,44,36,255,252,247,213,255,248,131,252,242,15,42,197, - 252,233,244,64,248,126,252,242,15,42,197,139,84,36,16,252,233,244,64,255, - 248,131,248,126,137,44,36,219,4,36,252,233,244,65,255,248,127,255,139,68, - 36,20,252,233,244,56,255,248,133,129,252,248,239,15,130,244,56,129,121,253, - 4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252,242,15,16,1,252, - 242,15,16,73,8,189,0,0,56,67,102,15,110,213,102,15,112,210,81,252,242,15, - 88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,248,133, - 129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121,253, - 12,239,15,135,244,56,221,1,221,65,8,199,68,36,16,0,0,192,89,216,68,36,16, + 197,252,242,15,42,197,252,233,244,63,255,248,123,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,221,2,199,68,36,16,0,0,192,89,216,68,36, + 16,221,28,36,219,4,36,252,233,244,64,255,248,124,129,252,248,239,15,130,244, + 55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,189,0,0,56,67,102,15,110, + 205,102,15,112,201,81,252,242,15,88,193,102,15,126,197,255,248,124,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221,2,199,68,36,16, + 0,0,192,89,216,68,36,16,221,28,36,139,44,36,255,137,68,36,20,141,68,194,252, + 240,248,1,57,208,15,134,244,125,129,120,253,4,239,15,135,244,126,255,252, + 242,15,16,0,252,242,15,88,193,102,15,126,193,33,205,255,221,0,216,68,36,16, + 221,28,36,35,44,36,255,131,232,8,252,233,244,1,255,248,127,129,252,248,239, + 15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,189,0,0,56, + 67,102,15,110,205,102,15,112,201,81,252,242,15,88,193,102,15,126,197,255, + 248,127,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,199,68,36,16,0,0,192,89,216,68,36,16,221,28,36,139,44,36,255,252,242,15, + 16,0,252,242,15,88,193,102,15,126,193,9,205,255,221,0,216,68,36,16,221,28, + 36,11,44,36,255,248,128,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,252,242,15,16,2,189,0,0,56,67,102,15,110,205,102,15,112,201,81, + 252,242,15,88,193,102,15,126,197,255,248,128,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,221,2,199,68,36,16,0,0,192,89,216,68,36,16, + 221,28,36,139,44,36,255,252,242,15,16,0,252,242,15,88,193,102,15,126,193, + 49,205,255,221,0,216,68,36,16,221,28,36,51,44,36,255,248,129,129,252,248, + 239,15,130,244,55,129,122,253,4,239,15,135,244,55,252,242,15,16,2,189,0,0, + 56,67,102,15,110,205,102,15,112,201,81,252,242,15,88,193,102,15,126,197,255, + 248,129,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,221, + 2,199,68,36,16,0,0,192,89,216,68,36,16,221,28,36,139,44,36,255,15,205,252, + 233,244,125,255,248,130,129,252,248,239,15,130,244,55,129,122,253,4,239,15, + 135,244,55,252,242,15,16,2,189,0,0,56,67,102,15,110,205,102,15,112,201,81, + 252,242,15,88,193,102,15,126,197,255,248,130,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,221,2,199,68,36,16,0,0,192,89,216,68,36,16, + 221,28,36,139,44,36,255,252,247,213,255,248,125,252,242,15,42,197,252,233, + 244,63,255,248,125,137,44,36,219,4,36,252,233,244,64,255,248,126,139,68,36, + 20,252,233,244,55,255,248,131,129,252,248,239,15,130,244,55,129,122,253,4, + 239,15,135,244,55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252,242, + 15,16,74,8,189,0,0,56,67,102,15,110,213,102,15,112,210,81,252,242,15,88,194, + 252,242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,248,131,129,252, + 248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122,253,12,239, + 15,135,244,55,221,2,221,66,8,199,68,36,16,0,0,192,89,216,68,36,16,221,92, + 36,8,216,68,36,16,221,28,36,137,200,139,76,36,8,139,44,36,255,211,229,137, + 193,252,233,244,125,255,248,132,129,252,248,239,15,130,244,55,129,122,253, + 4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,252,242,15,16,2,252, + 242,15,16,74,8,189,0,0,56,67,102,15,110,213,102,15,112,210,81,252,242,15, + 88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,248,132, + 129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55,129,122,253, + 12,239,15,135,244,55,221,2,221,66,8,199,68,36,16,0,0,192,89,216,68,36,16, 221,92,36,8,216,68,36,16,221,28,36,137,200,139,76,36,8,139,44,36,255,211, - 229,137,193,252,233,244,131,255,248,134,129,252,248,239,15,130,244,56,129, - 121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252,242,15,16, - 1,252,242,15,16,73,8,189,0,0,56,67,102,15,110,213,102,15,112,210,81,252,242, - 15,88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201,255,248, - 134,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56,129,121, - 253,12,239,15,135,244,56,221,1,221,65,8,199,68,36,16,0,0,192,89,216,68,36, - 16,221,92,36,8,216,68,36,16,221,28,36,137,200,139,76,36,8,139,44,36,255,211, - 252,237,137,193,252,233,244,131,255,248,135,129,252,248,239,15,130,244,56, - 129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252,242, - 15,16,1,252,242,15,16,73,8,189,0,0,56,67,102,15,110,213,102,15,112,210,81, + 252,237,137,193,252,233,244,125,255,248,133,129,252,248,239,15,130,244,55, + 129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,252,242, + 15,16,2,252,242,15,16,74,8,189,0,0,56,67,102,15,110,213,102,15,112,210,81, 252,242,15,88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126,201, - 255,248,135,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244,56, - 129,121,253,12,239,15,135,244,56,221,1,221,65,8,199,68,36,16,0,0,192,89,216, + 255,248,133,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244,55, + 129,122,253,12,239,15,135,244,55,221,2,221,66,8,199,68,36,16,0,0,192,89,216, 68,36,16,221,92,36,8,216,68,36,16,221,28,36,137,200,139,76,36,8,139,44,36, - 255,211,252,253,137,193,252,233,244,131,255,248,136,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252, - 242,15,16,1,252,242,15,16,73,8,189,0,0,56,67,102,15,110,213,102,15,112,210, + 255,211,252,253,137,193,252,233,244,125,255,248,134,129,252,248,239,15,130, + 244,55,129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,252, + 242,15,16,2,252,242,15,16,74,8,189,0,0,56,67,102,15,110,213,102,15,112,210, 81,252,242,15,88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126, - 201,255,248,136,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,221,1,221,65,8,199,68,36,16,0,0,192,89, + 201,255,248,134,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,129,122,253,12,239,15,135,244,55,221,2,221,66,8,199,68,36,16,0,0,192,89, 216,68,36,16,221,92,36,8,216,68,36,16,221,28,36,137,200,139,76,36,8,139,44, - 36,255,211,197,137,193,252,233,244,131,255,248,137,129,252,248,239,15,130, - 244,56,129,121,253,4,239,15,135,244,56,129,121,253,12,239,15,135,244,56,252, - 242,15,16,1,252,242,15,16,73,8,189,0,0,56,67,102,15,110,213,102,15,112,210, + 36,255,211,197,137,193,252,233,244,125,255,248,135,129,252,248,239,15,130, + 244,55,129,122,253,4,239,15,135,244,55,129,122,253,12,239,15,135,244,55,252, + 242,15,16,2,252,242,15,16,74,8,189,0,0,56,67,102,15,110,213,102,15,112,210, 81,252,242,15,88,194,252,242,15,88,202,137,200,102,15,126,197,102,15,126, - 201,255,248,137,129,252,248,239,15,130,244,56,129,121,253,4,239,15,135,244, - 56,129,121,253,12,239,15,135,244,56,221,1,221,65,8,199,68,36,16,0,0,192,89, + 201,255,248,135,129,252,248,239,15,130,244,55,129,122,253,4,239,15,135,244, + 55,129,122,253,12,239,15,135,244,55,221,2,221,66,8,199,68,36,16,0,0,192,89, 216,68,36,16,221,92,36,8,216,68,36,16,221,28,36,137,200,139,76,36,8,139,44, - 36,255,211,205,137,193,252,233,244,131,248,118,184,237,252,233,244,56,248, - 120,184,237,248,56,139,108,36,48,41,202,137,113,252,252,137,116,36,24,137, - 84,36,16,137,141,233,141,68,193,252,248,141,144,233,137,133,233,139,65,252, - 248,59,149,233,15,135,244,251,137,44,36,252,255,144,233,133,192,15,133,244, - 249,248,1,139,141,233,255,139,133,233,41,200,193,232,3,131,192,1,139,105, - 252,248,139,84,36,16,1,202,57,113,252,252,15,133,244,248,252,255,165,233, - 248,2,129,121,253,252,252,239,15,133,244,31,252,255,165,233,248,3,139,141, - 233,139,84,36,16,1,202,252,233,244,70,248,5,186,237,137,252,233,232,251,1, - 0,252,233,244,1,248,67,93,137,108,36,16,139,108,36,48,41,202,137,84,36,20, - 137,113,252,252,137,116,36,24,137,141,233,141,68,193,252,248,137,252,233, - 137,133,233,255,232,251,1,19,139,141,233,139,133,233,41,200,193,232,3,131, - 192,1,139,113,252,252,139,84,36,20,1,202,139,108,36,16,85,139,105,252,248, - 195,248,138,255,15,182,131,233,168,235,15,133,244,251,168,235,15,133,244, - 247,168,235,15,132,244,247,252,255,139,233,252,233,244,247,255,248,139,15, - 182,131,233,168,235,15,133,244,251,168,235,15,132,244,251,252,255,139,233, - 15,132,244,247,168,235,15,132,244,251,248,1,139,108,36,48,137,149,233,137, - 252,242,137,252,233,232,251,1,20,248,3,139,149,233,248,4,15,182,78,252,253, - 248,5,255,15,182,110,252,252,15,183,70,252,254,252,255,164,253,171,233,248, - 140,131,198,4,139,77,232,137,76,36,20,252,233,244,4,248,141,255,139,108,36, - 48,137,149,233,137,252,242,141,139,233,137,171,233,137,116,36,24,232,251, - 1,21,252,233,244,3,255,248,142,255,139,108,36,48,137,149,233,137,252,242, - 141,139,233,137,171,233,137,116,36,24,232,251,1,21,139,149,233,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,248,143,255,85,141, - 108,36,12,85,83,82,81,80,15,182,69,252,252,138,101,252,248,137,125,252,252, - 137,117,252,248,139,93,0,139,139,233,199,131,233,237,137,131,233,137,139, - 233,129,252,236,239,252,247,131,233,237,15,132,244,247,252,242,15,17,125, - 216,252,242,15,17,117,208,252,242,15,17,109,200,252,242,15,17,101,192,252, - 242,15,17,93,184,252,242,15,17,85,176,252,242,15,17,77,168,252,242,15,17, - 69,160,248,1,139,171,233,139,147,233,137,171,233,137,149,233,141,84,36,16, - 141,139,233,232,251,1,22,137,196,139,149,233,139,116,36,24,137,108,36,48, - 255,248,144,255,139,122,252,248,139,191,233,139,191,233,199,131,233,0,0,0, - 0,199,131,233,237,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255, - 36,171,255,248,83,255,217,124,36,4,137,68,36,8,102,184,0,4,102,11,68,36,4, - 102,37,252,255,252,247,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36, - 4,139,68,36,8,195,255,248,145,102,15,252,239,210,102,15,118,210,102,15,115, - 210,1,184,0,0,48,67,102,15,110,216,102,15,112,219,81,15,40,200,102,15,84, - 202,102,15,46,217,15,134,244,247,102,15,85,208,252,242,15,88,203,252,242, - 15,92,203,102,15,86,202,184,0,0,252,240,63,102,15,110,208,102,15,112,210, - 81,252,242,15,194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195, - 248,85,255,217,124,36,4,137,68,36,8,102,184,0,8,102,11,68,36,4,102,37,252, - 255,252,251,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68, - 36,8,195,255,248,146,102,15,252,239,210,102,15,118,210,102,15,115,210,1,184, + 36,255,211,205,137,193,252,233,244,125,248,117,184,237,252,233,244,55,248, + 119,184,237,248,55,139,108,36,48,139,114,252,252,137,116,36,24,137,149,233, + 141,68,194,252,248,141,136,233,137,133,233,139,66,252,248,59,141,233,15,135, + 244,251,137,44,36,252,255,144,233,139,149,233,133,192,15,133,244,69,248,1, + 255,139,133,233,41,208,193,232,3,131,192,1,139,106,252,248,57,114,252,252, + 15,133,244,248,139,181,233,139,14,15,182,252,233,15,182,205,131,198,4,252, + 255,36,171,248,2,137,209,252,247,198,237,15,133,244,249,15,182,110,252,253, + 252,247,213,141,20,252,234,252,233,244,27,248,3,137,252,245,131,229,252,248, + 41,252,234,252,233,244,27,248,5,186,237,137,252,233,232,251,1,0,139,149,233, + 252,233,244,1,248,66,93,137,108,36,16,139,108,36,48,137,116,36,24,137,149, + 233,255,141,68,194,252,248,137,252,233,137,133,233,232,251,1,19,139,149,233, + 139,133,233,41,208,193,232,3,131,192,1,139,108,36,16,85,195,248,136,255,15, + 182,131,233,168,235,15,133,244,251,168,235,15,133,244,247,168,235,15,132, + 244,247,252,255,139,233,252,233,244,247,255,248,137,15,182,131,233,168,235, + 15,133,244,251,168,235,15,132,244,251,252,255,139,233,15,132,244,247,168, + 235,15,132,244,251,248,1,139,108,36,48,137,149,233,137,252,242,137,252,233, + 232,251,1,20,248,3,139,149,233,248,4,15,182,78,252,253,248,5,255,15,182,110, + 252,252,15,183,70,252,254,252,255,164,253,171,233,248,138,131,198,4,139,77, + 232,137,76,36,20,252,233,244,4,248,139,255,139,106,252,248,139,173,233,15, + 182,133,233,141,4,194,139,108,36,48,137,149,233,137,133,233,137,252,242,141, + 139,233,137,171,233,137,116,36,24,232,251,1,21,252,233,244,3,255,248,140, + 255,141,68,194,252,248,139,108,36,48,137,149,233,137,133,233,137,252,242, + 141,139,233,137,171,233,137,116,36,24,232,251,1,21,139,149,233,139,133,233, + 41,208,193,232,3,131,192,1,139,106,252,248,139,181,233,139,14,15,182,252, + 233,15,182,205,131,198,4,252,255,36,171,255,248,141,255,85,141,108,36,12, + 85,83,82,81,80,15,182,69,252,252,138,101,252,248,137,125,252,252,137,117, + 252,248,139,93,0,139,139,233,199,131,233,237,137,131,233,137,139,233,129, + 252,236,239,252,247,131,233,237,15,132,244,247,252,242,15,17,125,216,252, + 242,15,17,117,208,252,242,15,17,109,200,252,242,15,17,101,192,252,242,15, + 17,93,184,252,242,15,17,85,176,252,242,15,17,77,168,252,242,15,17,69,160, + 248,1,139,171,233,139,147,233,137,171,233,137,149,233,141,84,36,16,141,139, + 233,232,251,1,22,137,196,139,149,233,139,116,36,24,137,108,36,48,255,248, + 142,255,139,122,252,248,139,191,233,139,191,233,199,131,233,0,0,0,0,199,131, + 233,237,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255, + 248,82,255,217,124,36,4,137,68,36,8,102,184,0,4,102,11,68,36,4,102,37,252, + 255,252,247,102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68, + 36,8,195,255,248,143,102,15,252,239,210,102,15,118,210,102,15,115,210,1,184, 0,0,48,67,102,15,110,216,102,15,112,219,81,15,40,200,102,15,84,202,102,15, 46,217,15,134,244,247,102,15,85,208,252,242,15,88,203,252,242,15,92,203,102, - 15,86,202,184,0,0,252,240,191,102,15,110,208,102,15,112,210,81,252,242,15, - 194,193,6,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248,105,255, - 217,124,36,4,137,68,36,8,102,184,0,12,102,11,68,36,4,102,137,68,36,6,217, - 108,36,6,217,252,252,217,108,36,4,139,68,36,8,195,255,248,147,102,15,252, - 239,210,102,15,118,210,102,15,115,210,1,184,0,0,48,67,102,15,110,216,102, - 15,112,219,81,15,40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15, - 85,208,15,40,193,252,242,15,88,203,252,242,15,92,203,184,0,0,252,240,63,102, - 15,110,216,102,15,112,219,81,252,242,15,194,193,1,102,15,84,195,252,242,15, - 92,200,102,15,86,202,15,40,193,248,1,195,248,148,255,15,40,232,252,242,15, - 94,193,102,15,252,239,210,102,15,118,210,102,15,115,210,1,184,0,0,48,67,102, - 15,110,216,102,15,112,219,81,15,40,224,102,15,84,226,102,15,46,220,15,134, - 244,247,102,15,85,208,252,242,15,88,227,252,242,15,92,227,102,15,86,226,184, - 0,0,252,240,63,102,15,110,208,102,15,112,210,81,252,242,15,194,196,1,102, - 15,84,194,252,242,15,92,224,15,40,197,252,242,15,89,204,252,242,15,92,193, - 195,248,1,252,242,15,89,200,15,40,197,252,242,15,92,193,195,255,217,193,216, - 252,241,217,124,36,4,102,184,0,4,102,11,68,36,4,102,37,252,255,252,247,102, - 137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,222,201,222,252,233,195, - 255,248,89,217,252,234,222,201,248,149,217,84,36,4,129,124,36,4,0,0,128,127, - 15,132,244,247,129,124,36,4,0,0,128,252,255,15,132,244,248,248,150,217,192, - 217,252,252,220,252,233,217,201,217,252,240,217,232,222,193,217,252,253,221, - 217,248,1,195,248,2,221,216,217,252,238,195,255,248,108,219,84,36,4,219,68, - 36,4,255,223,252,233,255,221,252,233,223,224,158,255,15,133,244,254,15,138, - 244,255,221,216,139,68,36,4,131,252,248,1,15,142,244,252,248,1,169,1,0,0, - 0,15,133,244,248,216,200,209,232,252,233,244,1,248,2,209,232,15,132,244,251, - 217,192,248,3,216,200,209,232,15,132,244,250,15,131,244,3,220,201,252,233, - 244,3,248,4,255,222,201,248,5,195,248,6,15,132,244,5,15,130,244,253,217,232, - 222,252,241,252,247,216,131,252,248,1,15,132,244,5,252,233,244,1,248,7,221, - 216,217,232,195,248,8,217,84,36,4,217,201,217,84,36,8,139,68,36,4,209,224, - 61,0,0,0,252,255,15,132,244,248,139,68,36,8,209,224,15,132,244,250,61,0,0, - 0,252,255,15,132,244,250,217,252,241,252,233,244,150,248,9,255,217,232,255, - 223,252,234,255,221,252,234,223,224,158,255,15,132,244,247,217,201,248,1, - 221,216,195,248,2,217,225,217,232,255,15,132,244,249,221,216,217,225,217, - 252,238,184,0,0,0,0,15,146,208,209,200,51,68,36,4,15,137,244,249,217,201, - 248,3,221,217,217,225,195,248,4,131,124,36,4,0,15,141,244,3,221,216,221,216, - 133,192,15,132,244,251,217,252,238,195,248,5,199,68,36,4,0,0,128,127,217, - 68,36,4,195,255,248,108,255,248,151,252,242,15,45,193,252,242,15,42,208,102, - 15,46,202,15,133,244,254,15,138,244,255,248,152,131,252,248,1,15,142,244, - 252,248,1,169,1,0,0,0,15,133,244,248,252,242,15,89,192,209,232,252,233,244, - 1,248,2,209,232,15,132,244,251,15,40,200,248,3,252,242,15,89,192,209,232, - 15,132,244,250,15,131,244,3,255,252,242,15,89,200,252,233,244,3,248,4,252, - 242,15,89,193,248,5,195,248,6,15,132,244,5,15,130,244,253,80,184,0,0,252, - 240,63,102,15,110,200,102,15,112,201,81,252,242,15,94,200,88,15,40,193,252, - 247,216,131,252,248,1,15,132,244,5,252,233,244,1,248,7,184,0,0,252,240,63, - 102,15,110,192,102,15,112,192,81,195,248,8,252,242,15,17,76,36,12,252,242, - 15,17,68,36,4,131,124,36,12,0,15,133,244,247,139,68,36,16,209,224,61,0,0, - 224,252,255,15,132,244,248,248,1,255,131,124,36,4,0,15,133,244,247,139,68, - 36,8,209,224,15,132,244,250,61,0,0,224,252,255,15,132,244,251,248,1,221,68, - 36,12,221,68,36,4,217,252,241,217,192,217,252,252,220,252,233,217,201,217, - 252,240,217,232,222,193,217,252,253,221,217,221,92,36,4,252,242,15,16,68, - 36,4,195,248,9,184,0,0,252,240,63,102,15,110,208,102,15,112,210,81,102,15, - 46,194,15,132,244,247,15,40,193,248,1,195,248,2,102,15,252,239,210,102,15, - 118,210,102,15,115,210,1,102,15,84,194,184,0,0,252,240,63,102,15,110,208, - 102,15,112,210,81,102,15,46,194,15,132,244,1,102,15,80,193,15,87,192,136, - 196,15,146,208,48,224,15,133,244,1,248,3,184,0,0,252,240,127,102,15,110,192, - 102,15,112,192,81,195,248,4,102,15,80,193,133,192,15,133,244,3,255,15,87, - 192,195,248,5,102,15,80,193,133,192,15,132,244,3,15,87,192,195,248,153,255, - 139,68,36,12,252,242,15,16,68,36,4,131,252,248,1,15,132,244,247,15,135,244, - 248,232,244,83,252,233,244,253,248,1,232,244,85,252,233,244,253,248,2,131, - 252,248,3,15,132,244,247,15,135,244,248,232,244,105,255,252,233,244,253,248, - 1,252,242,15,81,192,248,7,252,242,15,17,68,36,4,221,68,36,4,195,248,2,221, - 68,36,4,131,252,248,5,15,130,244,89,15,132,244,149,248,2,131,252,248,7,15, - 132,244,247,15,135,244,248,217,252,237,217,201,217,252,241,195,248,1,217, - 232,217,201,217,252,241,195,248,2,131,252,248,9,15,132,244,247,15,135,244, - 248,255,217,252,236,217,201,217,252,241,195,248,1,217,252,254,195,248,2,131, - 252,248,11,15,132,244,247,15,135,244,255,217,252,255,195,248,1,217,252,242, - 221,216,195,255,139,68,36,12,221,68,36,4,131,252,248,1,15,130,244,83,15,132, - 244,85,131,252,248,3,15,130,244,105,15,135,244,248,217,252,250,195,248,2, - 131,252,248,5,15,130,244,89,15,132,244,149,131,252,248,7,15,132,244,247,15, - 135,244,248,217,252,237,217,201,217,252,241,195,248,1,217,232,217,201,217, - 252,241,195,248,2,131,252,248,9,15,132,244,247,255,15,135,244,248,217,252, - 236,217,201,217,252,241,195,248,1,217,252,254,195,248,2,131,252,248,11,15, - 132,244,247,15,135,244,255,217,252,255,195,248,1,217,252,242,221,216,195, - 255,248,9,204,248,154,255,139,68,36,20,252,242,15,16,68,36,4,252,242,15,16, - 76,36,12,131,252,248,1,15,132,244,247,15,135,244,248,252,242,15,88,193,248, - 7,252,242,15,17,68,36,4,221,68,36,4,195,248,1,252,242,15,92,193,252,233,244, - 7,248,2,131,252,248,3,15,132,244,247,15,135,244,248,252,242,15,89,193,252, - 233,244,7,248,1,252,242,15,94,193,252,233,244,7,248,2,131,252,248,5,15,132, - 244,247,255,15,135,244,248,232,244,148,252,233,244,7,248,1,90,232,244,108, - 82,252,233,244,7,248,2,131,252,248,7,15,132,244,247,15,135,244,248,184,0, - 0,0,128,102,15,110,200,102,15,112,201,81,15,87,193,252,233,244,7,248,1,102, - 15,252,239,201,102,15,118,201,102,15,115,209,1,15,84,193,252,233,244,7,248, - 2,255,131,252,248,9,15,135,244,248,221,68,36,4,221,68,36,12,15,132,244,247, - 217,252,243,195,248,1,217,201,217,252,253,221,217,195,248,2,131,252,248,11, - 15,132,244,247,15,135,244,255,252,242,15,93,193,252,233,244,7,248,1,252,242, + 15,86,202,184,0,0,252,240,63,102,15,110,208,102,15,112,210,81,252,242,15, + 194,193,1,102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248,84,255, + 217,124,36,4,137,68,36,8,102,184,0,8,102,11,68,36,4,102,37,252,255,252,251, + 102,137,68,36,6,217,108,36,6,217,252,252,217,108,36,4,139,68,36,8,195,255, + 248,144,102,15,252,239,210,102,15,118,210,102,15,115,210,1,184,0,0,48,67, + 102,15,110,216,102,15,112,219,81,15,40,200,102,15,84,202,102,15,46,217,15, + 134,244,247,102,15,85,208,252,242,15,88,203,252,242,15,92,203,102,15,86,202, + 184,0,0,252,240,191,102,15,110,208,102,15,112,210,81,252,242,15,194,193,6, + 102,15,84,194,252,242,15,92,200,15,40,193,248,1,195,248,104,255,217,124,36, + 4,137,68,36,8,102,184,0,12,102,11,68,36,4,102,137,68,36,6,217,108,36,6,217, + 252,252,217,108,36,4,139,68,36,8,195,255,248,145,102,15,252,239,210,102,15, + 118,210,102,15,115,210,1,184,0,0,48,67,102,15,110,216,102,15,112,219,81,15, + 40,200,102,15,84,202,102,15,46,217,15,134,244,247,102,15,85,208,15,40,193, + 252,242,15,88,203,252,242,15,92,203,184,0,0,252,240,63,102,15,110,216,102, + 15,112,219,81,252,242,15,194,193,1,102,15,84,195,252,242,15,92,200,102,15, + 86,202,15,40,193,248,1,195,248,146,255,15,40,232,252,242,15,94,193,102,15, + 252,239,210,102,15,118,210,102,15,115,210,1,184,0,0,48,67,102,15,110,216, + 102,15,112,219,81,15,40,224,102,15,84,226,102,15,46,220,15,134,244,247,102, + 15,85,208,252,242,15,88,227,252,242,15,92,227,102,15,86,226,184,0,0,252,240, + 63,102,15,110,208,102,15,112,210,81,252,242,15,194,196,1,102,15,84,194,252, + 242,15,92,224,15,40,197,252,242,15,89,204,252,242,15,92,193,195,248,1,252, + 242,15,89,200,15,40,197,252,242,15,92,193,195,255,217,193,216,252,241,217, + 124,36,4,102,184,0,4,102,11,68,36,4,102,37,252,255,252,247,102,137,68,36, + 6,217,108,36,6,217,252,252,217,108,36,4,222,201,222,252,233,195,255,248,88, + 217,252,234,222,201,248,147,217,84,36,4,129,124,36,4,0,0,128,127,15,132,244, + 247,129,124,36,4,0,0,128,252,255,15,132,244,248,248,148,217,192,217,252,252, + 220,252,233,217,201,217,252,240,217,232,222,193,217,252,253,221,217,248,1, + 195,248,2,221,216,217,252,238,195,255,248,107,219,84,36,4,219,68,36,4,255, + 223,252,233,255,221,252,233,223,224,158,255,15,133,244,254,15,138,244,255, + 221,216,139,68,36,4,131,252,248,1,15,142,244,252,248,1,169,1,0,0,0,15,133, + 244,248,216,200,209,232,252,233,244,1,248,2,209,232,15,132,244,251,217,192, + 248,3,216,200,209,232,15,132,244,250,15,131,244,3,220,201,252,233,244,3,248, + 4,255,222,201,248,5,195,248,6,15,132,244,5,15,130,244,253,217,232,222,252, + 241,252,247,216,131,252,248,1,15,132,244,5,252,233,244,1,248,7,221,216,217, + 232,195,248,8,217,84,36,4,217,201,217,84,36,8,139,68,36,4,209,224,61,0,0, + 0,252,255,15,132,244,248,139,68,36,8,209,224,15,132,244,250,61,0,0,0,252, + 255,15,132,244,250,217,252,241,252,233,244,148,248,9,255,217,232,255,223, + 252,234,255,221,252,234,223,224,158,255,15,132,244,247,217,201,248,1,221, + 216,195,248,2,217,225,217,232,255,15,132,244,249,221,216,217,225,217,252, + 238,184,0,0,0,0,15,146,208,209,200,51,68,36,4,15,137,244,249,217,201,248, + 3,221,217,217,225,195,248,4,131,124,36,4,0,15,141,244,3,221,216,221,216,133, + 192,15,132,244,251,217,252,238,195,248,5,199,68,36,4,0,0,128,127,217,68,36, + 4,195,255,248,107,255,248,149,252,242,15,45,193,252,242,15,42,208,102,15, + 46,202,15,133,244,254,15,138,244,255,248,150,131,252,248,1,15,142,244,252, + 248,1,169,1,0,0,0,15,133,244,248,252,242,15,89,192,209,232,252,233,244,1, + 248,2,209,232,15,132,244,251,15,40,200,248,3,252,242,15,89,192,209,232,15, + 132,244,250,15,131,244,3,255,252,242,15,89,200,252,233,244,3,248,4,252,242, + 15,89,193,248,5,195,248,6,15,132,244,5,15,130,244,253,80,184,0,0,252,240, + 63,102,15,110,200,102,15,112,201,81,252,242,15,94,200,88,15,40,193,252,247, + 216,131,252,248,1,15,132,244,5,252,233,244,1,248,7,184,0,0,252,240,63,102, + 15,110,192,102,15,112,192,81,195,248,8,252,242,15,17,76,36,12,252,242,15, + 17,68,36,4,131,124,36,12,0,15,133,244,247,139,68,36,16,209,224,61,0,0,224, + 252,255,15,132,244,248,248,1,255,131,124,36,4,0,15,133,244,247,139,68,36, + 8,209,224,15,132,244,250,61,0,0,224,252,255,15,132,244,251,248,1,221,68,36, + 12,221,68,36,4,217,252,241,217,192,217,252,252,220,252,233,217,201,217,252, + 240,217,232,222,193,217,252,253,221,217,221,92,36,4,252,242,15,16,68,36,4, + 195,248,9,184,0,0,252,240,63,102,15,110,208,102,15,112,210,81,102,15,46,194, + 15,132,244,247,15,40,193,248,1,195,248,2,102,15,252,239,210,102,15,118,210, + 102,15,115,210,1,102,15,84,194,184,0,0,252,240,63,102,15,110,208,102,15,112, + 210,81,102,15,46,194,15,132,244,1,102,15,80,193,15,87,192,136,196,15,146, + 208,48,224,15,133,244,1,248,3,184,0,0,252,240,127,102,15,110,192,102,15,112, + 192,81,195,248,4,102,15,80,193,133,192,15,133,244,3,255,15,87,192,195,248, + 5,102,15,80,193,133,192,15,132,244,3,15,87,192,195,248,151,255,139,68,36, + 12,252,242,15,16,68,36,4,131,252,248,1,15,132,244,247,15,135,244,248,232, + 244,82,252,233,244,253,248,1,232,244,84,252,233,244,253,248,2,131,252,248, + 3,15,132,244,247,15,135,244,248,232,244,104,255,252,233,244,253,248,1,252, + 242,15,81,192,248,7,252,242,15,17,68,36,4,221,68,36,4,195,248,2,221,68,36, + 4,131,252,248,5,15,130,244,88,15,132,244,147,248,2,131,252,248,7,15,132,244, + 247,15,135,244,248,217,252,237,217,201,217,252,241,195,248,1,217,232,217, + 201,217,252,241,195,248,2,131,252,248,9,15,132,244,247,15,135,244,248,255, + 217,252,236,217,201,217,252,241,195,248,1,217,252,254,195,248,2,131,252,248, + 11,15,132,244,247,15,135,244,255,217,252,255,195,248,1,217,252,242,221,216, + 195,255,139,68,36,12,221,68,36,4,131,252,248,1,15,130,244,82,15,132,244,84, + 131,252,248,3,15,130,244,104,15,135,244,248,217,252,250,195,248,2,131,252, + 248,5,15,130,244,88,15,132,244,147,131,252,248,7,15,132,244,247,15,135,244, + 248,217,252,237,217,201,217,252,241,195,248,1,217,232,217,201,217,252,241, + 195,248,2,131,252,248,9,15,132,244,247,255,15,135,244,248,217,252,236,217, + 201,217,252,241,195,248,1,217,252,254,195,248,2,131,252,248,11,15,132,244, + 247,15,135,244,255,217,252,255,195,248,1,217,252,242,221,216,195,255,248, + 9,204,248,152,255,139,68,36,20,252,242,15,16,68,36,4,252,242,15,16,76,36, + 12,131,252,248,1,15,132,244,247,15,135,244,248,252,242,15,88,193,248,7,252, + 242,15,17,68,36,4,221,68,36,4,195,248,1,252,242,15,92,193,252,233,244,7,248, + 2,131,252,248,3,15,132,244,247,15,135,244,248,252,242,15,89,193,252,233,244, + 7,248,1,252,242,15,94,193,252,233,244,7,248,2,131,252,248,5,15,132,244,247, + 255,15,135,244,248,232,244,146,252,233,244,7,248,1,90,232,244,107,82,252, + 233,244,7,248,2,131,252,248,7,15,132,244,247,15,135,244,248,184,0,0,0,128, + 102,15,110,200,102,15,112,201,81,15,87,193,252,233,244,7,248,1,102,15,252, + 239,201,102,15,118,201,102,15,115,209,1,15,84,193,252,233,244,7,248,2,255, + 131,252,248,9,15,135,244,248,221,68,36,4,221,68,36,12,15,132,244,247,217, + 252,243,195,248,1,217,201,217,252,253,221,217,195,248,2,131,252,248,11,15, + 132,244,247,15,135,244,255,252,242,15,93,193,252,233,244,7,248,1,252,242, 15,95,193,252,233,244,7,248,9,204,255,139,68,36,20,221,68,36,4,221,68,36, 12,131,252,248,1,15,132,244,247,15,135,244,248,222,193,195,248,1,222,252, 233,195,248,2,131,252,248,3,15,132,244,247,15,135,244,248,222,201,195,248, - 1,222,252,249,195,248,2,131,252,248,5,15,130,244,148,15,132,244,108,131,252, + 1,222,252,249,195,248,2,131,252,248,5,15,130,244,146,15,132,244,107,131,252, 248,7,15,132,244,247,15,135,244,248,255,221,216,217,224,195,248,1,221,216, 217,225,195,248,2,131,252,248,9,15,132,244,247,15,135,244,248,217,252,243, 195,248,1,217,201,217,252,253,221,217,195,248,2,131,252,248,11,15,132,244, 247,15,135,244,255,255,219,252,233,219,209,221,217,195,248,1,219,252,233, 218,209,221,217,195,255,221,225,223,224,252,246,196,1,15,132,244,248,217, 201,248,2,221,216,195,248,1,221,225,223,224,252,246,196,1,15,133,244,248, - 217,201,248,2,221,216,195,255,248,155,156,90,137,209,129,252,242,0,0,32,0, + 217,201,248,2,221,216,195,255,248,153,156,90,137,209,129,252,242,0,0,32,0, 82,157,156,90,49,192,57,209,15,132,244,247,139,68,36,4,87,83,15,162,139,124, - 36,16,137,7,137,95,4,137,79,8,137,87,12,91,95,248,1,195,255,129,124,253,202, - 4,239,15,135,244,43,129,124,253,194,4,239,15,135,244,43,255,252,242,15,16, - 4,194,131,198,4,102,15,46,4,202,255,221,4,202,221,4,194,131,198,4,255,223, - 252,233,221,216,255,218,252,233,223,224,158,255,15,134,244,248,255,15,131, - 244,248,255,248,1,15,183,70,252,254,141,180,253,134,233,248,2,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,139,108,194,4,131, - 198,4,129,252,253,239,15,135,244,251,129,124,253,202,4,239,15,135,244,251, - 255,252,242,15,16,4,194,102,15,46,4,202,255,221,4,202,221,4,194,255,15,138, - 244,248,15,133,244,248,255,15,138,244,248,15,132,244,247,255,248,1,15,183, - 70,252,254,141,180,253,134,233,248,2,255,248,2,15,183,70,252,254,141,180, - 253,134,233,248,1,255,248,5,57,108,202,4,15,133,244,2,129,252,253,239,15, - 131,244,1,139,12,202,139,4,194,57,193,15,132,244,1,129,252,253,239,15,135, - 244,2,139,169,233,133,252,237,15,132,244,2,252,246,133,233,235,15,133,244, - 2,255,49,252,237,255,189,1,0,0,0,255,252,233,244,47,255,252,247,208,131,198, - 4,129,124,253,202,4,239,15,133,244,248,139,12,202,59,12,135,255,131,198,4, - 129,124,253,202,4,239,15,135,244,248,255,252,242,15,16,4,199,102,15,46,4, - 202,255,221,4,202,221,4,199,255,252,247,208,131,198,4,57,68,202,4,255,139, + 36,16,137,7,137,95,4,137,79,8,137,87,12,91,95,248,1,195,255,249,255,129,124, + 253,202,4,239,15,135,244,41,129,124,253,194,4,239,15,135,244,41,255,252,242, + 15,16,4,194,131,198,4,102,15,46,4,202,255,221,4,202,221,4,194,131,198,4,255, + 223,252,233,221,216,255,218,252,233,223,224,158,255,15,134,244,248,255,15, + 131,244,248,255,248,1,15,183,70,252,254,141,180,253,134,233,248,2,139,6,15, + 182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,139,108,194,4, + 131,198,4,129,252,253,239,15,135,244,251,129,124,253,202,4,239,15,135,244, + 251,255,252,242,15,16,4,194,102,15,46,4,202,255,221,4,202,221,4,194,255,15, + 138,244,248,15,133,244,248,255,15,138,244,248,15,132,244,247,255,248,1,15, + 183,70,252,254,141,180,253,134,233,248,2,255,248,2,15,183,70,252,254,141, + 180,253,134,233,248,1,255,248,5,57,108,202,4,15,133,244,2,129,252,253,239, + 15,131,244,1,139,12,202,139,4,194,57,193,15,132,244,1,129,252,253,239,15, + 135,244,2,139,169,233,133,252,237,15,132,244,2,252,246,133,233,235,15,133, + 244,2,255,49,252,237,255,189,1,0,0,0,255,252,233,244,45,255,252,247,208,131, + 198,4,129,124,253,202,4,239,15,133,244,248,139,12,202,59,12,135,255,131,198, + 4,129,124,253,202,4,239,15,135,244,248,255,252,242,15,16,4,199,102,15,46, + 4,202,255,221,4,202,221,4,199,255,252,247,208,131,198,4,57,68,202,4,255,139, 108,194,4,131,198,4,129,252,253,239,255,15,131,244,247,255,15,130,244,247, 255,137,108,202,4,139,44,194,137,44,202,255,15,183,70,252,254,141,180,253, 134,233,248,1,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, 171,255,139,108,194,4,139,4,194,137,108,202,4,137,4,202,139,6,15,182,204, 15,182,232,131,198,4,193,232,16,252,255,36,171,255,49,252,237,129,124,253, 194,4,239,129,213,239,137,108,202,4,139,6,15,182,204,15,182,232,131,198,4, - 193,232,16,252,255,36,171,255,129,124,253,194,4,239,15,135,244,50,255,252, + 193,232,16,252,255,36,171,255,129,124,253,194,4,239,15,135,244,48,255,252, 242,15,16,4,194,184,0,0,0,128,102,15,110,200,102,15,112,201,81,15,87,193, 252,242,15,17,4,202,255,221,4,194,217,224,221,28,202,255,129,124,253,194, 4,239,15,133,244,248,139,4,194,255,15,87,192,252,242,15,42,128,233,248,1, 252,242,15,17,4,202,255,219,128,233,248,1,221,28,202,255,139,6,15,182,204, 15,182,232,131,198,4,193,232,16,252,255,36,171,248,2,129,124,253,194,4,239, - 15,133,244,52,139,12,194,137,213,232,251,1,18,255,252,242,15,42,192,137,252, + 15,133,244,50,139,12,194,137,213,232,251,1,18,255,252,242,15,42,192,137,252, 234,255,137,4,36,137,252,234,219,4,36,255,15,182,78,252,253,252,233,244,1, - 255,15,182,252,236,15,182,192,255,129,124,253,252,234,4,239,15,135,244,48, + 255,15,182,252,236,15,182,192,255,129,124,253,252,234,4,239,15,135,244,46, 255,252,242,15,16,4,252,234,252,242,15,88,4,199,255,221,4,252,234,220,4,199, - 255,129,124,253,252,234,4,239,15,135,244,49,255,252,242,15,16,4,199,252,242, + 255,129,124,253,252,234,4,239,15,135,244,47,255,252,242,15,16,4,199,252,242, 15,88,4,252,234,255,221,4,199,220,4,252,234,255,129,124,253,252,234,4,239, - 15,135,244,51,129,124,253,194,4,239,15,135,244,51,255,252,242,15,16,4,252, + 15,135,244,49,129,124,253,194,4,239,15,135,244,49,255,252,242,15,16,4,252, 234,252,242,15,88,4,194,255,221,4,252,234,220,4,194,255,252,242,15,16,4,252, 234,252,242,15,92,4,199,255,221,4,252,234,220,36,199,255,252,242,15,16,4, 199,252,242,15,92,4,252,234,255,221,4,199,220,36,252,234,255,252,242,15,16, @@ -594,10 +576,10 @@ static const unsigned char build_actionlist[15199] = { 52,194,255,252,242,15,16,4,252,234,252,242,15,16,12,199,255,221,4,252,234, 221,4,199,255,252,242,15,16,4,199,252,242,15,16,12,252,234,255,221,4,199, 221,4,252,234,255,252,242,15,16,4,252,234,252,242,15,16,12,194,255,221,4, - 252,234,221,4,194,255,248,156,232,244,148,255,252,233,244,156,255,232,244, - 108,255,15,182,252,236,15,182,192,141,12,194,41,232,137,76,36,4,137,68,36, - 8,248,35,139,108,36,48,137,44,36,137,149,233,137,116,36,24,232,251,1,23,139, - 149,233,133,192,15,133,244,44,15,182,110,252,255,15,182,78,252,253,139,68, + 252,234,221,4,194,255,248,154,232,244,146,255,252,233,244,154,255,232,244, + 107,255,15,182,252,236,15,182,192,141,12,194,41,232,137,76,36,4,137,68,36, + 8,248,33,139,108,36,48,137,44,36,137,149,233,137,116,36,24,232,251,1,23,139, + 149,233,133,192,15,133,244,42,15,182,110,252,255,15,182,78,252,253,139,68, 252,234,4,139,44,252,234,137,68,202,4,137,44,202,139,6,15,182,204,15,182, 232,131,198,4,193,232,16,252,255,36,171,255,252,247,208,139,4,135,199,68, 202,4,237,137,4,202,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252, @@ -619,96 +601,99 @@ static const unsigned char build_actionlist[15199] = { 4,193,232,16,252,255,36,171,248,2,252,246,129,233,235,15,132,244,1,128,189, 233,0,15,132,244,1,137,213,137,194,141,139,233,232,251,1,24,137,252,234,252, 233,244,1,255,139,106,252,248,255,252,242,15,16,4,199,255,139,172,253,141, - 233,139,141,233,255,252,247,208,139,106,252,248,139,172,253,141,233,139,141, - 233,137,65,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, - 171,255,141,180,253,134,233,139,108,36,48,131,189,233,0,15,132,244,247,137, - 149,233,141,20,202,137,252,233,232,251,1,25,139,149,233,248,1,139,6,15,182, - 204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,252,247,208,139,74, - 252,248,139,4,135,139,108,36,48,137,76,36,8,137,68,36,4,137,44,36,137,149, - 233,137,116,36,24,232,251,1,26,139,149,233,15,182,78,252,253,137,4,202,199, - 68,202,4,237,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, - 171,255,137,197,37,252,255,7,0,0,193,252,237,11,61,252,255,7,0,0,15,132,244, - 249,248,2,137,108,36,8,139,108,36,48,137,68,36,4,137,116,36,24,139,131,233, - 137,44,36,59,131,233,137,149,233,15,131,244,251,248,1,232,251,1,27,139,149, + 233,139,141,233,255,252,242,15,17,1,255,221,25,255,252,247,208,139,106,252, + 248,139,172,253,141,233,139,141,233,137,65,4,139,6,15,182,204,15,182,232, + 131,198,4,193,232,16,252,255,36,171,255,141,180,253,134,233,139,108,36,48, + 131,189,233,0,15,132,244,247,137,149,233,141,20,202,137,252,233,232,251,1, + 25,139,149,233,248,1,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252, + 255,36,171,255,252,247,208,139,74,252,248,139,4,135,139,108,36,48,137,76, + 36,8,137,68,36,4,137,44,36,137,149,233,137,116,36,24,232,251,1,26,139,149, 233,15,182,78,252,253,137,4,202,199,68,202,4,237,139,6,15,182,204,15,182, - 232,131,198,4,193,232,16,252,255,36,171,248,3,184,1,8,0,0,252,233,244,2,248, - 5,137,252,233,232,251,1,28,252,233,244,1,255,252,247,208,139,108,36,48,139, - 139,233,137,116,36,24,59,139,233,137,149,233,15,131,244,249,248,2,139,20, - 135,137,252,233,232,251,1,29,139,149,233,15,182,78,252,253,137,4,202,199, - 68,202,4,237,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, - 171,248,3,137,252,233,232,251,1,28,15,183,70,252,254,252,247,208,252,233, - 244,2,255,252,247,208,139,106,252,248,139,173,233,139,4,135,252,233,244,157, - 255,252,247,208,139,106,252,248,139,173,233,139,4,135,252,233,244,158,255, - 15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,38,139,44, - 252,234,129,124,253,194,4,239,15,135,244,251,255,252,242,15,16,4,194,252, - 242,15,45,192,252,242,15,42,200,102,15,46,193,255,221,4,194,219,20,36,219, - 4,36,255,15,133,244,38,59,133,233,15,131,244,38,193,224,3,3,133,233,129,120, - 253,4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137,68,202,4,139, - 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,2,131,189, - 233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244,38,15,182,78, - 252,253,252,233,244,1,248,5,255,129,124,253,194,4,239,15,133,244,38,139,4, - 194,252,233,244,157,255,15,182,252,236,15,182,192,252,247,208,139,4,135,129, - 124,253,252,234,4,239,15,133,244,36,139,44,252,234,248,157,139,141,233,35, - 136,233,105,201,239,3,141,233,248,1,129,185,233,239,15,133,244,250,57,129, - 233,15,133,244,250,129,121,253,4,239,15,132,244,251,15,182,70,252,253,139, - 41,139,73,4,137,44,194,248,2,255,137,76,194,4,139,6,15,182,204,15,182,232, - 131,198,4,193,232,16,252,255,36,171,248,3,15,182,70,252,253,185,237,252,233, - 244,2,248,4,139,137,233,133,201,15,133,244,1,248,5,139,141,233,133,201,15, - 132,244,3,252,246,129,233,235,15,133,244,3,252,233,244,36,255,15,182,252, - 236,15,182,192,129,124,253,252,234,4,239,15,133,244,37,139,44,252,234,59, - 133,233,15,131,244,37,193,224,3,3,133,233,129,120,253,4,239,15,132,244,248, - 248,1,139,40,139,64,4,137,44,202,137,68,202,4,139,6,15,182,204,15,182,232, - 131,198,4,193,232,16,252,255,36,171,248,2,131,189,233,0,15,132,244,1,139, - 141,233,252,246,129,233,235,15,132,244,37,255,15,182,252,236,15,182,192,129, - 124,253,252,234,4,239,15,133,244,41,139,44,252,234,129,124,253,194,4,239, - 15,135,244,251,255,15,133,244,41,59,133,233,15,131,244,41,193,224,3,3,133, + 232,131,198,4,193,232,16,252,255,36,171,255,137,197,37,252,255,7,0,0,193, + 252,237,11,61,252,255,7,0,0,15,132,244,249,248,2,137,108,36,8,139,108,36, + 48,137,68,36,4,137,116,36,24,139,131,233,137,44,36,59,131,233,137,149,233, + 15,131,244,251,248,1,232,251,1,27,139,149,233,15,182,78,252,253,137,4,202, + 199,68,202,4,237,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255, + 36,171,248,3,184,1,8,0,0,252,233,244,2,248,5,137,252,233,232,251,1,28,252, + 233,244,1,255,252,247,208,139,108,36,48,139,139,233,137,116,36,24,59,139, + 233,137,149,233,15,131,244,249,248,2,139,20,135,137,252,233,232,251,1,29, + 139,149,233,15,182,78,252,253,137,4,202,199,68,202,4,237,139,6,15,182,204, + 15,182,232,131,198,4,193,232,16,252,255,36,171,248,3,137,252,233,232,251, + 1,28,15,183,70,252,254,252,247,208,252,233,244,2,255,252,247,208,139,106, + 252,248,139,173,233,139,4,135,252,233,244,155,255,252,247,208,139,106,252, + 248,139,173,233,139,4,135,252,233,244,156,255,15,182,252,236,15,182,192,129, + 124,253,252,234,4,239,15,133,244,36,139,44,252,234,129,124,253,194,4,239, + 15,135,244,251,255,252,242,15,16,4,194,252,242,15,45,192,252,242,15,42,200, + 102,15,46,193,255,221,4,194,219,20,36,219,4,36,255,15,133,244,36,59,133,233, + 15,131,244,36,193,224,3,3,133,233,129,120,253,4,239,15,132,244,248,248,1, + 139,40,139,64,4,137,44,202,137,68,202,4,139,6,15,182,204,15,182,232,131,198, + 4,193,232,16,252,255,36,171,248,2,131,189,233,0,15,132,244,1,139,141,233, + 252,246,129,233,235,15,132,244,36,15,182,78,252,253,252,233,244,1,248,5,255, + 129,124,253,194,4,239,15,133,244,36,139,4,194,252,233,244,155,255,15,182, + 252,236,15,182,192,252,247,208,139,4,135,129,124,253,252,234,4,239,15,133, + 244,34,139,44,252,234,248,155,139,141,233,35,136,233,105,201,239,3,141,233, + 248,1,129,185,233,239,15,133,244,250,57,129,233,15,133,244,250,129,121,253, + 4,239,15,132,244,251,15,182,70,252,253,139,41,139,73,4,137,44,194,248,2,255, + 137,76,194,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36, + 171,248,3,15,182,70,252,253,185,237,252,233,244,2,248,4,139,137,233,133,201, + 15,133,244,1,248,5,139,141,233,133,201,15,132,244,3,252,246,129,233,235,15, + 133,244,3,252,233,244,34,255,15,182,252,236,15,182,192,129,124,253,252,234, + 4,239,15,133,244,35,139,44,252,234,59,133,233,15,131,244,35,193,224,3,3,133, + 233,129,120,253,4,239,15,132,244,248,248,1,139,40,139,64,4,137,44,202,137, + 68,202,4,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171, + 248,2,131,189,233,0,15,132,244,1,139,141,233,252,246,129,233,235,15,132,244, + 35,255,15,182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,39, + 139,44,252,234,129,124,253,194,4,239,15,135,244,251,255,15,133,244,39,59, + 133,233,15,131,244,39,193,224,3,3,133,233,129,120,253,4,239,15,132,244,249, + 248,1,252,246,133,233,235,15,133,244,253,248,2,139,108,202,4,139,12,202,137, + 104,4,137,8,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171, + 248,3,131,189,233,0,15,132,244,1,139,141,233,255,252,246,129,233,235,15,132, + 244,39,15,182,78,252,253,252,233,244,1,248,5,129,124,253,194,4,239,15,133, + 244,39,139,4,194,252,233,244,156,248,7,128,165,233,235,139,139,233,137,171, + 233,137,141,233,15,182,78,252,253,252,233,244,2,255,15,182,252,236,15,182, + 192,252,247,208,139,4,135,129,124,253,252,234,4,239,15,133,244,37,139,44, + 252,234,248,156,139,141,233,35,136,233,105,201,239,198,133,233,0,3,141,233, + 248,1,129,185,233,239,15,133,244,251,57,129,233,15,133,244,251,129,121,253, + 4,239,15,132,244,250,248,2,255,252,246,133,233,235,15,133,244,253,248,3,15, + 182,70,252,253,139,108,194,4,139,4,194,137,105,4,137,1,139,6,15,182,204,15, + 182,232,131,198,4,193,232,16,252,255,36,171,248,4,131,189,233,0,15,132,244, + 2,137,76,36,16,139,141,233,252,246,129,233,235,15,132,244,37,139,76,36,16, + 252,233,244,2,248,5,139,137,233,133,201,15,133,244,1,255,139,141,233,133, + 201,15,132,244,252,252,246,129,233,235,15,132,244,37,248,6,137,68,36,16,199, + 68,36,20,237,137,108,36,12,141,68,36,16,137,108,36,4,139,108,36,48,137,68, + 36,8,137,44,36,137,149,233,137,116,36,24,232,251,1,30,139,149,233,139,108, + 36,12,137,193,252,233,244,2,248,7,128,165,233,235,139,131,233,137,171,233, + 137,133,233,252,233,244,3,255,15,182,252,236,15,182,192,129,124,253,252,234, + 4,239,15,133,244,38,139,44,252,234,59,133,233,15,131,244,38,193,224,3,3,133, 233,129,120,253,4,239,15,132,244,249,248,1,252,246,133,233,235,15,133,244, 253,248,2,139,108,202,4,139,12,202,137,104,4,137,8,139,6,15,182,204,15,182, 232,131,198,4,193,232,16,252,255,36,171,248,3,131,189,233,0,15,132,244,1, - 139,141,233,255,252,246,129,233,235,15,132,244,41,15,182,78,252,253,252,233, - 244,1,248,5,129,124,253,194,4,239,15,133,244,41,139,4,194,252,233,244,158, - 248,7,128,165,233,235,139,139,233,137,171,233,137,141,233,15,182,78,252,253, - 252,233,244,2,255,15,182,252,236,15,182,192,252,247,208,139,4,135,129,124, - 253,252,234,4,239,15,133,244,39,139,44,252,234,248,158,139,141,233,35,136, - 233,105,201,239,198,133,233,0,3,141,233,248,1,129,185,233,239,15,133,244, - 251,57,129,233,15,133,244,251,129,121,253,4,239,15,132,244,250,248,2,255, - 252,246,133,233,235,15,133,244,253,248,3,15,182,70,252,253,139,108,194,4, - 139,4,194,137,105,4,137,1,139,6,15,182,204,15,182,232,131,198,4,193,232,16, - 252,255,36,171,248,4,131,189,233,0,15,132,244,2,137,76,36,16,139,141,233, - 252,246,129,233,235,15,132,244,39,139,76,36,16,252,233,244,2,248,5,139,137, - 233,133,201,15,133,244,1,255,139,141,233,133,201,15,132,244,252,252,246,129, - 233,235,15,132,244,39,248,6,137,68,36,16,199,68,36,20,237,137,108,36,12,141, - 68,36,16,137,108,36,4,139,108,36,48,137,68,36,8,137,44,36,137,149,233,137, - 116,36,24,232,251,1,30,139,149,233,139,108,36,12,137,193,252,233,244,2,248, - 7,128,165,233,235,139,131,233,137,171,233,137,133,233,252,233,244,3,255,15, - 182,252,236,15,182,192,129,124,253,252,234,4,239,15,133,244,40,139,44,252, - 234,59,133,233,15,131,244,40,193,224,3,3,133,233,129,120,253,4,239,15,132, - 244,249,248,1,252,246,133,233,235,15,133,244,253,248,2,139,108,202,4,139, - 12,202,137,104,4,137,8,139,6,15,182,204,15,182,232,131,198,4,193,232,16,252, - 255,36,171,248,3,131,189,233,0,15,132,244,1,255,139,141,233,252,246,129,233, - 235,15,132,244,40,15,182,78,252,253,252,233,244,1,248,7,128,165,233,235,139, - 139,233,137,171,233,137,141,233,15,182,78,252,253,252,233,244,2,255,137,124, - 36,16,255,221,4,199,219,92,36,12,255,248,1,141,12,202,139,105,252,248,252, - 246,133,233,235,15,133,244,253,248,2,139,68,36,20,255,252,242,15,45,252,248, - 255,139,124,36,12,255,131,232,1,15,132,244,250,1,252,248,59,133,233,15,131, - 244,251,41,252,248,193,231,3,3,189,233,248,3,139,41,137,47,139,105,4,131, - 193,8,137,111,4,131,199,8,131,232,1,15,133,244,3,248,4,139,124,36,16,139, - 6,15,182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,248,5,137,108, - 36,4,139,108,36,48,137,149,233,137,68,36,8,137,44,36,137,116,36,24,232,251, - 1,31,139,149,233,15,182,78,252,253,252,233,244,1,248,7,128,165,233,235,139, - 131,233,137,171,233,255,137,133,233,252,233,244,2,255,3,68,36,20,255,141, - 76,202,8,139,105,252,248,129,121,253,252,252,239,15,133,244,31,252,255,165, - 233,255,141,76,202,8,137,215,139,105,252,248,129,121,253,252,252,239,15,133, - 244,31,248,53,139,114,252,252,252,247,198,237,15,133,244,253,248,1,137,106, - 252,248,137,68,36,20,131,232,1,15,132,244,249,248,2,139,41,137,47,139,105, - 4,137,111,4,131,199,8,131,193,8,131,232,1,15,133,244,2,139,106,252,248,248, - 3,137,209,128,189,233,1,15,135,244,251,248,4,139,68,36,20,252,255,165,233, - 248,5,255,252,247,198,237,15,133,244,4,15,182,70,252,253,252,247,208,141, - 20,194,139,122,252,248,139,191,233,139,191,233,252,233,244,4,248,7,15,139, + 255,139,141,233,252,246,129,233,235,15,132,244,38,15,182,78,252,253,252,233, + 244,1,248,7,128,165,233,235,139,139,233,137,171,233,137,141,233,15,182,78, + 252,253,252,233,244,2,255,137,124,36,16,255,221,4,199,219,92,36,12,255,248, + 1,141,12,202,139,105,252,248,252,246,133,233,235,15,133,244,253,248,2,139, + 68,36,20,255,252,242,15,45,252,248,255,139,124,36,12,255,131,232,1,15,132, + 244,250,1,252,248,59,133,233,15,131,244,251,41,252,248,193,231,3,3,189,233, + 248,3,139,41,137,47,139,105,4,131,193,8,137,111,4,131,199,8,131,232,1,15, + 133,244,3,248,4,139,124,36,16,139,6,15,182,204,15,182,232,131,198,4,193,232, + 16,252,255,36,171,248,5,137,108,36,4,139,108,36,48,137,149,233,137,68,36, + 8,137,44,36,137,116,36,24,232,251,1,31,139,149,233,15,182,78,252,253,252, + 233,244,1,248,7,128,165,233,235,139,131,233,137,171,233,255,137,133,233,252, + 233,244,2,255,3,68,36,20,255,129,124,253,202,4,239,139,44,202,15,133,244, + 51,141,84,202,8,137,114,252,252,139,181,233,139,14,15,182,252,233,15,182, + 205,131,198,4,252,255,36,171,255,141,76,202,8,137,215,139,105,252,248,129, + 121,253,252,252,239,15,133,244,28,248,52,139,114,252,252,252,247,198,237, + 15,133,244,253,248,1,137,106,252,248,137,68,36,20,131,232,1,15,132,244,249, + 248,2,139,41,137,47,139,105,4,137,111,4,131,199,8,131,193,8,131,232,1,15, + 133,244,2,139,106,252,248,248,3,139,68,36,20,128,189,233,1,15,135,244,251, + 248,4,139,181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255,36,171, + 248,5,255,252,247,198,237,15,133,244,4,15,182,78,252,253,252,247,209,141, + 12,202,139,121,252,248,139,191,233,139,191,233,252,233,244,4,248,7,15,139, 244,1,131,230,252,248,41,252,242,137,215,139,114,252,252,252,233,244,1,255, 141,76,202,8,139,105,232,139,65,252,236,137,41,137,65,4,139,105,252,240,139, 65,252,244,137,105,8,137,65,12,139,105,224,139,65,228,137,105,252,248,137, - 65,252,252,129,252,248,239,184,3,0,0,0,15,133,244,31,252,255,165,233,255, + 65,252,252,129,252,248,239,184,237,15,133,244,28,137,202,137,114,252,252, + 139,181,233,139,14,15,182,252,233,15,182,205,131,198,4,252,255,36,171,255, 15,182,252,236,139,66,252,248,141,12,202,139,128,233,15,182,128,233,137,124, 36,16,141,188,253,194,233,43,122,252,252,133,252,237,15,132,244,251,141,108, 252,233,252,248,57,215,15,131,244,248,248,1,139,71,252,248,137,1,139,71,252, @@ -721,7 +706,7 @@ static const unsigned char build_actionlist[15199] = { 215,15,130,244,6,252,233,244,3,248,7,137,149,233,137,141,233,137,116,36,24, 41,215,139,84,36,20,131,252,234,1,137,252,233,232,251,1,0,139,149,233,139, 141,233,1,215,252,233,244,6,255,193,225,3,255,248,1,139,114,252,252,137,68, - 36,20,252,247,198,237,15,133,244,253,255,248,17,137,215,131,232,1,15,132, + 36,20,252,247,198,237,15,133,244,253,255,248,13,137,215,131,232,1,15,132, 244,249,248,2,139,44,15,137,111,252,248,139,108,15,4,137,111,252,252,131, 199,8,131,232,1,15,133,244,2,248,3,139,68,36,20,15,182,110,252,255,248,5, 57,197,15,135,244,252,255,139,108,10,4,137,106,252,252,139,44,10,137,106, @@ -729,10 +714,10 @@ static const unsigned char build_actionlist[15199] = { 247,209,141,20,202,139,122,252,248,139,191,233,139,191,233,139,6,15,182,204, 15,182,232,131,198,4,193,232,16,252,255,36,171,248,6,255,199,71,252,252,237, 131,199,8,255,199,68,194,252,244,237,255,131,192,1,252,233,244,5,248,7,15, - 139,244,18,131,230,252,248,41,252,242,255,1,252,241,255,137,252,245,209,252, - 237,129,229,239,102,131,172,253,43,233,1,15,132,244,141,255,141,12,202,255, - 129,121,253,4,239,15,135,244,54,129,121,253,12,239,15,135,244,54,255,139, - 105,20,255,129,252,253,239,15,135,244,54,255,252,242,15,16,1,252,242,15,16, + 139,244,14,131,230,252,248,41,252,242,255,1,252,241,255,137,252,245,209,252, + 237,129,229,239,102,131,172,253,43,233,1,15,132,244,139,255,141,12,202,255, + 129,121,253,4,239,15,135,244,53,129,121,253,12,239,15,135,244,53,255,139, + 105,20,255,129,252,253,239,15,135,244,53,255,252,242,15,16,1,252,242,15,16, 73,8,255,252,242,15,88,65,16,252,242,15,17,1,133,252,237,15,136,244,249,255, 15,140,244,249,255,102,15,46,200,248,1,252,242,15,17,65,24,255,221,65,8,221, 1,255,220,65,16,221,17,221,81,24,133,252,237,15,136,244,247,255,221,81,24, @@ -743,32 +728,44 @@ static const unsigned char build_actionlist[15199] = { 252,139,41,137,105,252,248,252,233,245,255,141,180,253,134,233,139,1,137, 105,252,252,137,65,252,248,255,139,139,233,139,4,129,139,128,233,139,108, 36,48,137,147,233,137,171,233,252,255,224,255,141,180,253,134,233,139,6,15, - 182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,254,0 + 182,204,15,182,232,131,198,4,193,232,16,252,255,36,171,255,139,190,233,139, + 108,36,48,141,12,202,59,141,233,15,135,244,23,15,182,142,233,57,200,15,134, + 244,249,248,2,255,15,183,70,252,254,252,233,245,255,248,3,199,68,194,252, + 252,237,131,192,1,57,200,15,134,244,3,252,233,244,2,255,141,44,197,237,141, + 4,194,139,122,252,248,137,104,252,252,137,120,252,248,139,108,36,48,141,12, + 200,59,141,233,15,135,244,22,137,209,137,194,15,182,174,233,133,252,237,15, + 132,244,248,248,1,131,193,8,57,209,15,131,244,249,139,121,252,248,137,56, + 139,121,252,252,137,120,4,131,192,8,199,65,252,252,237,131,252,237,1,15,133, + 244,1,248,2,255,139,190,233,139,6,15,182,204,15,182,232,131,198,4,193,232, + 16,252,255,36,171,255,248,3,199,64,4,237,131,192,8,131,252,237,1,15,133,244, + 3,252,233,244,2,255,139,106,252,248,139,189,233,139,108,36,48,141,68,194, + 252,248,137,149,233,141,136,233,59,141,233,137,133,233,255,137,44,36,255, + 137,124,36,4,137,44,36,255,15,135,244,21,199,131,233,237,255,252,255,215, + 255,252,255,147,233,255,199,131,233,237,139,149,233,141,12,194,252,247,217, + 3,141,233,139,114,252,252,252,233,244,12,255,254,0 }; enum { - GLOB_gate_lf, - GLOB_gate_lf_growstack, - GLOB_gate_lv, - GLOB_gate_lv_growstack, - GLOB_gate_cwrap, - GLOB_gate_c_growstack, + GLOB_vm_returnp, + GLOB_cont_dispatch, GLOB_vm_returnc, GLOB_BC_RET_Z, GLOB_vm_return, - GLOB_gate_c, - GLOB_vm_returnp, GLOB_vm_leave_cp, GLOB_vm_leave_unw, GLOB_vm_unwind_c, GLOB_vm_unwind_c_eh, GLOB_vm_unwind_ff, GLOB_vm_unwind_ff_eh, - GLOB_cont_dispatch, + GLOB_vm_growstack_c, + GLOB_vm_growstack_v, + GLOB_vm_growstack_f, GLOB_vm_resume, GLOB_vm_pcall, GLOB_vm_call, + GLOB_vm_call_dispatch, GLOB_vmeta_call, + GLOB_vm_call_dispatch_f, GLOB_vm_cpcall, GLOB_cont_cat, GLOB_cont_ra, @@ -790,6 +787,7 @@ enum { GLOB_vmeta_unm, GLOB_vmeta_arith_vv, GLOB_vmeta_len, + GLOB_vmeta_call_ra, GLOB_BC_CALLT_Z, GLOB_vmeta_for, GLOB_ff_assert, @@ -863,12 +861,11 @@ enum { GLOB_ff_table_getn, GLOB_ff_bit_tobit, GLOB_ff_bit_band, - GLOB_fff_resbit_op, + GLOB_fff_resbit, GLOB_fff_fallback_bit_op, GLOB_ff_bit_bor, GLOB_ff_bit_bxor, GLOB_ff_bit_bswap, - GLOB_fff_resbit, GLOB_ff_bit_bnot, GLOB_ff_bit_lshift, GLOB_ff_bit_rshift, @@ -899,28 +896,26 @@ enum { GLOB__MAX }; static const char *const globnames[] = { - "gate_lf", - "gate_lf_growstack", - "gate_lv", - "gate_lv_growstack", - "gate_cwrap", - "gate_c_growstack", + "vm_returnp", + "cont_dispatch", "vm_returnc", "BC_RET_Z", "vm_return", - "gate_c", - "vm_returnp", "vm_leave_cp", "vm_leave_unw", "vm_unwind_c@8", "vm_unwind_c_eh", "vm_unwind_ff@4", "vm_unwind_ff_eh", - "cont_dispatch", + "vm_growstack_c", + "vm_growstack_v", + "vm_growstack_f", "vm_resume", "vm_pcall", "vm_call", + "vm_call_dispatch", "vmeta_call", + "vm_call_dispatch_f", "vm_cpcall", "cont_cat", "cont_ra", @@ -942,6 +937,7 @@ static const char *const globnames[] = { "vmeta_unm", "vmeta_arith_vv", "vmeta_len", + "vmeta_call_ra", "BC_CALLT_Z", "vmeta_for", "ff_assert", @@ -1015,12 +1011,11 @@ static const char *const globnames[] = { "ff_table_getn", "ff_bit_tobit", "ff_bit_band", - "fff_resbit_op", + "fff_resbit", "fff_fallback_bit_op", "ff_bit_bor", "ff_bit_bxor", "ff_bit_bswap", - "fff_resbit", "ff_bit_bnot", "ff_bit_lshift", "ff_bit_rshift", @@ -1108,451 +1103,426 @@ static const char *const extnames[] = { static void build_subroutines(BuildCtx *ctx, int cmov, int sse) { dasm_put(Dst, 0); - dasm_put(Dst, 2, Dt7(->pc), PC2PROTO(framesize), PC2PROTO(k), Dt1(->maxstack), PC2PROTO(numparams)); -#if LJ_HASJIT -#endif - dasm_put(Dst, 47, LJ_TNIL, FRAME_VARG, -FRAME_VARG, Dt7(->pc), PC2PROTO(framesize), Dt1(->maxstack), PC2PROTO(numparams)); - dasm_put(Dst, 156, LJ_TNIL, PC2PROTO(k)); -#if LJ_HASJIT -#endif - dasm_put(Dst, 191, LJ_TNIL, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), DISPATCH_GL(vmstate), ~LJ_VMST_C, DISPATCH_GL(wrapf), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 287, Dt1(->top), FRAME_TYPE, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), DISPATCH_GL(vmstate), ~LJ_VMST_C, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 369, Dt1(->top), FRAME_TYPE, FRAME_C, DISPATCH_GL(vmstate), ~LJ_VMST_C, Dt1(->base)); - dasm_put(Dst, 474, Dt1(->top), Dt1(->cframe), Dt1(->maxstack), LJ_TNIL); - dasm_put(Dst, 558, Dt1(->top), Dt1(->top), Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); - dasm_put(Dst, 651, FRAME_P, LJ_TTRUE, LUA_MINSTACK, PC2PROTO(framesize), Dt1(->base), Dt1(->top), Dt1(->base)); - dasm_put(Dst, 741, Dt1(->top), Dt7(->gate), FRAME_CP, CFRAME_RESUME, Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE); - dasm_put(Dst, 861, FRAME_CP, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top), LJ_TFUNC, Dt7(->gate)); - dasm_put(Dst, 964, Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), FRAME_CP, LJ_TNIL, Dt7(->pc), PC2PROTO(k), LJ_TSTR); - dasm_put(Dst, 1153, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB); + dasm_put(Dst, 2, FRAME_P, LJ_TTRUE, FRAME_TYPE, FRAME_C, DISPATCH_GL(vmstate), ~LJ_VMST_C); + dasm_put(Dst, 110, Dt1(->base), Dt1(->top), Dt1(->cframe), Dt1(->maxstack), LJ_TNIL); + dasm_put(Dst, 196, Dt1(->top), Dt1(->top), Dt1(->glref), Dt2(->vmstate), ~LJ_VMST_C, CFRAME_RAWMASK, 1+1); + dasm_put(Dst, 284, Dt1(->base), Dt1(->glref), GG_G2DISP, LJ_TFALSE, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, LUA_MINSTACK, -4+PC2PROTO(framesize), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 350, Dt1(->base), Dt1(->top), Dt7(->pc), FRAME_CP, CFRAME_RESUME, Dt1(->glref), GG_G2DISP, Dt1(->cframe), Dt1(->status), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->status), Dt1(->base), Dt1(->top), FRAME_TYPE); + dasm_put(Dst, 497, FRAME_CP, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 588, LJ_TFUNC, Dt7(->pc), Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), FRAME_CP, LJ_TNIL, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 760, LJ_TSTR, BC_GGET, DISPATCH_GL(tmptv), LJ_TTAB); if (sse) { - dasm_put(Dst, 1189); + dasm_put(Dst, 856); } else { - dasm_put(Dst, 1202); + dasm_put(Dst, 869); } - dasm_put(Dst, 1215, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, Dt7(->gate), LJ_TSTR, BC_GSET, DISPATCH_GL(tmptv)); - dasm_put(Dst, 1373, LJ_TTAB); + dasm_put(Dst, 882, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 2+1, LJ_TSTR, BC_GSET); + dasm_put(Dst, 1034, DISPATCH_GL(tmptv), LJ_TTAB); if (sse) { - dasm_put(Dst, 1189); + dasm_put(Dst, 856); } else { - dasm_put(Dst, 1202); + dasm_put(Dst, 869); } - dasm_put(Dst, 1393, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, Dt7(->gate), Dt1(->base), Dt1(->base)); - dasm_put(Dst, 1600, -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND, Dt1(->base)); - dasm_put(Dst, 1711, Dt1(->base), Dt1(->base), FRAME_CONT, LJ_TFUNC); - dasm_put(Dst, 1840, Dt7(->gate), Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base), Dt7(->gate), Dt1(->base), Dt1(->base), BC__MAX*4, 1+1); - dasm_put(Dst, 2000, LJ_TISTRUECOND, 1+1, ~LJ_TNUMX); + dasm_put(Dst, 1057, Dt1(->base), Dt1(->base), Dt1(->top), FRAME_CONT, 3+1, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 1251, -BCBIAS_J*4, LJ_TISTRUECOND, LJ_TISTRUECOND, Dt1(->base)); + dasm_put(Dst, 1358, Dt1(->base), Dt1(->base), FRAME_CONT); + dasm_put(Dst, 1482, 2+1, Dt1(->base), Dt1(->base), Dt1(->base), Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base), GG_DISP2STATIC); + dasm_put(Dst, 1663, 1+1, LJ_TISTRUECOND, 1+1, ~LJ_TNUMX); if (cmov) { - dasm_put(Dst, 2096); + dasm_put(Dst, 1765); } else { - dasm_put(Dst, 2100); + dasm_put(Dst, 1769); } - dasm_put(Dst, 2109, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(mmname)+4*MM_metatable, LJ_TTAB, Dt6(->hmask)); - dasm_put(Dst, 2197, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL); - dasm_put(Dst, 2252, LJ_TUDATA, LJ_TISNUM, LJ_TNUMX, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB); - dasm_put(Dst, 2324, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); - dasm_put(Dst, 2389, 2+1, LJ_TTAB, 1+1, LJ_TISNUM); + dasm_put(Dst, 1778, ((char *)(&((GCfuncC *)0)->upvalue)), LJ_TSTR, 1+1, LJ_TTAB, Dt6(->metatable), LJ_TNIL, DISPATCH_GL(mmname)+4*MM_metatable, LJ_TTAB, Dt6(->hmask)); + dasm_put(Dst, 1866, Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), DtB(->next), LJ_TNIL); + dasm_put(Dst, 1921, LJ_TUDATA, LJ_TISNUM, LJ_TNUMX, DISPATCH_GL(gcroot[GCROOT_BASEMT]), 2+1, LJ_TTAB); + dasm_put(Dst, 1989, Dt6(->metatable), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 2058, 2+1, LJ_TTAB, 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 2480); + dasm_put(Dst, 2145); } else { - dasm_put(Dst, 2490); + dasm_put(Dst, 2155); } - dasm_put(Dst, 2497, 1+1, LJ_TSTR, LJ_TSTR, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); - dasm_put(Dst, 2559, Dt1(->base), Dt1(->base), 1+1, LJ_TTAB, Dt1(->base)); - dasm_put(Dst, 2649, Dt1(->base), 1+2, LJ_TNIL, LJ_TNIL, 1+1, LJ_TTAB); - dasm_put(Dst, 2755, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 1+1, LJ_TTAB, LJ_TISNUM); + dasm_put(Dst, 2162, 1+1, LJ_TSTR, LJ_TSTR, LJ_TISNUM, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 2228, Dt1(->base), Dt1(->base), 1+1, LJ_TTAB, Dt1(->base)); + dasm_put(Dst, 2295, Dt1(->base), 1+2, LJ_TNIL, LJ_TNIL, 1+1, LJ_TTAB); + dasm_put(Dst, 2406, Dt8(->upvalue[0]), LJ_TFUNC, LJ_TNIL, 1+3, 1+1, LJ_TTAB, LJ_TISNUM); if (sse) { - dasm_put(Dst, 2810); + dasm_put(Dst, 2469); } else { - dasm_put(Dst, 2849); + dasm_put(Dst, 2508); } - dasm_put(Dst, 2867, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0); - dasm_put(Dst, 2953, 1+1, LJ_TTAB, Dt8(->upvalue[0]), LJ_TFUNC); + dasm_put(Dst, 2526, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->hmask), 1+0); + dasm_put(Dst, 2607, 1+1, LJ_TTAB, Dt8(->upvalue[0]), LJ_TFUNC); if (sse) { - dasm_put(Dst, 2983); + dasm_put(Dst, 2645); } else { - dasm_put(Dst, 2993); + dasm_put(Dst, 2655); } - dasm_put(Dst, 3000, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE, LJ_TFUNC, Dt7(->gate)); - dasm_put(Dst, 3073, 2+1, LJ_TFUNC, LJ_TFUNC, 2*8+FRAME_PCALL, 2*8, 1+1, LJ_TTHREAD); - dasm_put(Dst, 3171, Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top)); - dasm_put(Dst, 3236, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top)); - dasm_put(Dst, 3340, Dt1(->maxstack), LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2); - dasm_put(Dst, 3459, Dt1(->top), Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base)); - dasm_put(Dst, 3539, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base)); - dasm_put(Dst, 3647, LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), FRAME_TYPE); - dasm_put(Dst, 3743, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status)); + dasm_put(Dst, 2662, 1+3, 1+1, 8+FRAME_PCALL, DISPATCH_GL(hookmask), HOOK_ACTIVE_SHIFT, 2+1, LJ_TFUNC); + dasm_put(Dst, 2726, LJ_TFUNC, 16+FRAME_PCALL, 1+1, LJ_TTHREAD, Dt1(->cframe), Dt1(->status), LUA_YIELD, Dt1(->top)); + dasm_put(Dst, 2814, Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); + dasm_put(Dst, 2915, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack), LJ_TTRUE, FRAME_TYPE); + dasm_put(Dst, 3029, LJ_TFALSE, Dt1(->top), Dt1(->top), 1+2, Dt1(->top), Dt1(->base), Dt8(->upvalue[0].gcr), Dt1(->cframe)); + dasm_put(Dst, 3124, Dt1(->status), LUA_YIELD, Dt1(->top), Dt1(->base), Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 3190, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), LUA_YIELD, Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->maxstack)); + dasm_put(Dst, 3291, FRAME_TYPE, Dt1(->top), Dt1(->base), Dt1(->cframe), CFRAME_RESUME); + dasm_put(Dst, 3401, Dt1(->base), Dt1(->top), Dt1(->cframe), LUA_YIELD, Dt1(->status)); if (sse) { - dasm_put(Dst, 3829, 1+1, LJ_TISNUM); + dasm_put(Dst, 3427, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 3890, 1+1, LJ_TISNUM); + dasm_put(Dst, 3496, 1+1, LJ_TISNUM); } - dasm_put(Dst, 3922, 1+1, FRAME_TYPE, LJ_TNIL); + dasm_put(Dst, 3532, 1+1, FRAME_TYPE, LJ_TNIL); if (sse) { - dasm_put(Dst, 4003, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4065, 1+1, LJ_TISNUM); + dasm_put(Dst, 3622, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 3684, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4095, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4154, 1+1, LJ_TISNUM); + dasm_put(Dst, 3714, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 3773, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4181, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4250, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4307, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); - dasm_put(Dst, 4370, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); - dasm_put(Dst, 4460); + dasm_put(Dst, 3800, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3869, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3926, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1); + dasm_put(Dst, 3989, LJ_TISNUM, 1+1, LJ_TISNUM, 1+1, LJ_TISNUM); + dasm_put(Dst, 4079); if (sse) { - dasm_put(Dst, 4472, 1+1, LJ_TISNUM); + dasm_put(Dst, 4091, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4503, 1+1, LJ_TISNUM); + dasm_put(Dst, 4122, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4528); + dasm_put(Dst, 4147); if (sse) { - dasm_put(Dst, 4550, 1+1, LJ_TISNUM); + dasm_put(Dst, 4161, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4581, 1+1, LJ_TISNUM); + dasm_put(Dst, 4192, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4606); + dasm_put(Dst, 4217); if (sse) { - dasm_put(Dst, 4628, 1+1, LJ_TISNUM); + dasm_put(Dst, 4231, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 4659, 1+1, LJ_TISNUM); + dasm_put(Dst, 4262, 1+1, LJ_TISNUM); } - dasm_put(Dst, 4684); + dasm_put(Dst, 4287); if (sse) { - dasm_put(Dst, 4708, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); + dasm_put(Dst, 4303, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); } else { - dasm_put(Dst, 4743, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); + dasm_put(Dst, 4342, 1+1, LJ_TISNUM, Dt8(->upvalue[0])); } - dasm_put(Dst, 4772, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM); - dasm_put(Dst, 4837, 1+1, LJ_TISNUM); + dasm_put(Dst, 4375, 2+1, LJ_TISNUM, LJ_TISNUM, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4440, 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 4932); + dasm_put(Dst, 4539); } else { - dasm_put(Dst, 4938); + dasm_put(Dst, 4545); } - dasm_put(Dst, 4947); + dasm_put(Dst, 4554); if (sse) { - dasm_put(Dst, 4972); + dasm_put(Dst, 4579); } else { - dasm_put(Dst, 4978); + dasm_put(Dst, 4585); } - dasm_put(Dst, 4981, 1+2); + dasm_put(Dst, 4588, 1+2); if (sse) { - dasm_put(Dst, 4990); + dasm_put(Dst, 4597); } else { - dasm_put(Dst, 4998); + dasm_put(Dst, 4605); } - dasm_put(Dst, 471); + dasm_put(Dst, 4613); if (sse) { - dasm_put(Dst, 5006); + dasm_put(Dst, 4616); } else { - dasm_put(Dst, 5038); + dasm_put(Dst, 4648); } - dasm_put(Dst, 5057); + dasm_put(Dst, 4667); if (sse) { - dasm_put(Dst, 5073, 1+1, LJ_TISNUM); + dasm_put(Dst, 4683, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 5098, 1+1, LJ_TISNUM); + dasm_put(Dst, 4708, 1+1, LJ_TISNUM); } - dasm_put(Dst, 5120); + dasm_put(Dst, 4730); if (sse) { - dasm_put(Dst, 5138); + dasm_put(Dst, 4752); } else { - dasm_put(Dst, 5164); + dasm_put(Dst, 4778); } - dasm_put(Dst, 5181, 1+2); + dasm_put(Dst, 4795, 1+2); if (sse) { - dasm_put(Dst, 5221); + dasm_put(Dst, 4835); } else { - dasm_put(Dst, 5229); + dasm_put(Dst, 4843); } - dasm_put(Dst, 5239, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4853, 2+1, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 5291, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4905, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 5338, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4952, 2+1, LJ_TISNUM, LJ_TISNUM); } if (sse) { - dasm_put(Dst, 5379, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 4993, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 5450, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5064, 1+1, LJ_TISNUM, LJ_TISNUM); if (cmov) { - dasm_put(Dst, 5503); + dasm_put(Dst, 5117); } else { - dasm_put(Dst, 5511); + dasm_put(Dst, 5125); } - dasm_put(Dst, 5442); + dasm_put(Dst, 5056); } if (sse) { - dasm_put(Dst, 5532, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5146, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 5603, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 5217, 1+1, LJ_TISNUM, LJ_TISNUM); if (cmov) { - dasm_put(Dst, 5656); + dasm_put(Dst, 5270); } else { - dasm_put(Dst, 5664); + dasm_put(Dst, 5278); } - dasm_put(Dst, 5442); + dasm_put(Dst, 5056); } if (!sse) { - dasm_put(Dst, 5685); + dasm_put(Dst, 5299); } - dasm_put(Dst, 5694, 1+1, LJ_TSTR); + dasm_put(Dst, 5308, 1+1, LJ_TSTR); if (sse) { - dasm_put(Dst, 5716, Dt5(->len)); + dasm_put(Dst, 5330, Dt5(->len)); } else { - dasm_put(Dst, 5727, Dt5(->len)); + dasm_put(Dst, 5341, Dt5(->len)); } - dasm_put(Dst, 5735, 1+1, LJ_TSTR, Dt5(->len), Dt5([1])); + dasm_put(Dst, 5349, 1+1, LJ_TSTR, Dt5(->len), Dt5([1])); if (sse) { - dasm_put(Dst, 5769); + dasm_put(Dst, 5387); } else { - dasm_put(Dst, 5779); + dasm_put(Dst, 5397); } - dasm_put(Dst, 5792, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM); + dasm_put(Dst, 5410, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+1, LJ_TISNUM); if (sse) { - dasm_put(Dst, 5827); + dasm_put(Dst, 5445); } else { - dasm_put(Dst, 5847); + dasm_put(Dst, 5465); } - dasm_put(Dst, 5867, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2, LJ_TISNUM); - dasm_put(Dst, 2475); + dasm_put(Dst, 5485, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), 1+2, LJ_TISNUM); + dasm_put(Dst, 2140); if (sse) { - dasm_put(Dst, 5978); + dasm_put(Dst, 5588); } else { - dasm_put(Dst, 5989); + dasm_put(Dst, 5599); } - dasm_put(Dst, 5997, LJ_TSTR, LJ_TISNUM, Dt5(->len)); + dasm_put(Dst, 5607, LJ_TSTR, LJ_TISNUM, Dt5(->len)); if (sse) { - dasm_put(Dst, 6027); + dasm_put(Dst, 5637); } else { - dasm_put(Dst, 6034); + dasm_put(Dst, 5644); } - dasm_put(Dst, 6046, sizeof(GCstr)-1); - dasm_put(Dst, 6121, 2+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); - dasm_put(Dst, 6180, LJ_TSTR, LJ_TISNUM); + dasm_put(Dst, 5656, sizeof(GCstr)-1); + dasm_put(Dst, 5731, 2+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 5790, LJ_TSTR, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6205); + dasm_put(Dst, 5811); } else { - dasm_put(Dst, 6212); + dasm_put(Dst, 5818); } - dasm_put(Dst, 6224, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(tmpbuf.buf), 1+1); - dasm_put(Dst, 6289, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); - dasm_put(Dst, 6356, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz)); - dasm_put(Dst, 6431, sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), 1+1); - dasm_put(Dst, 6516, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); - dasm_put(Dst, 6590, 1+1, LJ_TTAB); + dasm_put(Dst, 5830, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(tmpbuf.buf), 1+1); + dasm_put(Dst, 5895, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 5958, 1+1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz)); + dasm_put(Dst, 6029, sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), 1+1); + dasm_put(Dst, 6114, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 6184, 1+1, LJ_TTAB); if (sse) { - dasm_put(Dst, 6666); + dasm_put(Dst, 6252); } else { - dasm_put(Dst, 6676); + dasm_put(Dst, 6262); } if (sse) { - dasm_put(Dst, 6687, 1+1, LJ_TISNUM); + dasm_put(Dst, 6273, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 6744, 1+1, LJ_TISNUM); + dasm_put(Dst, 6330, 1+1, LJ_TISNUM); } if (sse) { - dasm_put(Dst, 6788, 1+1, LJ_TISNUM); + dasm_put(Dst, 6374, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 6836, 1+1, LJ_TISNUM); + dasm_put(Dst, 6422, 1+1, LJ_TISNUM); } - dasm_put(Dst, 6876); + dasm_put(Dst, 6462, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6886); - } - dasm_put(Dst, 6891, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 6909); + dasm_put(Dst, 6489); } else { - dasm_put(Dst, 6926); + dasm_put(Dst, 6506); } - dasm_put(Dst, 6939); + dasm_put(Dst, 6519); if (sse) { - dasm_put(Dst, 6947, 1+1, LJ_TISNUM); + dasm_put(Dst, 6527, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 6995, 1+1, LJ_TISNUM); + dasm_put(Dst, 6575, 1+1, LJ_TISNUM); } - dasm_put(Dst, 6876); + dasm_put(Dst, 6462, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6886); - } - dasm_put(Dst, 6891, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 7035); + dasm_put(Dst, 6615); } else { - dasm_put(Dst, 7052); + dasm_put(Dst, 6632); } - dasm_put(Dst, 6939); + dasm_put(Dst, 6519); if (sse) { - dasm_put(Dst, 7065, 1+1, LJ_TISNUM); + dasm_put(Dst, 6645, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 7113, 1+1, LJ_TISNUM); + dasm_put(Dst, 6693, 1+1, LJ_TISNUM); } - dasm_put(Dst, 6876); + dasm_put(Dst, 6462, LJ_TISNUM); if (sse) { - dasm_put(Dst, 6886); - } - dasm_put(Dst, 6891, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 7153); + dasm_put(Dst, 6733); } else { - dasm_put(Dst, 7170); + dasm_put(Dst, 6750); } - dasm_put(Dst, 6939); + dasm_put(Dst, 6519); if (sse) { - dasm_put(Dst, 7183, 1+1, LJ_TISNUM); + dasm_put(Dst, 6763, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 7231, 1+1, LJ_TISNUM); + dasm_put(Dst, 6811, 1+1, LJ_TISNUM); } - dasm_put(Dst, 7271); + dasm_put(Dst, 6851); if (sse) { - dasm_put(Dst, 7278, 1+1, LJ_TISNUM); + dasm_put(Dst, 6858, 1+1, LJ_TISNUM); } else { - dasm_put(Dst, 7326, 1+1, LJ_TISNUM); + dasm_put(Dst, 6906, 1+1, LJ_TISNUM); } - dasm_put(Dst, 7366); + dasm_put(Dst, 6946); if (sse) { - dasm_put(Dst, 7370); + dasm_put(Dst, 6950); } else { - dasm_put(Dst, 7397); + dasm_put(Dst, 6962); } - dasm_put(Dst, 7412); + dasm_put(Dst, 6975); if (sse) { - dasm_put(Dst, 6661); - } - dasm_put(Dst, 7415); - if (sse) { - dasm_put(Dst, 7424, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 6986, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 7498, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7060, 2+1, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 7564); + dasm_put(Dst, 7126); if (sse) { - dasm_put(Dst, 7573, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7135, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 7647, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7209, 2+1, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 7713); + dasm_put(Dst, 7275); if (sse) { - dasm_put(Dst, 7723, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7285, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 7797, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7359, 2+1, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 7863); + dasm_put(Dst, 7425); if (sse) { - dasm_put(Dst, 7873, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7435, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 7947, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7509, 2+1, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 8013); + dasm_put(Dst, 7575); if (sse) { - dasm_put(Dst, 8022, 1+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7584, 1+1, LJ_TISNUM, LJ_TISNUM); } else { - dasm_put(Dst, 8096, 2+1, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 7658, 2+1, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 8162, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base)); - dasm_put(Dst, 8246, Dt1(->top), Dt7(->gate), LJ_TFUNC, Dt7(->gate), Dt1(->base), LUA_MINSTACK, Dt1(->base), Dt1(->top)); - dasm_put(Dst, 8365, Dt1(->base), Dt1(->top)); + dasm_put(Dst, 7724, 1+2, 1+1, Dt1(->base), 8*LUA_MINSTACK, Dt1(->top), Dt1(->maxstack), Dt8(->f), Dt1(->base)); + dasm_put(Dst, 7802, Dt1(->top), Dt7(->pc), FRAME_TYPE, LUA_MINSTACK, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 7925, Dt1(->top), Dt1(->base), Dt1(->top)); #if LJ_HASJIT - dasm_put(Dst, 8406, DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount)); + dasm_put(Dst, 7963, DISPATCH_GL(hookmask), HOOK_VMEVENT, HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount)); #endif - dasm_put(Dst, 8437, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base), Dt1(->base)); - dasm_put(Dst, 8503, BC__MAX*4); + dasm_put(Dst, 7994, DISPATCH_GL(hookmask), HOOK_ACTIVE, LUA_MASKLINE|LUA_MASKCOUNT, DISPATCH_GL(hookcount), LUA_MASKLINE, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 8060, GG_DISP2STATIC); #if LJ_HASJIT - dasm_put(Dst, 8538, Dt1(->base), GG_DISP2J, DISPATCH_J(L)); + dasm_put(Dst, 8095, Dt7(->pc), PC2PROTO(framesize), Dt1(->base), Dt1(->top), GG_DISP2J, DISPATCH_J(L)); #endif - dasm_put(Dst, 8567); + dasm_put(Dst, 8141); #if LJ_HASJIT - dasm_put(Dst, 8570, Dt1(->base), GG_DISP2J, DISPATCH_J(L), Dt1(->base)); + dasm_put(Dst, 8144, Dt1(->base), Dt1(->top), GG_DISP2J, DISPATCH_J(L), Dt1(->base), Dt1(->top), Dt7(->pc)); #endif - dasm_put(Dst, 8616); + dasm_put(Dst, 8214); #if LJ_HASJIT - dasm_put(Dst, 8619, DISPATCH_GL(vmstate), DISPATCH_GL(vmstate), ~LJ_VMST_EXIT, DISPATCH_J(exitno), DISPATCH_J(parent), 8*8+16, DISPATCH_J(flags), JIT_F_SSE2, DISPATCH_GL(jit_L), DISPATCH_GL(jit_base), DISPATCH_J(L), Dt1(->base), GG_DISP2J, Dt1(->base)); + dasm_put(Dst, 8217, DISPATCH_GL(vmstate), DISPATCH_GL(vmstate), ~LJ_VMST_EXIT, DISPATCH_J(exitno), DISPATCH_J(parent), 8*8+16, DISPATCH_J(flags), JIT_F_SSE2, DISPATCH_GL(jit_L), DISPATCH_GL(jit_base), DISPATCH_J(L), Dt1(->base), GG_DISP2J, Dt1(->base)); #endif - dasm_put(Dst, 8762); + dasm_put(Dst, 8360); #if LJ_HASJIT - dasm_put(Dst, 8765, Dt7(->pc), PC2PROTO(k), DISPATCH_GL(jit_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); + dasm_put(Dst, 8363, Dt7(->pc), PC2PROTO(k), DISPATCH_GL(jit_L), DISPATCH_GL(vmstate), ~LJ_VMST_INTERP); #endif - dasm_put(Dst, 8805); + dasm_put(Dst, 8403); if (!sse) { - dasm_put(Dst, 8808); + dasm_put(Dst, 8406); } - dasm_put(Dst, 8853); + dasm_put(Dst, 8451); if (!sse) { - dasm_put(Dst, 8955); + dasm_put(Dst, 8553); } - dasm_put(Dst, 9000); + dasm_put(Dst, 8598); if (!sse) { - dasm_put(Dst, 9102); + dasm_put(Dst, 8700); } - dasm_put(Dst, 9141); + dasm_put(Dst, 8739); if (sse) { - dasm_put(Dst, 9246); + dasm_put(Dst, 8844); } else { - dasm_put(Dst, 9376); + dasm_put(Dst, 8974); } - dasm_put(Dst, 9423); + dasm_put(Dst, 9021); if (!sse) { - dasm_put(Dst, 9497); + dasm_put(Dst, 9095); if (cmov) { - dasm_put(Dst, 9508); + dasm_put(Dst, 9106); } else { - dasm_put(Dst, 9512); + dasm_put(Dst, 9110); } - dasm_put(Dst, 9519); - dasm_put(Dst, 9593); - dasm_put(Dst, 9693); + dasm_put(Dst, 9117); + dasm_put(Dst, 9191); + dasm_put(Dst, 9291); if (cmov) { - dasm_put(Dst, 9696); + dasm_put(Dst, 9294); } else { - dasm_put(Dst, 9700); + dasm_put(Dst, 9298); } - dasm_put(Dst, 9707); + dasm_put(Dst, 9305); if (cmov) { - dasm_put(Dst, 9508); + dasm_put(Dst, 9106); } else { - dasm_put(Dst, 9512); + dasm_put(Dst, 9110); } - dasm_put(Dst, 9725); + dasm_put(Dst, 9323); } else { - dasm_put(Dst, 9804); + dasm_put(Dst, 9402); } - dasm_put(Dst, 9807); - dasm_put(Dst, 9892); - dasm_put(Dst, 10023); - dasm_put(Dst, 10222); + dasm_put(Dst, 9405); + dasm_put(Dst, 9490); + dasm_put(Dst, 9621); + dasm_put(Dst, 9820); if (sse) { - dasm_put(Dst, 10245); - dasm_put(Dst, 10302); - dasm_put(Dst, 10393); + dasm_put(Dst, 9843); + dasm_put(Dst, 9900); + dasm_put(Dst, 9991); } else { - dasm_put(Dst, 10435); - dasm_put(Dst, 10527); + dasm_put(Dst, 10033); + dasm_put(Dst, 10125); } - dasm_put(Dst, 10573); + dasm_put(Dst, 10171); if (sse) { - dasm_put(Dst, 10579); - dasm_put(Dst, 10684); - dasm_put(Dst, 10767); + dasm_put(Dst, 10177); + dasm_put(Dst, 10282); + dasm_put(Dst, 10365); } else { - dasm_put(Dst, 10839); - dasm_put(Dst, 10922); + dasm_put(Dst, 10437); + dasm_put(Dst, 10520); if (cmov) { - dasm_put(Dst, 10977); + dasm_put(Dst, 10575); } else { - dasm_put(Dst, 10996); + dasm_put(Dst, 10594); } - dasm_put(Dst, 10835); + dasm_put(Dst, 10433); } - dasm_put(Dst, 11037); + dasm_put(Dst, 10635); } /* Generate the code for a single instruction. */ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) { int vk = 0; - dasm_put(Dst, 154, defop); + dasm_put(Dst, 10689, defop); switch (op) { @@ -1561,619 +1531,619 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) /* Remember: all ops branch for a true comparison, fall through otherwise. */ case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: - dasm_put(Dst, 11091, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 10691, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11112); + dasm_put(Dst, 10712); } else { - dasm_put(Dst, 11127); + dasm_put(Dst, 10727); if (cmov) { - dasm_put(Dst, 11137); + dasm_put(Dst, 10737); } else { - dasm_put(Dst, 11143); + dasm_put(Dst, 10743); } } switch (op) { case BC_ISLT: - dasm_put(Dst, 11150); + dasm_put(Dst, 10750); break; case BC_ISGE: - dasm_put(Dst, 10388); + dasm_put(Dst, 9986); break; case BC_ISLE: - dasm_put(Dst, 6585); + dasm_put(Dst, 6179); break; case BC_ISGT: - dasm_put(Dst, 11155); + dasm_put(Dst, 10755); break; default: break; /* Shut up GCC. */ } - dasm_put(Dst, 11160, -BCBIAS_J*4); + dasm_put(Dst, 10760, -BCBIAS_J*4); break; case BC_ISEQV: case BC_ISNEV: vk = op == BC_ISEQV; - dasm_put(Dst, 11193, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 10793, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11219); + dasm_put(Dst, 10819); } else { - dasm_put(Dst, 11231); + dasm_put(Dst, 10831); if (cmov) { - dasm_put(Dst, 11137); + dasm_put(Dst, 10737); } else { - dasm_put(Dst, 11143); + dasm_put(Dst, 10743); } } iseqne_fp: if (vk) { - dasm_put(Dst, 11238); + dasm_put(Dst, 10838); } else { - dasm_put(Dst, 11247); + dasm_put(Dst, 10847); } iseqne_end: if (vk) { - dasm_put(Dst, 11256, -BCBIAS_J*4); + dasm_put(Dst, 10856, -BCBIAS_J*4); } else { - dasm_put(Dst, 11271, -BCBIAS_J*4); + dasm_put(Dst, 10871, -BCBIAS_J*4); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); if (op == BC_ISEQV || op == BC_ISNEV) { - dasm_put(Dst, 11286, LJ_TISPRI, LJ_TISTABUD, Dt6(->metatable), Dt6(->nomm), 1<metatable), Dt6(->nomm), 1<len)); + dasm_put(Dst, 11222, Dt5(->len)); } else { - dasm_put(Dst, 11640, Dt5(->len)); + dasm_put(Dst, 11240, Dt5(->len)); } - dasm_put(Dst, 11649, LJ_TTAB); + dasm_put(Dst, 11249, LJ_TTAB); if (sse) { - dasm_put(Dst, 11689); + dasm_put(Dst, 11289); } else { - dasm_put(Dst, 11698); + dasm_put(Dst, 11298); } - dasm_put(Dst, 11708); + dasm_put(Dst, 11308); break; /* -- Binary ops -------------------------------------------------------- */ case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11738); + dasm_put(Dst, 11338); } else { - dasm_put(Dst, 11752); + dasm_put(Dst, 11352); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11772); + dasm_put(Dst, 11372); } else { - dasm_put(Dst, 11786); + dasm_put(Dst, 11386); } break; default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11816); + dasm_put(Dst, 11416); } else { - dasm_put(Dst, 11830); + dasm_put(Dst, 11430); } break; } if (sse) { - dasm_put(Dst, 11592); + dasm_put(Dst, 11192); } else { - dasm_put(Dst, 11604); + dasm_put(Dst, 11204); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11838); + dasm_put(Dst, 11438); } else { - dasm_put(Dst, 11852); + dasm_put(Dst, 11452); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11860); + dasm_put(Dst, 11460); } else { - dasm_put(Dst, 11874); + dasm_put(Dst, 11474); } break; default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11882); + dasm_put(Dst, 11482); } else { - dasm_put(Dst, 11896); + dasm_put(Dst, 11496); } break; } if (sse) { - dasm_put(Dst, 11592); + dasm_put(Dst, 11192); } else { - dasm_put(Dst, 11604); + dasm_put(Dst, 11204); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_MULVN: case BC_MULNV: case BC_MULVV: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11904); + dasm_put(Dst, 11504); } else { - dasm_put(Dst, 11918); + dasm_put(Dst, 11518); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11926); + dasm_put(Dst, 11526); } else { - dasm_put(Dst, 11940); + dasm_put(Dst, 11540); } break; default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11948); + dasm_put(Dst, 11548); } else { - dasm_put(Dst, 11962); + dasm_put(Dst, 11562); } break; } if (sse) { - dasm_put(Dst, 11592); + dasm_put(Dst, 11192); } else { - dasm_put(Dst, 11604); + dasm_put(Dst, 11204); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 11970); + dasm_put(Dst, 11570); } else { - dasm_put(Dst, 11984); + dasm_put(Dst, 11584); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 11992); - } else { - dasm_put(Dst, 12006); - } - break; - default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); - if (sse) { - dasm_put(Dst, 12014); - } else { - dasm_put(Dst, 12028); - } - break; - } + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { dasm_put(Dst, 11592); } else { - dasm_put(Dst, 11604); + dasm_put(Dst, 11606); } - dasm_put(Dst, 8597); + break; + default: + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); + if (sse) { + dasm_put(Dst, 11614); + } else { + dasm_put(Dst, 11628); + } + break; + } + if (sse) { + dasm_put(Dst, 11192); + } else { + dasm_put(Dst, 11204); + } + dasm_put(Dst, 8384); break; case BC_MODVN: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12036); + dasm_put(Dst, 11636); } else { - dasm_put(Dst, 12050); + dasm_put(Dst, 11650); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12058); + dasm_put(Dst, 11658); } else { - dasm_put(Dst, 12072); + dasm_put(Dst, 11672); } break; default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12080); + dasm_put(Dst, 11680); } else { - dasm_put(Dst, 12094); + dasm_put(Dst, 11694); } break; } - dasm_put(Dst, 12102); + dasm_put(Dst, 11702); if (sse) { - dasm_put(Dst, 11592); + dasm_put(Dst, 11192); } else { - dasm_put(Dst, 11604); + dasm_put(Dst, 11204); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_MODNV: case BC_MODVV: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12036); + dasm_put(Dst, 11636); } else { - dasm_put(Dst, 12050); + dasm_put(Dst, 11650); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12058); + dasm_put(Dst, 11658); } else { - dasm_put(Dst, 12072); + dasm_put(Dst, 11672); } break; default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12080); + dasm_put(Dst, 11680); } else { - dasm_put(Dst, 12094); + dasm_put(Dst, 11694); } break; } - dasm_put(Dst, 12108); + dasm_put(Dst, 11708); break; case BC_POW: - dasm_put(Dst, 11718); + dasm_put(Dst, 11318); vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); switch (vk) { case 0: - dasm_put(Dst, 11726, LJ_TISNUM); + dasm_put(Dst, 11326, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12036); + dasm_put(Dst, 11636); } else { - dasm_put(Dst, 12050); + dasm_put(Dst, 11650); } break; case 1: - dasm_put(Dst, 11760, LJ_TISNUM); + dasm_put(Dst, 11360, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12058); + dasm_put(Dst, 11658); } else { - dasm_put(Dst, 12072); + dasm_put(Dst, 11672); } break; default: - dasm_put(Dst, 11794, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 11394, LJ_TISNUM, LJ_TISNUM); if (sse) { - dasm_put(Dst, 12080); + dasm_put(Dst, 11680); } else { - dasm_put(Dst, 12094); + dasm_put(Dst, 11694); } break; } - dasm_put(Dst, 12113); + dasm_put(Dst, 11713); if (sse) { - dasm_put(Dst, 11592); + dasm_put(Dst, 11192); } else { - dasm_put(Dst, 11604); + dasm_put(Dst, 11204); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_CAT: - dasm_put(Dst, 12117, Dt1(->base), Dt1(->base)); + dasm_put(Dst, 11717, Dt1(->base), Dt1(->base)); break; /* -- Constant ops ------------------------------------------------------ */ case BC_KSTR: - dasm_put(Dst, 12211, LJ_TSTR); + dasm_put(Dst, 11811, LJ_TSTR); break; case BC_KSHORT: if (sse) { - dasm_put(Dst, 12244); + dasm_put(Dst, 11844); } else { - dasm_put(Dst, 12259); + dasm_put(Dst, 11859); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_KNUM: if (sse) { - dasm_put(Dst, 12267); + dasm_put(Dst, 11867); } else { - dasm_put(Dst, 12280); + dasm_put(Dst, 11880); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_KPRI: - dasm_put(Dst, 12287); + dasm_put(Dst, 11887); break; case BC_KNIL: - dasm_put(Dst, 12313, LJ_TNIL); + dasm_put(Dst, 11913, LJ_TNIL); break; /* -- Upvalue and function ops ------------------------------------------ */ case BC_UGET: - dasm_put(Dst, 12359, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 11959, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_USETV: #define TV2MARKOFS \ ((int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)) - dasm_put(Dst, 12403, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); - dasm_put(Dst, 12493); + dasm_put(Dst, 12003, offsetof(GCfuncL, uvptr), DtA(->closed), DtA(->v), TV2MARKOFS, LJ_GC_BLACK, LJ_TISGCV, LJ_TISNUM - LJ_TISGCV, Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); + dasm_put(Dst, 12093); break; #undef TV2MARKOFS case BC_USETS: - dasm_put(Dst, 12505, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); + dasm_put(Dst, 12105, offsetof(GCfuncL, uvptr), DtA(->v), LJ_TSTR, DtA(->marked), LJ_GC_BLACK, Dt4(->gch.marked), LJ_GC_WHITES, DtA(->closed), GG_DISP2G); break; case BC_USETN: - dasm_put(Dst, 12596); + dasm_put(Dst, 12196); if (sse) { - dasm_put(Dst, 12601); + dasm_put(Dst, 12201); } else { - dasm_put(Dst, 11411); + dasm_put(Dst, 11011); } - dasm_put(Dst, 12608, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 12208, offsetof(GCfuncL, uvptr), DtA(->v)); if (sse) { - dasm_put(Dst, 4972); + dasm_put(Dst, 12217); } else { - dasm_put(Dst, 4978); + dasm_put(Dst, 12223); } - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_USETP: - dasm_put(Dst, 12617, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 12226, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_UCLO: - dasm_put(Dst, 12654, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); + dasm_put(Dst, 12263, -BCBIAS_J*4, Dt1(->openupval), Dt1(->base), Dt1(->base)); break; case BC_FNEW: - dasm_put(Dst, 12708, Dt1(->base), Dt1(->base), LJ_TFUNC); + dasm_put(Dst, 12317, Dt1(->base), Dt1(->base), LJ_TFUNC); break; /* -- Table ops --------------------------------------------------------- */ case BC_TNEW: - dasm_put(Dst, 12779, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); + dasm_put(Dst, 12388, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); break; case BC_TDUP: - dasm_put(Dst, 12900, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); + dasm_put(Dst, 12509, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base), Dt1(->base), LJ_TTAB); break; case BC_GGET: - dasm_put(Dst, 12992, Dt7(->env)); + dasm_put(Dst, 12601, Dt7(->env)); break; case BC_GSET: - dasm_put(Dst, 13010, Dt7(->env)); + dasm_put(Dst, 12619, Dt7(->env)); break; case BC_TGETV: - dasm_put(Dst, 13028, LJ_TTAB, LJ_TISNUM); + dasm_put(Dst, 12637, LJ_TTAB, LJ_TISNUM); if (sse) { - dasm_put(Dst, 13061); + dasm_put(Dst, 12670); } else { - dasm_put(Dst, 13082); + dasm_put(Dst, 12691); if (cmov) { - dasm_put(Dst, 11137); + dasm_put(Dst, 10737); } else { - dasm_put(Dst, 11143); + dasm_put(Dst, 10743); } - dasm_put(Dst, 2863); + dasm_put(Dst, 2522); } - dasm_put(Dst, 13092, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); - dasm_put(Dst, 13286, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), sizeof(Node), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); + dasm_put(Dst, 12895, LJ_TNIL, DtB(->next), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable)); - dasm_put(Dst, 13572, Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 13098, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable)); + dasm_put(Dst, 13181, Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETS: - dasm_put(Dst, 13634, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); - dasm_put(Dst, 13709, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<next)); - dasm_put(Dst, 13801, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 13243, LJ_TTAB, Dt6(->hmask), Dt5(->hash), sizeof(Node), Dt6(->nomm), Dt6(->node), DtB(->key.it), LJ_TSTR, DtB(->key.gcr), LJ_TNIL); + dasm_put(Dst, 13318, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->metatable), Dt6(->nomm), 1<next)); + dasm_put(Dst, 13410, Dt6(->metatable), Dt6(->nomm), 1<base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETB: - dasm_put(Dst, 13897, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); - dasm_put(Dst, 13995, Dt6(->metatable), Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); + dasm_put(Dst, 13506, LJ_TTAB, Dt6(->asize), Dt6(->array), LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); + dasm_put(Dst, 13604, Dt6(->metatable), Dt6(->nomm), 1<marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->gclist)); break; case BC_TSETM: - dasm_put(Dst, 14041); + dasm_put(Dst, 13650); if (sse) { - dasm_put(Dst, 12601); + dasm_put(Dst, 12201); } else { - dasm_put(Dst, 14046); + dasm_put(Dst, 13655); } - dasm_put(Dst, 14054, Dt6(->marked), LJ_GC_BLACK); + dasm_put(Dst, 13663, Dt6(->marked), LJ_GC_BLACK); if (sse) { - dasm_put(Dst, 14079); + dasm_put(Dst, 13688); } else { - dasm_put(Dst, 14086); + dasm_put(Dst, 13695); } - dasm_put(Dst, 14091, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); - dasm_put(Dst, 14219, Dt6(->gclist)); + dasm_put(Dst, 13700, Dt6(->asize), Dt6(->array), Dt1(->base), Dt1(->base), Dt6(->marked), cast_byte(~LJ_GC_BLACK), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain)); + dasm_put(Dst, 13828, Dt6(->gclist)); break; /* -- Calls and vararg handling ----------------------------------------- */ case BC_CALL: case BC_CALLM: - dasm_put(Dst, 11722); + dasm_put(Dst, 11322); if (op == BC_CALLM) { - dasm_put(Dst, 14227); + dasm_put(Dst, 13836); } - dasm_put(Dst, 14232, LJ_TFUNC, Dt7(->gate)); + dasm_put(Dst, 13841, LJ_TFUNC, Dt7(->pc)); break; case BC_CALLMT: - dasm_put(Dst, 14227); + dasm_put(Dst, 13836); break; case BC_CALLT: - dasm_put(Dst, 14255, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->gate)); - dasm_put(Dst, 14360, FRAME_TYPE, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 13882, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), Dt7(->pc)); + dasm_put(Dst, 14000, FRAME_TYPE, Dt7(->pc), PC2PROTO(k)); break; case BC_ITERC: - dasm_put(Dst, 14417, LJ_TFUNC, Dt7(->gate)); + dasm_put(Dst, 14057, LJ_TFUNC, 2+1, Dt7(->pc)); break; case BC_VARG: - dasm_put(Dst, 14479, Dt7(->pc), PC2PROTO(numparams), (8+FRAME_VARG), LJ_TNIL); - dasm_put(Dst, 14623, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); + dasm_put(Dst, 14137, Dt7(->pc), PC2PROTO(numparams), (8+FRAME_VARG), LJ_TNIL); + dasm_put(Dst, 14281, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); break; /* -- Returns ----------------------------------------------------------- */ case BC_RETM: - dasm_put(Dst, 14227); + dasm_put(Dst, 13836); break; case BC_RET: case BC_RET0: case BC_RET1: if (op != BC_RET0) { - dasm_put(Dst, 14722); + dasm_put(Dst, 14380); } - dasm_put(Dst, 14726, FRAME_TYPE); + dasm_put(Dst, 14384, FRAME_TYPE); switch (op) { case BC_RET: - dasm_put(Dst, 14745); + dasm_put(Dst, 14403); break; case BC_RET1: - dasm_put(Dst, 14803); + dasm_put(Dst, 14461); /* fallthrough */ case BC_RET0: - dasm_put(Dst, 14819); + dasm_put(Dst, 14477); default: break; } - dasm_put(Dst, 14830, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 14488, Dt7(->pc), PC2PROTO(k)); if (op == BC_RET) { - dasm_put(Dst, 14872, LJ_TNIL); + dasm_put(Dst, 14530, LJ_TNIL); } else { - dasm_put(Dst, 14881, LJ_TNIL); + dasm_put(Dst, 14539, LJ_TNIL); } - dasm_put(Dst, 14888); + dasm_put(Dst, 14546); if (op != BC_RET0) { - dasm_put(Dst, 14909); + dasm_put(Dst, 14567); } - dasm_put(Dst, 5068); + dasm_put(Dst, 4678); break; /* -- Loops and branches ------------------------------------------------ */ @@ -2181,7 +2151,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FORL: #if LJ_HASJIT - dasm_put(Dst, 14913, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 14571, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; @@ -2193,57 +2163,57 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) case BC_FORI: case BC_IFORL: vk = (op == BC_IFORL || op == BC_JFORL); - dasm_put(Dst, 14934); + dasm_put(Dst, 14592); if (!vk) { - dasm_put(Dst, 14938, LJ_TISNUM, LJ_TISNUM); + dasm_put(Dst, 14596, LJ_TISNUM, LJ_TISNUM); } - dasm_put(Dst, 14957); + dasm_put(Dst, 14615); if (!vk) { - dasm_put(Dst, 14961, LJ_TISNUM); + dasm_put(Dst, 14619, LJ_TISNUM); } if (sse) { - dasm_put(Dst, 14970); + dasm_put(Dst, 14628); if (vk) { - dasm_put(Dst, 14982); + dasm_put(Dst, 14640); } else { - dasm_put(Dst, 15001); + dasm_put(Dst, 14659); } - dasm_put(Dst, 15006); + dasm_put(Dst, 14664); } else { - dasm_put(Dst, 15019); + dasm_put(Dst, 14677); if (vk) { - dasm_put(Dst, 15025); + dasm_put(Dst, 14683); } else { - dasm_put(Dst, 15041); + dasm_put(Dst, 14699); } - dasm_put(Dst, 15049); + dasm_put(Dst, 14707); if (cmov) { - dasm_put(Dst, 11137); + dasm_put(Dst, 10737); } else { - dasm_put(Dst, 11143); + dasm_put(Dst, 10743); } if (!cmov) { - dasm_put(Dst, 15054); + dasm_put(Dst, 14712); } } if (op == BC_FORI) { - dasm_put(Dst, 15060, -BCBIAS_J*4); + dasm_put(Dst, 14718, -BCBIAS_J*4); } else if (op == BC_JFORI) { - dasm_put(Dst, 15070, -BCBIAS_J*4, BC_JLOOP); + dasm_put(Dst, 14728, -BCBIAS_J*4, BC_JLOOP); } else if (op == BC_IFORL) { - dasm_put(Dst, 15084, -BCBIAS_J*4); + dasm_put(Dst, 14742, -BCBIAS_J*4); } else { - dasm_put(Dst, 15080, BC_JLOOP); + dasm_put(Dst, 14738, BC_JLOOP); } - dasm_put(Dst, 11172); + dasm_put(Dst, 10772); if (sse) { - dasm_put(Dst, 15094); + dasm_put(Dst, 14752); } break; case BC_ITERL: #if LJ_HASJIT - dasm_put(Dst, 14913, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 14571, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; @@ -2252,33 +2222,96 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) break; #endif case BC_IITERL: - dasm_put(Dst, 15105, LJ_TNIL); + dasm_put(Dst, 14763, LJ_TNIL); if (op == BC_JITERL) { - dasm_put(Dst, 15120, BC_JLOOP); + dasm_put(Dst, 14778, BC_JLOOP); } else { - dasm_put(Dst, 15134, -BCBIAS_J*4); + dasm_put(Dst, 14792, -BCBIAS_J*4); } - dasm_put(Dst, 11469); + dasm_put(Dst, 11069); break; case BC_LOOP: #if LJ_HASJIT - dasm_put(Dst, 14913, HOTCOUNT_PCMASK, GG_DISP2HOT); + dasm_put(Dst, 14571, HOTCOUNT_PCMASK, GG_DISP2HOT); #endif break; case BC_ILOOP: - dasm_put(Dst, 8597); + dasm_put(Dst, 8384); break; case BC_JLOOP: #if LJ_HASJIT - dasm_put(Dst, 15150, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); + dasm_put(Dst, 14808, DISPATCH_J(trace), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); #endif break; case BC_JMP: - dasm_put(Dst, 15173, -BCBIAS_J*4); + dasm_put(Dst, 14831, -BCBIAS_J*4); + break; + + /* -- Function headers -------------------------------------------------- */ + + /* + ** Reminder: A function may be called with func/args above L->maxstack, + ** i.e. occupying EXTRA_STACK slots. And vmeta_call may add one extra slot, + ** too. This means all FUNC* ops (including fast functions) must check + ** for stack overflow _before_ adding more slots! + */ + + case BC_FUNCF: +#if LJ_HASJIT +#endif + case BC_FUNCV: /* NYI: compiled vararg functions. */ + break; + + case BC_JFUNCF: +#if !LJ_HASJIT + break; +#endif + case BC_IFUNCF: + dasm_put(Dst, 14855, -4+PC2PROTO(k), Dt1(->maxstack), -4+PC2PROTO(numparams)); + if (op == BC_JFUNCF) { + dasm_put(Dst, 14885, BC_JLOOP); + } else { + dasm_put(Dst, 8384); + } + dasm_put(Dst, 14894, LJ_TNIL); + break; + + case BC_JFUNCV: +#if !LJ_HASJIT + break; +#endif + dasm_put(Dst, 10435); + break; /* NYI: compiled vararg functions. */ + + case BC_IFUNCV: + dasm_put(Dst, 14916, FRAME_VARG, Dt1(->maxstack), -4+PC2PROTO(numparams), LJ_TNIL); + if (op == BC_JFUNCV) { + dasm_put(Dst, 14885, BC_JLOOP); + } else { + dasm_put(Dst, 15007, -4+PC2PROTO(k)); + } + dasm_put(Dst, 15029, LJ_TNIL); + break; + + case BC_FUNCC: + case BC_FUNCCW: + dasm_put(Dst, 15051, Dt8(->f), Dt1(->base), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->top)); + if (op == BC_FUNCC) { + dasm_put(Dst, 15080); + } else { + dasm_put(Dst, 15084); + } + dasm_put(Dst, 15092, DISPATCH_GL(vmstate), ~LJ_VMST_C); + if (op == BC_FUNCC) { + dasm_put(Dst, 15101); + } else { + dasm_put(Dst, 15105, DISPATCH_GL(wrapf)); + } + dasm_put(Dst, 15110, DISPATCH_GL(vmstate), ~LJ_VMST_INTERP, Dt1(->base), Dt1(->top)); break; /* ---------------------------------------------------------------------- */ @@ -2306,7 +2339,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx, cmov, sse); - dasm_put(Dst, 15197); + dasm_put(Dst, 15135); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op, cmov, sse); diff --git a/src/lib_base.c b/src/lib_base.c index 032d5bcc..e85b7264 100644 --- a/src/lib_base.c +++ b/src/lib_base.c @@ -22,7 +22,9 @@ #include "lj_tab.h" #include "lj_meta.h" #include "lj_state.h" +#include "lj_bc.h" #include "lj_ff.h" +#include "lj_dispatch.h" #include "lj_ctype.h" #include "lj_lib.h" @@ -521,19 +523,25 @@ void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L, lua_State *co) lj_err_run(L); } +/* Forward declaration. */ +static void setpc_wrap_aux(lua_State *L, GCfunc *fn); + LJLIB_CF(coroutine_wrap) { - GCfunc *fn; lj_cf_coroutine_create(L); - lua_pushcclosure(L, lj_ffh_coroutine_wrap_aux, 1); - fn = funcV(L->top-1); - fn->c.gate = lj_ff_coroutine_wrap_aux; - fn->c.ffid = FF_coroutine_wrap_aux; + lj_lib_pushcc(L, lj_ffh_coroutine_wrap_aux, FF_coroutine_wrap_aux, 1); + setpc_wrap_aux(L, funcV(L->top-1)); return 1; } #include "lj_libdef.h" +/* Fix the PC of wrap_aux. Really ugly workaround. */ +static void setpc_wrap_aux(lua_State *L, GCfunc *fn) +{ + setmref(fn->c.pc, &L2GG(L)->bcff[lj_lib_init_coroutine[1]+2]); +} + /* ------------------------------------------------------------------------ */ static void newproxy_weaktable(lua_State *L) diff --git a/src/lib_io.c b/src/lib_io.c index 42200201..e8eb09cb 100644 --- a/src/lib_io.c +++ b/src/lib_io.c @@ -502,8 +502,7 @@ static GCobj *io_std_new(lua_State *L, FILE *fp, const char *name) LUALIB_API int luaopen_io(lua_State *L) { - lua_pushcfunction(L, lj_cf_io_lines_iter); - funcV(L->top-1)->c.ffid = FF_io_lines_iter; + lj_lib_pushcf(L, lj_cf_io_lines_iter, FF_io_lines_iter); LJ_LIB_REG_(L, NULL, io_method); copyTV(L, L->top, L->top-1); L->top++; lua_setfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); diff --git a/src/lib_jit.c b/src/lib_jit.c index 8fda41d0..a5829dc3 100644 --- a/src/lib_jit.c +++ b/src/lib_jit.c @@ -177,7 +177,7 @@ LJLIB_CF(jit_util_funcinfo) GCtab *t; lua_createtable(L, 0, 16); /* Increment hash size if fields are added. */ t = tabV(L->top-1); - setintfield(L, t, "linedefined", pt->linedefined); + setintfield(L, t, "linedefined", proto_line(pt, 0)); setintfield(L, t, "lastlinedefined", pt->lastlinedefined); setintfield(L, t, "stackslots", pt->framesize); setintfield(L, t, "params", pt->numparams); @@ -185,9 +185,9 @@ LJLIB_CF(jit_util_funcinfo) setintfield(L, t, "gcconsts", (int32_t)pt->sizekgc); setintfield(L, t, "nconsts", (int32_t)pt->sizekn); setintfield(L, t, "upvalues", (int32_t)pt->sizeuv); - if (pc-1 < pt->sizebc) + if (pc < pt->sizebc) setintfield(L, t, "currentline", - proto_lineinfo(pt) ? proto_line(pt, pc-1) : 0); + proto_lineinfo(pt) ? proto_line(pt, pc) : 0); lua_pushboolean(L, (pt->flags & PROTO_IS_VARARG)); lua_setfield(L, -2, "isvararg"); setstrV(L, L->top++, proto_chunkname(pt)); @@ -209,7 +209,7 @@ LJLIB_CF(jit_util_funcinfo) LJLIB_CF(jit_util_funcbc) { GCproto *pt = check_Lproto(L, 0); - BCPos pc = (BCPos)lj_lib_checkint(L, 2) - 1; + BCPos pc = (BCPos)lj_lib_checkint(L, 2); if (pc < pt->sizebc) { BCIns ins = proto_bc(pt)[pc]; BCOp op = bc_op(ins); diff --git a/src/lib_package.c b/src/lib_package.c index 7d0362a5..6d093500 100644 --- a/src/lib_package.c +++ b/src/lib_package.c @@ -482,14 +482,14 @@ LUALIB_API int luaopen_package(lua_State *L) { int i; luaL_newmetatable(L, "_LOADLIB"); - lua_pushcfunction(L, lj_cf_package_unloadlib); + lj_lib_pushcf(L, lj_cf_package_unloadlib, 1); lua_setfield(L, -2, "__gc"); luaL_register(L, LUA_LOADLIBNAME, package_lib); lua_pushvalue(L, -1); lua_replace(L, LUA_ENVIRONINDEX); lua_createtable(L, sizeof(package_loaders)/sizeof(package_loaders[0])-1, 0); for (i = 0; package_loaders[i] != NULL; i++) { - lua_pushcfunction(L, package_loaders[i]); + lj_lib_pushcf(L, package_loaders[i], 1); lua_rawseti(L, -2, i+1); } lua_setfield(L, -2, "loaders"); diff --git a/src/lib_string.c b/src/lib_string.c index b6a4864b..ab353c20 100644 --- a/src/lib_string.c +++ b/src/lib_string.c @@ -536,8 +536,7 @@ LJLIB_CF(string_gmatch) lj_lib_checkstr(L, 2); L->top = L->base+3; (L->top-1)->u64 = 0; - lua_pushcclosure(L, lj_cf_string_gmatch_aux, 3); - funcV(L->top-1)->c.ffid = FF_string_gmatch_aux; + lj_lib_pushcc(L, lj_cf_string_gmatch_aux, FF_string_gmatch_aux, 3); return 1; } diff --git a/src/lj_api.c b/src/lj_api.c index ad28bbf2..a19f0b33 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -18,6 +18,7 @@ #include "lj_udata.h" #include "lj_meta.h" #include "lj_state.h" +#include "lj_bc.h" #include "lj_frame.h" #include "lj_trace.h" #include "lj_vm.h" @@ -487,8 +488,8 @@ LUA_API lua_CFunction lua_tocfunction(lua_State *L, int idx) { cTValue *o = index2adr(L, idx); if (tvisfunc(o)) { - ASMFunction gate = funcV(o)->c.gate; - if (gate == lj_gate_c || gate == lj_gate_cwrap) + BCOp op = bc_op(*mref(funcV(o)->c.pc, BCIns)); + if (op == BC_FUNCC || op == BC_FUNCCW) return funcV(o)->c.f; } return NULL; diff --git a/src/lj_asm.c b/src/lj_asm.c index 3a2fee71..55bc814e 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -906,7 +906,7 @@ static MCode *asm_exitstub_gen(ASMState *as, ExitNo group) *mxp++ = MODRM(XM_OFS8, 0, RID_ESP); *mxp++ = MODRM(XM_SCALE1, RID_ESP, RID_ESP); *mxp++ = 2*sizeof(void *); - *(int32_t *)mxp = ptr2addr(GG2DISP(J2GG(as->J))); mxp += 4; + *(int32_t *)mxp = ptr2addr(J2GG(as->J)->dispatch); mxp += 4; /* Jump to exit handler which fills in the ExitState. */ *mxp++ = XI_JMP; mxp += 4; *((int32_t *)(mxp-4)) = (int32_t)((MCode *)lj_vm_exit_handler - mxp); @@ -3066,7 +3066,7 @@ static void asm_tail_sync(ASMState *as) if (as->T->link == TRACE_INTERP) { /* Setup fixed registers for exit to interpreter. */ - emit_loada(as, RID_DISPATCH, GG2DISP(J2GG(as->J))); + emit_loada(as, RID_DISPATCH, J2GG(as->J)->dispatch); emit_loadi(as, RID_PC, (int32_t)map[nent]); } else if (newbase) { /* Save modified BASE for linking to trace with higher start frame. */ diff --git a/src/lj_bc.c b/src/lj_bc.c index 58e97b30..2519807c 100644 --- a/src/lj_bc.c +++ b/src/lj_bc.c @@ -9,11 +9,6 @@ #include "lj_obj.h" #include "lj_bc.h" -/* Bytecode instruction modes. */ -LJ_DATADEF const uint16_t lj_bc_mode[BC__MAX+1] = { -BCDEF(BCMODE) - 0 -}; - +/* Bytecode offsets and bytecode instruction modes. */ #include "lj_bcdef.h" diff --git a/src/lj_bc.h b/src/lj_bc.h index 83e2dea3..e1284916 100644 --- a/src/lj_bc.h +++ b/src/lj_bc.h @@ -178,7 +178,17 @@ _(ILOOP, rbase, ___, jump, ___) \ _(JLOOP, rbase, ___, lit, ___) \ \ - _(JMP, rbase, ___, jump, ___) + _(JMP, rbase, ___, jump, ___) \ + \ + /* Function headers. I/J = interp/JIT, F/V/C = fixarg/vararg/C func. */ \ + _(FUNCF, rbase, ___, ___, ___) \ + _(IFUNCF, rbase, ___, ___, ___) \ + _(JFUNCF, rbase, ___, lit, ___) \ + _(FUNCV, rbase, ___, ___, ___) \ + _(IFUNCV, rbase, ___, ___, ___) \ + _(JFUNCV, rbase, ___, lit, ___) \ + _(FUNCC, ___, ___, ___, ___) \ + _(FUNCCW, ___, ___, ___, ___) /* Bytecode opcode numbers. */ typedef enum { @@ -206,6 +216,10 @@ LJ_STATIC_ASSERT((int)BC_ITERL + 1 == (int)BC_IITERL); LJ_STATIC_ASSERT((int)BC_ITERL + 2 == (int)BC_JITERL); LJ_STATIC_ASSERT((int)BC_LOOP + 1 == (int)BC_ILOOP); LJ_STATIC_ASSERT((int)BC_LOOP + 2 == (int)BC_JLOOP); +LJ_STATIC_ASSERT((int)BC_FUNCF + 1 == (int)BC_IFUNCF); +LJ_STATIC_ASSERT((int)BC_FUNCF + 2 == (int)BC_JFUNCF); +LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV); +LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV); /* Stack slots used by FORI/FORL, relative to operand A. */ enum { @@ -229,8 +243,9 @@ typedef enum { #define BCMODE(name, ma, mb, mc, mm) \ (BCM##ma|(BCM##mb<<3)|(BCM##mc<<7)|(MM_##mm<<11)), +#define BCMODE_FF 0 -LJ_DATA const uint16_t lj_bc_mode[BC__MAX+1]; -LJ_DATA const uint16_t lj_bc_ofs[BC__MAX+1]; +LJ_DATA const uint16_t lj_bc_mode[]; +LJ_DATA const uint16_t lj_bc_ofs[]; #endif diff --git a/src/lj_def.h b/src/lj_def.h index 64b08f7b..83b1935c 100644 --- a/src/lj_def.h +++ b/src/lj_def.h @@ -193,18 +193,14 @@ static LJ_AINLINE uint32_t lj_fls(uint32_t x) #endif /* Attributes for internal functions. */ -#if defined(ljamalg_c) -#define LJ_DATA static -#define LJ_DATADEF static -#define LJ_FUNC static -#define LJ_ASMF LJ_NOAPI -#define LJ_FUNCA LJ_NOAPI -#else #define LJ_DATA LJ_NOAPI #define LJ_DATADEF -#define LJ_FUNC LJ_NOAPI #define LJ_ASMF LJ_NOAPI #define LJ_FUNCA LJ_NOAPI +#if defined(ljamalg_c) +#define LJ_FUNC static +#else +#define LJ_FUNC LJ_NOAPI #endif #define LJ_FUNC_NORET LJ_FUNC LJ_NORET #define LJ_FUNCA_NORET LJ_FUNCA LJ_NORET diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index 54cc9006..72211dca 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c @@ -11,6 +11,7 @@ #include "lj_state.h" #include "lj_frame.h" #include "lj_bc.h" +#include "lj_ff.h" #if LJ_HASJIT #include "lj_jit.h" #endif @@ -19,7 +20,8 @@ #include "lj_vm.h" #include "luajit.h" -#define GG_DISP_STATIC BC__MAX +/* Bump GG_NUM_ASMFF in lj_dispatch.h as needed. Ugly. */ +LJ_STATIC_ASSERT(GG_NUM_ASMFF == FF_NUM_ASMFUNC); /* -- Dispatch table management ------------------------------------------- */ @@ -27,13 +29,20 @@ void lj_dispatch_init(GG_State *GG) { uint32_t i; - ASMFunction *disp = GG2DISP(GG); - for (i = 0; i < BC__MAX; i++) - disp[GG_DISP_STATIC+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]); + ASMFunction *disp = GG->dispatch; + for (i = 0; i < GG_LEN_SDISP; i++) + disp[GG_LEN_DDISP+i] = disp[i] = makeasmfunc(lj_bc_ofs[i]); + for (i = GG_LEN_SDISP; i < GG_LEN_DDISP; i++) + disp[i] = makeasmfunc(lj_bc_ofs[i]); /* The JIT engine is off by default. luaopen_jit() turns it on. */ disp[BC_FORL] = disp[BC_IFORL]; disp[BC_ITERL] = disp[BC_IITERL]; disp[BC_LOOP] = disp[BC_ILOOP]; + disp[BC_FUNCF] = disp[BC_IFUNCF]; + disp[BC_FUNCV] = disp[BC_IFUNCV]; + GG->g.bc_cfunc_ext = GG->g.bc_cfunc_int = BCINS_AD(BC_FUNCC, 0, 0); + for (i = 0; i < GG_NUM_ASMFF; i++) + GG->bcff[i] = BCINS_AD(BC__MAX+i, 0, 0); } #if LJ_HASJIT @@ -57,39 +66,50 @@ void lj_dispatch_update(global_State *g) mode |= (G2J(g)->flags & JIT_F_ON) ? 1 : 0; mode |= G2J(g)->state != LJ_TRACE_IDLE ? 6 : 0; #endif - mode |= (g->hookmask & HOOK_EVENTMASK) ? 2 : 0; + mode |= (g->hookmask & (LUA_MASKLINE|LUA_MASKCOUNT)) ? 2 : 0; if (oldmode != mode) { /* Mode changed? */ - ASMFunction *disp = GG2DISP(G2GG(g)); - ASMFunction f_forl, f_iterl, f_loop; + ASMFunction *disp = G2GG(g)->dispatch; + ASMFunction f_forl, f_iterl, f_loop, f_funcf, f_funcv; g->dispatchmode = mode; if ((mode & 5) == 1) { /* Hotcount if JIT is on, but not when recording. */ f_forl = makeasmfunc(lj_bc_ofs[BC_FORL]); f_iterl = makeasmfunc(lj_bc_ofs[BC_ITERL]); f_loop = makeasmfunc(lj_bc_ofs[BC_LOOP]); + f_funcf = makeasmfunc(lj_bc_ofs[BC_FUNCF]); + f_funcv = makeasmfunc(lj_bc_ofs[BC_FUNCV]); } else { /* Otherwise use the non-hotcounting instructions. */ - f_forl = disp[GG_DISP_STATIC+BC_IFORL]; - f_iterl = disp[GG_DISP_STATIC+BC_IITERL]; - f_loop = disp[GG_DISP_STATIC+BC_ILOOP]; + f_forl = disp[GG_LEN_DDISP+BC_IFORL]; + f_iterl = disp[GG_LEN_DDISP+BC_IITERL]; + f_loop = disp[GG_LEN_DDISP+BC_ILOOP]; + f_funcf = disp[GG_LEN_DDISP+BC_IFUNCF]; + f_funcv = disp[GG_LEN_DDISP+BC_IFUNCV]; } - /* Set static loop ins first (may be copied below). */ - disp[GG_DISP_STATIC+BC_FORL] = f_forl; - disp[GG_DISP_STATIC+BC_ITERL] = f_iterl; - disp[GG_DISP_STATIC+BC_LOOP] = f_loop; + /* Set static counting ins first (may be copied below). */ + disp[GG_LEN_DDISP+BC_FORL] = f_forl; + disp[GG_LEN_DDISP+BC_ITERL] = f_iterl; + disp[GG_LEN_DDISP+BC_LOOP] = f_loop; + disp[GG_LEN_DDISP+BC_FUNCF] = f_funcf; + disp[GG_LEN_DDISP+BC_FUNCV] = f_funcv; if ((oldmode & 6) != (mode & 6)) { /* Need to change whole table? */ if ((mode & 6) == 0) { /* No hooks and no recording? */ /* Copy static dispatch table to dynamic dispatch table. */ - memcpy(&disp[0], &disp[GG_DISP_STATIC], sizeof(ASMFunction)*BC__MAX); + memcpy(&disp[0], &disp[GG_LEN_DDISP], GG_LEN_SDISP*sizeof(ASMFunction)); } else { /* The recording dispatch also checks for hooks. */ ASMFunction f = (mode & 6) == 6 ? lj_vm_record : lj_vm_hook; uint32_t i; - for (i = 0; i < BC__MAX; i++) + for (i = 0; i < BC_FUNCF; i++) disp[i] = f; + /* NYI: call hooks for function headers. */ + memcpy(&disp[BC_FUNCF], &disp[GG_LEN_DDISP+BC_FUNCF], + (GG_LEN_SDISP-BC_FUNCF)*sizeof(ASMFunction)); } - } else if ((mode & 6) == 0) { /* Fix dynamic loop ins unless overriden. */ + } else if ((mode & 6) == 0) { /* Set dynamic counting ins. */ disp[BC_FORL] = f_forl; disp[BC_ITERL] = f_iterl; disp[BC_LOOP] = f_loop; + disp[BC_FUNCF] = f_funcf; + disp[BC_FUNCV] = f_funcv; } #if LJ_HASJIT if ((mode & 1) && !(oldmode & 1)) /* JIT off to on transition. */ @@ -186,14 +206,16 @@ int luaJIT_setmode(lua_State *L, int idx, int mode) if ((mode & LUAJIT_MODE_ON)) { if (idx != 0) { cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx; - if (tvislightud(tv) && lightudV(tv) != NULL) + if (tvislightud(tv)) g->wrapf = (lua_CFunction)lightudV(tv); else return 0; /* Failed. */ + } else { + return 0; /* Failed. */ } - g->wrapmode = 1; + g->bc_cfunc_ext = BCINS_AD(BC_FUNCCW, 0, 0); } else { - g->wrapmode = 0; + g->bc_cfunc_ext = BCINS_AD(BC_FUNCC, 0, 0); } break; default: diff --git a/src/lj_dispatch.h b/src/lj_dispatch.h index bbbfa0be..865ee790 100644 --- a/src/lj_dispatch.h +++ b/src/lj_dispatch.h @@ -7,6 +7,7 @@ #define _LJ_DISPATCH_H #include "lj_obj.h" +#include "lj_bc.h" #if LJ_HASJIT #include "lj_jit.h" #endif @@ -21,6 +22,13 @@ typedef uint16_t HotCount; #define HOTCOUNT_MIN_PENALTY 103 #define HOTCOUNT_MAX_PENALTY 60000 +/* This solves a circular dependency problem -- bump as needed. Sigh. */ +#define GG_NUM_ASMFF 62 + +#define GG_LEN_DDISP (BC__MAX + GG_NUM_ASMFF) +#define GG_LEN_SDISP BC_FUNCC +#define GG_LEN_DISP (GG_LEN_DDISP + GG_LEN_SDISP) + /* Global state, main thread and extra fields are allocated together. */ typedef struct GG_State { lua_State L; /* Main thread. */ @@ -29,22 +37,22 @@ typedef struct GG_State { jit_State J; /* JIT state. */ HotCount hotcount[HOTCOUNT_SIZE]; /* Hot counters. */ #endif - /* Instruction dispatch tables follow. */ + ASMFunction dispatch[GG_LEN_DISP]; /* Instruction dispatch tables. */ + BCIns bcff[GG_NUM_ASMFF]; /* Bytecode for ASM fast functions. */ } GG_State; #define GG_OFS(field) ((int)offsetof(GG_State, field)) -#define GG_OFS_DISP ((int)sizeof(GG_State)) -#define GG2DISP(gg) ((ASMFunction *)((char *)(gg) + GG_OFS_DISP)) #define G2GG(gl) ((GG_State *)((char *)(gl) - GG_OFS(g))) #define J2GG(j) ((GG_State *)((char *)(j) - GG_OFS(J))) #define L2GG(L) (G2GG(G(L))) #define J2G(J) (&J2GG(J)->g) #define G2J(gl) (&G2GG(gl)->J) #define L2J(L) (&L2GG(L)->J) -#define GG_G2DISP (GG_OFS_DISP - GG_OFS(g)) -#define GG_DISP2G (GG_OFS(g) - GG_OFS_DISP) -#define GG_DISP2J (GG_OFS(J) - GG_OFS_DISP) -#define GG_DISP2HOT (GG_OFS(hotcount) - GG_OFS_DISP) +#define GG_G2DISP (GG_OFS(dispatch) - GG_OFS(g)) +#define GG_DISP2G (GG_OFS(g) - GG_OFS(dispatch)) +#define GG_DISP2J (GG_OFS(J) - GG_OFS(dispatch)) +#define GG_DISP2HOT (GG_OFS(hotcount) - GG_OFS(dispatch)) +#define GG_DISP2STATIC (GG_LEN_DDISP*(int)sizeof(ASMFunction)) #define hotcount_get(gg, pc) \ (gg)->hotcount[(u32ptr(pc)>>2) & (HOTCOUNT_SIZE-1)] diff --git a/src/lj_err.c b/src/lj_err.c index 2b021d28..fdc06001 100644 --- a/src/lj_err.c +++ b/src/lj_err.c @@ -152,7 +152,7 @@ static const char *getobjname(GCproto *pt, const BCIns *ip, BCReg slot, restart: lname = getvarname(pt, proto_bcpos(pt, ip), slot); if (lname != NULL) { *name = lname; return "local"; } - while (--ip >= proto_bc(pt)) { + while (--ip > proto_bc(pt)) { BCIns ins = *ip; BCOp op = bc_op(ins); BCReg ra = bc_a(ins); @@ -222,11 +222,7 @@ void lj_err_pushloc(lua_State *L, GCproto *pt, BCPos pc) if (name) { const char *s = strdata(name); MSize i, len = name->len; - BCLine line; - if (pc) - line = proto_line(pt, pc-1); - else - line = pt->linedefined; + BCLine line = pc < pt->sizebc ? proto_line(pt, pc) : 0; if (*s == '@') { s++; len--; for (i = len; i > 0; i--) @@ -345,9 +341,10 @@ LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar) switch (*what) { case 'S': if (isluafunc(fn)) { - ar->source = strdata(proto_chunkname(funcproto(fn))); - ar->linedefined = cast_int(funcproto(fn)->linedefined); - ar->lastlinedefined = cast_int(funcproto(fn)->lastlinedefined); + GCproto *pt = funcproto(fn); + ar->source = strdata(proto_chunkname(pt)); + ar->linedefined = (int)proto_line(pt, 0); + ar->lastlinedefined = (int)pt->lastlinedefined; ar->what = (ar->linedefined == 0) ? "main" : "Lua"; } else { ar->source = "=[C]"; @@ -380,7 +377,7 @@ LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar) GCproto *pt = funcproto(fn); BCLine *lineinfo = proto_lineinfo(pt); MSize i, szl = pt->sizebc; - for (i = 0; i < szl; i++) + for (i = 1; i < szl; i++) setboolV(lj_tab_setint(L, t, lineinfo[i]), 1); settabV(L, L->top, t); } else { diff --git a/src/lj_func.c b/src/lj_func.c index 7d130176..3766b25e 100644 --- a/src/lj_func.c +++ b/src/lj_func.c @@ -101,8 +101,8 @@ GCfunc *lj_func_newC(lua_State *L, MSize nelems, GCtab *env) fn->c.ffid = FF_C; fn->c.nupvalues = cast_byte(nelems); /* NOBARRIER: The GCfunc is new (marked white). */ + setmref(fn->c.pc, &G(L)->bc_cfunc_ext); setgcref(fn->c.env, obj2gco(env)); - fn->c.gate = G(L)->wrapmode ? lj_gate_cwrap : lj_gate_c; return fn; } @@ -115,7 +115,6 @@ GCfunc *lj_func_newL(lua_State *L, GCproto *pt, GCtab *env) /* NOBARRIER: Really a setgcref. But the GCfunc is new (marked white). */ setmref(fn->l.pc, proto_bc(pt)); setgcref(fn->l.env, obj2gco(env)); - fn->l.gate = (pt->flags & PROTO_IS_VARARG) ? lj_gate_lv : lj_gate_lf; return fn; } diff --git a/src/lj_gdbjit.c b/src/lj_gdbjit.c index 3a4d5da1..f71b3081 100644 --- a/src/lj_gdbjit.c +++ b/src/lj_gdbjit.c @@ -705,10 +705,7 @@ void lj_gdbjit_addtrace(jit_State *J, Trace *T, TraceNo traceno) ctx.szmcode = T->szmcode; ctx.spadjp = CFRAME_SIZE + (MSize)(parent ? J->trace[parent]->spadjust : 0); ctx.spadj = CFRAME_SIZE + T->spadjust; - if (startpc >= proto_bc(pt)) - ctx.lineno = proto_line(pt,proto_bcpos(pt,startpc)); - else - ctx.lineno = pt->linedefined; + ctx.lineno = proto_line(pt, proto_bcpos(pt, startpc)); ctx.filename = strdata(proto_chunkname(pt)); if (*ctx.filename == '@' || *ctx.filename == '=') ctx.filename++; diff --git a/src/lj_lib.c b/src/lj_lib.c index de1c8646..0ba0ecb1 100644 --- a/src/lj_lib.c +++ b/src/lj_lib.c @@ -14,6 +14,8 @@ #include "lj_str.h" #include "lj_tab.h" #include "lj_func.h" +#include "lj_bc.h" +#include "lj_dispatch.h" #include "lj_vm.h" #include "lj_lib.h" @@ -46,6 +48,7 @@ void lj_lib_register(lua_State *L, const char *libname, GCtab *env = tabref(L->env); GCfunc *ofn = NULL; int ffid = *p++; + BCIns *bcff = &L2GG(L)->bcff[*p++]; GCtab *tab = lib_create_table(L, libname, *p++); ptrdiff_t tpos = L->top - L->base; @@ -68,10 +71,10 @@ void lj_lib_register(lua_State *L, const char *libname, fn->c.ffid = (uint8_t)(ffid++); name = (const char *)p; p += len; - if (tag != LIBINIT_CF) { - fn->c.gate = makeasmfunc(p[0] + (p[1] << 8)); - p += 2; - } + if (tag == LIBINIT_CF) + setmref(fn->c.pc, &G(L)->bc_cfunc_int); + else + setmref(fn->c.pc, bcff++); if (tag == LIBINIT_ASM_) fn->c.f = ofn->c.f; /* Copy handler from previous function. */ else diff --git a/src/lj_lib.h b/src/lj_lib.h index 44be96b9..fd2b025c 100644 --- a/src/lj_lib.h +++ b/src/lj_lib.h @@ -57,6 +57,19 @@ LJ_FUNC int lj_lib_checkopt(lua_State *L, int narg, int def, const char *lst); #define lj_lib_checkfpu(L) UNUSED(L) #endif +/* Push internal function on the stack. */ +static LJ_AINLINE void lj_lib_pushcc(lua_State *L, lua_CFunction f, + int id, int n) +{ + GCfunc *fn; + lua_pushcclosure(L, f, n); + fn = funcV(L->top-1); + fn->c.ffid = (uint8_t)id; + setmref(fn->c.pc, &G(L)->bc_cfunc_int); +} + +#define lj_lib_pushcf(L, fn, id) (lj_lib_pushcc(L, (fn), (id), 0)) + /* Library function declarations. Scanned by buildvm. */ #define LJLIB_CF(name) static int lj_cf_##name(lua_State *L) #define LJLIB_ASM(name) static int lj_ffh_##name(lua_State *L) diff --git a/src/lj_obj.h b/src/lj_obj.h index a6637954..d463cb2c 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -360,7 +360,6 @@ typedef struct GCproto { uint16_t trace; /* Anchor for chain of root traces. */ /* ------ The following fields are for debugging/tracebacks only ------ */ GCRef chunkname; /* Name of the chunk this function was defined in. */ - BCLine linedefined; /* First line of the function definition. */ BCLine lastlinedefined; /* Last line of the function definition. */ MSize sizevarinfo; /* Size of local var info array. */ MRef varinfo; /* Names and extents of local variables. */ @@ -419,7 +418,7 @@ typedef struct GCupval { /* Common header for functions. env should be at same offset in GCudata. */ #define GCfuncHeader \ GCHeader; uint8_t ffid; uint8_t nupvalues; \ - GCRef env; GCRef gclist; ASMFunction gate + GCRef env; GCRef gclist; MRef pc typedef struct GCfuncC { GCfuncHeader; @@ -429,7 +428,6 @@ typedef struct GCfuncC { typedef struct GCfuncL { GCfuncHeader; - MRef pc; /* Start PC (and GCproto reference). */ GCRef uvptr[1]; /* Array of _pointers_ to upvalue objects (GCupval). */ } GCfuncL; @@ -558,7 +556,7 @@ typedef struct global_State { uint8_t hookmask; /* Hook mask. */ uint8_t dispatchmode; /* Dispatch mode. */ uint8_t vmevmask; /* VM event mask. */ - uint8_t wrapmode; /* Wrap mode. */ + uint8_t unused1; GCRef mainthref; /* Link to main thread. */ TValue registrytv; /* Anchor for registry. */ TValue tmptv; /* Temporary TValue. */ @@ -569,6 +567,8 @@ typedef struct global_State { lua_CFunction wrapf; /* Wrapper for C function calls. */ lua_CFunction panic; /* Called as a last resort for errors. */ volatile int32_t vmstate; /* VM state or current JIT code trace number. */ + BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */ + BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */ GCRef jit_L; /* Current JIT code lua_State or NULL. */ MRef jit_base; /* Current JIT code L->base. */ GCRef gcroot[GCROOT__MAX]; /* GC roots. */ @@ -584,6 +584,7 @@ typedef struct global_State { /* Hook management. Hook event masks are defined in lua.h. */ #define HOOK_EVENTMASK 0x0f #define HOOK_ACTIVE 0x10 +#define HOOK_ACTIVE_SHIFT 4 #define HOOK_VMEVENT 0x20 #define HOOK_GC 0x40 #define hook_active(g) ((g)->hookmask & HOOK_ACTIVE) diff --git a/src/lj_parse.c b/src/lj_parse.c index acc25519..3bef225a 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -1036,7 +1036,10 @@ static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, BCLine *lineinfo) setmref(pt->lineinfo, lineinfo); pt->sizebc = n; bc[n] = ~0u; /* Close potentially uninitialized gap between bc and kgc. */ - for (i = 0; i < n; i++) { + bc[0] = BCINS_AD((fs->flags & PROTO_IS_VARARG) ? BC_FUNCV : BC_FUNCF, + fs->framesize, 0); + lineinfo[0] = fs->linedefined; + for (i = 1; i < n; i++) { bc[i] = base[i].ins; lineinfo[i] = base[i].line; } @@ -1181,7 +1184,6 @@ static GCproto *fs_finish(LexState *ls, BCLine line) pt->flags = fs->flags; pt->numparams = fs->numparams; pt->framesize = fs->framesize; - pt->linedefined = fs->linedefined; pt->lastlinedefined = line; fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), @@ -1416,29 +1418,30 @@ static void parse_chunk(LexState *ls); /* Parse body of a function. */ static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line) { - FuncState cfs, *fs = ls->fs; + FuncState fs, *pfs = ls->fs; BCReg kidx; BCLine lastline; GCproto *pt; - ptrdiff_t oldbase = fs->bcbase - ls->bcstack; - fs_init(ls, &cfs); - cfs.linedefined = line; - cfs.numparams = (uint8_t)parse_params(ls, needself); - cfs.bcbase = fs->bcbase + fs->pc; - cfs.bclim = fs->bclim - fs->pc; + ptrdiff_t oldbase = pfs->bcbase - ls->bcstack; + fs_init(ls, &fs); + fs.linedefined = line; + fs.numparams = (uint8_t)parse_params(ls, needself); + fs.bcbase = pfs->bcbase + pfs->pc; + fs.bclim = pfs->bclim - pfs->pc; + bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */ parse_chunk(ls); lastline = ls->linenumber; lex_match(ls, TK_end, TK_function, line); pt = fs_finish(ls, lastline); - fs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */ - fs->bclim = (BCPos)(ls->sizebcstack - oldbase); + pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */ + pfs->bclim = (BCPos)(ls->sizebcstack - oldbase); /* Store new prototype in the constant array of the parent. */ - kidx = const_gc(fs, obj2gco(pt), LJ_TPROTO); - expr_init(e, VRELOCABLE, bcemit_AD(fs, BC_FNEW, 0, kidx)); - if (!(fs->flags & PROTO_HAS_FNEW)) { - if (fs->flags & PROTO_HAS_RETURN) - fs->flags |= PROTO_FIXUP_RETURN; - fs->flags |= PROTO_HAS_FNEW; + kidx = const_gc(pfs, obj2gco(pt), LJ_TPROTO); + expr_init(e, VRELOCABLE, bcemit_AD(pfs, BC_FNEW, 0, kidx)); + if (!(pfs->flags & PROTO_HAS_FNEW)) { + if (pfs->flags & PROTO_HAS_RETURN) + pfs->flags |= PROTO_FIXUP_RETURN; + pfs->flags |= PROTO_HAS_FNEW; } } @@ -2227,6 +2230,7 @@ GCproto *lj_parse(LexState *ls) fs.bcbase = NULL; fs.bclim = 0; fs.flags |= PROTO_IS_VARARG; /* Main chunk is always a vararg func. */ + bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */ lj_lex_next(ls); /* Read-ahead first token. */ parse_chunk(ls); if (ls->token != TK_eof) diff --git a/src/lj_record.c b/src/lj_record.c index 49e3d3b5..2709ea01 100644 --- a/src/lj_record.c +++ b/src/lj_record.c @@ -1671,14 +1671,8 @@ static int rec_call(jit_State *J, BCReg func, ptrdiff_t cres, ptrdiff_t nargs) GCproto *pt = funcproto(rd.fn); if ((pt->flags & PROTO_NO_JIT)) lj_trace_err(J, LJ_TRERR_CJITOFF); - if ((pt->flags & PROTO_IS_VARARG)) { - if (rd.fn->l.gate != lj_gate_lv) - lj_trace_err(J, LJ_TRERR_NYILNKF); + if ((pt->flags & PROTO_IS_VARARG)) lj_trace_err(J, LJ_TRERR_NYIVF); - } else { - if (rd.fn->l.gate != lj_gate_lf) - lj_trace_err(J, LJ_TRERR_NYILNKF); - } if (cres == CALLRES_TAILCALL) { ptrdiff_t i; /* Tailcalls can form a loop, so count towards the loop unroll limit. */ diff --git a/src/lj_state.c b/src/lj_state.c index 69f182ed..8f8be97b 100644 --- a/src/lj_state.c +++ b/src/lj_state.c @@ -37,8 +37,8 @@ ** Calls to metamethods store their arguments beyond the current top ** without checking for the stack limit. This avoids stack resizes which ** would invalidate passed TValue pointers. The stack check is performed -** later by the call gate. This can safely resize the stack or raise an -** error. Thus we need some extra slots beyond the current stack limit. +** later by the function header. This can safely resize the stack or raise +** an error. Thus we need some extra slots beyond the current stack limit. ** ** Most metamethods need 4 slots above top (cont, mobj, arg1, arg2) plus ** one extra slot if mobj is not a function. Only lj_meta_tset needs 5 @@ -119,8 +119,6 @@ static void stack_init(lua_State *L1, lua_State *L) /* -- State handling ------------------------------------------------------ */ -#define GG_SIZE (sizeof(GG_State)+(BC__MAX*2)*sizeof(ASMFunction)) - /* Open parts that may cause memory-allocation errors. */ static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud) { @@ -156,8 +154,8 @@ static void close_state(lua_State *L) lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef); lj_str_freebuf(g, &g->tmpbuf); lj_mem_freevec(g, L->stack, L->stacksize, TValue); - lua_assert(g->gc.total == GG_SIZE); - g->allocf(g->allocd, G2GG(g), GG_SIZE, 0); + lua_assert(g->gc.total == sizeof(GG_State)); + g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0); } } @@ -167,7 +165,7 @@ lua_State *lj_state_newstate(lua_Alloc f, void *ud) LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) #endif { - GG_State *GG = cast(GG_State *, f(ud, NULL, 0, GG_SIZE)); + GG_State *GG = cast(GG_State *, f(ud, NULL, 0, sizeof(GG_State))); lua_State *L = &GG->L; global_State *g = &GG->g; if (GG == NULL || !checkptr32(GG)) return NULL; @@ -190,7 +188,7 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) g->gc.state = GCSpause; setgcref(g->gc.root, obj2gco(L)); g->gc.sweep = &g->gc.root; - g->gc.total = GG_SIZE; + g->gc.total = sizeof(GG_State); g->gc.pause = LUAI_GCPAUSE; g->gc.stepmul = LUAI_GCMUL; lj_dispatch_init((GG_State *)L); diff --git a/src/lj_trace.c b/src/lj_trace.c index 0bd32b1e..0a973d51 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -361,7 +361,7 @@ static void trace_start(jit_State *J) setstrV(L, L->top++, lj_str_newlit(L, "start")); setintV(L->top++, J->curtrace); setfuncV(L, L->top++, J->fn); - setintV(L->top++, proto_bcpos(J->pt, J->pc) + 1); + setintV(L->top++, proto_bcpos(J->pt, J->pc)); if (J->parent) { setintV(L->top++, J->parent); setintV(L->top++, J->exitno); @@ -444,7 +444,7 @@ static int trace_abort(jit_State *J) setstrV(L, L->top++, lj_str_newlit(L, "abort")); setintV(L->top++, J->curtrace); setfuncV(L, L->top++, J->fn); - setintV(L->top++, proto_bcpos(J->pt, J->pc) + 1); + setintV(L->top++, proto_bcpos(J->pt, J->pc)); copyTV(L, L->top++, restorestack(L, errobj)); copyTV(L, L->top++, &J->errinfo); ); @@ -478,7 +478,7 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud) lj_vmevent_send(L, RECORD, setintV(L->top++, J->curtrace); setfuncV(L, L->top++, J->fn); - setintV(L->top++, proto_bcpos(J->pt, J->pc) + 1); + setintV(L->top++, proto_bcpos(J->pt, J->pc)); setintV(L->top++, J->framedepth); if (bcmode_mm(bc_op(*J->pc)) == MM_call) { cTValue *o = &L->base[bc_a(*J->pc)]; @@ -555,8 +555,6 @@ void LJ_FASTCALL lj_trace_hot(jit_State *J, const BCIns *pc) /* Only start a new trace if not recording or inside __gc call or vmevent. */ if (J->state == LJ_TRACE_IDLE && !(J2G(J)->hookmask & (HOOK_GC|HOOK_VMEVENT))) { - lua_State *L = J->L; - L->top = curr_topL(L); /* Only called from Lua and NRESULTS is not used. */ J->parent = 0; /* Root trace. */ J->exitno = 0; J->pc = pc-1; /* The interpreter bytecode PC is offset by 1. */ diff --git a/src/lj_vm.h b/src/lj_vm.h index b25f182a..46312bb8 100644 --- a/src/lj_vm.h +++ b/src/lj_vm.h @@ -44,12 +44,6 @@ LJ_ASMF void lj_vm_exp2(void); LJ_ASMF void lj_vm_pow_sse(void); LJ_ASMF void lj_vm_powi_sse(void); -/* Call gates for functions. */ -LJ_ASMF void lj_gate_lf(void); -LJ_ASMF void lj_gate_lv(void); -LJ_ASMF void lj_gate_c(void); -LJ_ASMF void lj_gate_cwrap(void); - /* Continuations for metamethods. */ LJ_ASMF void lj_cont_cat(void); /* Continue with concatenation. */ LJ_ASMF void lj_cont_ra(void); /* Store result in RA from instruction. */ diff --git a/src/msvcbuild.bat b/src/msvcbuild.bat index 200f4cc9..db323dce 100644 --- a/src/msvcbuild.bat +++ b/src/msvcbuild.bat @@ -32,7 +32,7 @@ if exist buildvm.exe.manifest^ %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe buildvm -m peobj -o lj_vm.obj -buildvm -m bcdef -o lj_bcdef.h +buildvm -m bcdef -o lj_bcdef.h %ALL_LIB% buildvm -m ffdef -o lj_ffdef.h %ALL_LIB% buildvm -m libdef -o lj_libdef.h %ALL_LIB% buildvm -m recdef -o lj_recdef.h %ALL_LIB%